gpt4 book ai didi

Android 服务已经泄漏,即使它(据说)没有运行

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:50 25 4
gpt4 key购买 nike

onDestroy() 中,我使用下面的代码检查服务是否仍在运行。如果是 - 我解除绑定(bind)并停止它。

public boolean isServiceRunning(Class<?> serviceClass) {
String serviceClassName = serviceClass.getName();
final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

for(RunningServiceInfo runningServiceInfo : services){
if(runningServiceInfo.service.getClassName().equals(serviceClassName)){
return true;
}
}
return false;
}

现在我遇到了 isServiceRunning 返回 false 的情况,但是在 onDestroy() 之后我收到一条错误消息,指出 ServiceConnection 已泄漏。为什么会这样?

编辑:

这就是我启动 Service 的方式(在 onCreate() 中):

startService(posServiceIntent);
bindService(posServiceIntent, posConn, BIND_AUTO_CREATE);

posServiceIntent = new Intent(getApplicationContext(), PositionService.class);

private ServiceConnection posConn = new PosServiceConnection();
public class PosServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "PosServiceBinder connected [name: " + name.toShortString() + "].");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "PosServiceBinder disconnected [name: " + name.toShortString() + "].");
}
}

protected void onDestroy() {
if(isServiceRunning(PositionService.class)){
Log.d(TAG, "Stopping PositionService in " + MainActivity.class.getSimpleName() + ".onDestroy()");
unbindService(posConn);
stopService(posServiceIntent);
}

最佳答案

您需要在onDestroy() 中调用unbindService()。如果服务已绑定(bind)连接,则停止该服务不会使其停止。

在任何情况下,都会出现错误“ServiceConnection leaked”,因为您仍然有到服务的绑定(bind)连接。

编辑:添加额外观察

你写道:

"I check whether the service is still running using the code below. If it is - I unbind and stop it"

这不会阻止泄漏 ServiceConnection。即使您的服务不再运行,您也需要在 Activity 关闭时调用 unbindService()。确保将对 unbindService() 的调用放在 try/catch block 中,因为它可能会得到一个 IllegalArgumentException,您可以安全地忽略它(这意味着您没有连接到服务)。

关于Android 服务已经泄漏,即使它(据说)没有运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12069821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com