活动被杀死时的服务通知

时间:2013-07-20 16:16:39

标签: android service android-activity

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

从Android文档中我了解到系统可以杀死进程以回收资源:

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

问题1:我的活动是否可能被杀死但服务却没有?我希望我的服务还活着。

如果答案为“是”,那么

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

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

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

[开始编辑]

在阅读了您提供的非常有用的评论之后,我想澄清我正在呈现的情景。

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

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

我想知道是否有一些特定于android的机制可以用来通知服务该活动已经被杀死而没有调用它的onDestroy()方法。

[结束编辑]

感谢您的帮助。

威尔

2 个答案:

答案 0 :(得分:0)

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

为了实现你想要做的事情,我将在你的activity的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()调用来处理与服务的通信,但我更喜欢上述方法(我确信在绑定情况下是更好的方法)。

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

答案 1 :(得分:0)

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

也可以在其他进程中创建服务,但必须在清单中设置它。然后,您可以使用iBinder在Android(

)杀死进程(包含所有活动)时收到通知