Android 当应用程序/活动被终止时,如何避免系统终止服务

Android 当应用程序/活动被终止时,如何避免系统终止服务,android,service,android-activity,system,kill-process,Android,Service,Android Activity,System,Kill Process,我有一个带有一个活动和一个服务的应用程序。如果在服务运行时杀死活动,它也会被杀死。这对我来说是非常重要的服务不被杀死。当系统终止时(或者我通过清除“最近的应用程序”列表终止它),如何使活动服务在完成其工作之前保持活动状态?提前谢谢 您可以尝试从您的服务中返回: @Override public int onStartCommand(Intent intent, int flags, int startId) { handleCommand(intent); // We want

我有一个带有一个
活动
和一个
服务
的应用程序。如果在
服务运行时杀死
活动
,它也会被杀死。这对我来说是非常重要的服务不被杀死。当系统终止时(或者我通过清除“最近的应用程序”列表终止它),如何使
活动
服务
在完成其工作之前保持活动状态?提前谢谢

您可以尝试从您的服务中返回:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handleCommand(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}
这对我来说是非常重要的,服务不被杀死

基于用户活动(最近的任务列表、第三方任务管理器、“设置中的强制停止”等)或操作系统需求(系统RAM越来越低),您的进程可以随时因任何原因被终止。你无法阻止这一切

您可以采取一些措施来最小化操作系统自行决定终止您的进程的可能性,例如在服务上使用
startForeground()
,但这会阻止用户对您的应用程序进程执行用户想要的操作

我正在显示该服务的一个窗口,因此如果该服务停止,那么该窗口将消失

如果用户通过最近的任务列表、任务管理器等明确删除你的应用程序,用户可能希望你的窗口消失。当然,欢迎你在文档中向用户建议这将产生的任何负面影响


还欢迎您尝试将该服务置于单独的流程中。我的理解是,这对安卓4.4上的最新任务列表没有帮助,尽管在早期版本的安卓上可能会有帮助。这是否有助于第三方任务管理器可能取决于管理器,而这不应该有助于“强制停止”设置。这还意味着您将不得不处理IPC、主进程和服务进程同时运行时增加的系统RAM消耗等问题。

您正在运行绑定服务吗?如果是这样,那么系统将在最后一个客户端活动断开连接(终止)时终止它。以下是来自以下网站的简介:

当最后一个客户端与服务解除绑定时,系统将销毁 服务(除非服务也是由startService()启动的)


你确定你没有破坏onDestroy中的服务或你活动代码中的某个地方吗?是的,我确定,因为我在日志中看到
服务正在运行,当我清除“最近的应用程序”列表时,
服务会立即停止,然后重新启动,因为我设置了
开始
标记。哦,我抓到你了,你问的是另一件事。但是,是的,我也确信这一点。我不会在
活动
的代码中手动销毁它。但是,另一方面,我的
活动
甚至没有一个重写的
onDestroy()
方法,因此可能在该方法中默认设置为终止所有相关服务?我已经这样做了,但这根本没有帮助,因为我需要
服务
不会停止。我正在显示一个来自该
服务的窗口,因此如果
服务停止,则该窗口将消失。重新创建窗口没有意义。我需要它保持在屏幕上,即使
活动
被终止,所以我需要保持
服务
在窗口关闭之前保持不变。你可以尝试
startForeground
。我认为这不会有帮助,因为我想避免当用户清除“最近的应用”列表时,
服务
被终止。系统没有。您的问题是否有可能与此问题有关?那么你肯定应该走
startForeground
。如文档中所述:
如果终止服务会对用户造成中断,则可以设置此标志
。看起来这就是你需要的。好的,我可以在另一个进程中启动服务吗?这样当用户杀死我的应用程序进程时,我的服务进程仍然保持不变?@Slaven:Hah,我刚刚添加了一个关于这个的更新--请看编辑后的答案。窗口有一个关闭按钮,用户可以通过按下它来摆脱这个窗口。这也会停止服务。但是,有没有一种方法可以让服务在用户杀死活动后保持活动状态?你能告诉我如何在单独的过程中启动服务吗?@Slaven:“但是有没有一种方法可以让服务在用户杀死活动后保持活动状态?”——这在我的回答中已经提到。“您能告诉我如何在一个单独的进程中启动服务吗?”--在清单中的
中添加一个
android:process
属性。不绑定服务,也不绑定系统。我希望在用户清除“最近的应用”列表并终止活动后,该服务保持活动状态。