2

我的应用程序有一个活动和一个服务在同一个进程中运行。当用户通过单击 STOP 按钮终止活动时,活动会导致服务终止。

从 Android 文档中,我了解到系统可以终止一个进程以回收资源:

“一旦您的活动停止,如果需要恢复系统内存,系统可能会销毁实例。在极端情况下,系统可能会简单地杀死您的应用程序进程而不调用活动的最终 onDestroy() 回调,......”

问题1:是否有可能我的活动被杀死而不是服务?我希望我的服务保持活力。

如果答案是“是”,那么

问题2:是否有机制可以通知服务活动已被杀死?

IBinder.linkToDeath具有我需要的功能,但似乎适用于流程,而不是活动。

我想到了一种间接方法,例如让活动获得信号量的所有权并让服务使用线程来等待它。然后,当活动被杀死时,它将释放信号量并且服务将获取它,并提供通知。但我想知道是否没有我可以使用的以 android 为中心的技术。

[开始编辑]

在阅读了您提供的非常有用的评论后,我想澄清一下我所呈现的场景。

我已经启动了两个组件:一个活动和一个服务。应用程序被配置为在活动停止并被销毁后服务可以继续运行。用户可以多次重新启动/启动活动,它将使用相同的服务实例。

通常活动会在 onDestroy() 期间通知服务它已被销毁。但是 onDestroy() 可能不会被调用。

我想知道是否有一些特定于 android 的机制可以用来通知服务该活动已被终止,而无需调用其 onDestroy() 方法。

[结束编辑]

谢谢你的帮助。

将要

4

2 回答 2

0

是的,服务和活动可以彼此独立运行。

为了实现您要执行的操作,我将在您的活动的 onStart() 函数(或您希望启动它的任何位置)中使用 startService() 显式启动您的服务,并在同一点绑定到它。没有显式 startService 的绑定将导致服务在您终止活动时停止(除非某些其他活动仍然绑定到它)。

在你的活动的 onStop() 调用你的服务上的一个函数来告诉它活动已经被杀死。

在您的活动中:

private ServiceRecordJourney yourService;
private ServiceConnection serviceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {

        YourServiceBinder binder = (YourServiceBinder) service;
        yourService= binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
    }
};

@Override
public void onStart(){
    super.onStart();

    startService(new Intent(this, YourService.class));

    // Bind to Service
    Intent intent= new Intent(this, YourService.class);
    bindService(intent, serviceConnection , Context.BIND_AUTO_CREATE);
}

@Override
public void onStop(){
    super.onStop();

    if(yourService != null){
                yourService.activityKilledFunction();
        unbindService(serviceConnection);
    }
}

您的服务需要在前台(并显示通知)以进一步阻止它被操作系统杀死。此外,由于它已显式启动,您将需要处理服务上的显式停止(在服务上调用 stopSelf() 或在上下文对象中调用 stopService()。

您可以使用具有不同意图的多个 startService() 调用来处理与服务的通信,但我更喜欢上述方法(并且我确信在这种情况下绑定是更可取的方法)。

此外,当服务运行时,每次用户启动或停止活动时,活动都会绑定和取消绑定到服务。

于 2013-07-20T16:41:07.987 回答
0

正如我之前所说,如果不调用 onDestroy(),单个活动不会被 android 杀死。如果 Android 需要更多内存,它会杀死整个进程(包括所有活动和服务)。是描述,文档对此有误。

服务也可以在其他进程中创建,但必须在清单中设置。然后你可以使用iBinder在进程(所有活动)被 Android 杀死时获取通知

于 2013-07-20T19:14:22.560 回答