gpt4 book ai didi

android - 启动/绑定(bind)服务生命周期。为什么要重新创建

转载 作者:太空狗 更新时间:2023-10-29 13:28:53 25 4
gpt4 key购买 nike

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

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

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

附言另一个奇怪的是没有调用旧服务的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;
}

最佳答案

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

android:singleUser="true"

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

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

android:stopWithTask="false"

这意味着即使您的应用程序的任务被销毁,您的服务仍将保持 Activity 状态。

关于android - 启动/绑定(bind)服务生命周期。为什么要重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281966/

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