3

在我的应用程序中,我有一个粘性服务,它是通过我的 Application 子类的 onCreate() 中的 startService() 启动的。然后我绑定到该服务以与之交互。一切似乎都很好:我可以退出应用程序 (finish()) 或者我可以按 Home 键,当我回到应用程序时,我仍然可以重新连接到在后台运行的同一服务。

但是有一个用例让我感到困惑。如果我按 Home 键,然后启动其他一些应用程序,观看 YouTube 等,一段时间后我可以在日志中看到我的应用程序被重新创建(调用 onCreate()),这很好。但是,当我现在尝试绑定到同一个服务时,它也会重新创建(调用构造函数),并且我得到一个新实例,尽管我正在检查并且我确定我的旧服务仍在运行。这打破了用例,因为我需要在已经运行的服务中处理数据。

bindService() 不应该绑定到现有服务并且只在它没有运行时才创建它?为什么会导致创建新实例?一般来说,这个用例的流程在哪里描述(在后台重新创建应用程序)?

PS 另一个奇怪的是,旧服务的 onDestroy() 没有被调用。

这是我的应用程序类的一些代码,用于上下文:

@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;
}
4

1 回答 1

2

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

android:singleUser="true"

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

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

android:stopWithTask="false"

这意味着即使您的应用程序的任务被破坏,您的服务仍将保持活动状态。

于 2014-02-25T15:04:22.573 回答