在我的应用程序中,我有一个粘性服务,它是通过我的Application子类的onCreate()中的startService()启动的。然后我绑定到该服务以与其进行交互。一切似乎都没关系:我可以退出应用程序(完成())或者我可以按Home键,当我回到应用程序时,我仍然可以重新连接到在后台运行的相同服务。
但有一个用例令我感到困惑。如果我按Home键,然后启动一些其他应用程序,观看YouTube等,过了一段时间我可以在日志中看到我的应用程序被重新创建(onCreate()被调用),这很好。但是,当我尝试现在绑定到同一个服务时,它也会被重新创建(构造函数被调用),我得到一个新实例,虽然我正在检查,但我确定我的旧服务仍在运行。这打破了用例,因为我需要在已经运行的服务中处理数据。
是不是bindService()应该绑定到现有服务,只有在它没有运行时才创建它?为什么会导致创建新实例?一般来说,这个用例的流程在哪里(在后台重新创建应用程序)?
P.S。另一个奇怪的事情是没有调用旧服务的onDestroy()。
这是我的Application类的一些代码用于上下文:
@Override
public void onCreate(){
super.onCreate();
Intent intent = new Intent(getContext(), MyService.class);
if(!isMyServiceRunning()){
getContext().startService(intent);
}
getContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (MyService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
答案 0 :(得分:2)
如果您希望将应用连接到服务集的一个实例
android:singleUser="true"
在AndroidManifest.xml中的服务描述中。如果设置为true,则此标志表示将为所有用户运行此组件的单个实例。
此外,您可能会发现在您的情况下使用
非常有用android:stopWithTask="false"
这意味着即使您的应用中的任务被销毁,您的服务也会保持有效状态。