开始/绑定服务生命周期。为什么要重新创建

时间:2013-08-16 20:53:22

标签: android service android-service lifecycle

在我的应用程序中,我有一个粘性服务,它是通过我的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;
}

1 个答案:

答案 0 :(得分:2)

如果您希望将应用连接到服务集的一个实例

android:singleUser="true"

在AndroidManifest.xml中的服务描述中。如果设置为true,则此标志表示将为所有用户运行此组件的单个实例。

此外,您可能会发现在您的情况下使用

非常有用
android:stopWithTask="false"

这意味着即使您的应用中的任务被销毁,您的服务也会保持有效状态。