我的应用程序在同一进程中运行了一项活动和一项服务。当用户通过单击STOP按钮终止活动时,活动将导致服务终止。
从Android文档中我了解到系统可以杀死进程以回收资源:
“一旦你的活动停止,系统可能会破坏实例,如果它需要恢复系统内存。在极端情况下,系统可能只是杀死你的应用程序进程而不调用活动的最终onDestroy()回调,...”
问题1:我的活动是否可能被杀死但服务却没有?我希望我的服务还活着。
如果答案为“是”,那么
问题2:是否存在可以通知服务该活动已被杀死的机制?
IBinder.linkToDeath具有我需要的功能,但似乎适用于流程,而不是活动。
我想到了一种间接方法,比如让活动获得信号量的所有权并让服务使用线程来等待它。然后,当活动被杀死时,它将释放信号量,服务将获取它,提供通知。但我想知道是否有一种我可以使用的以机器人为中心的技术。
[开始编辑]
在阅读了您提供的非常有用的评论之后,我想澄清我正在呈现的情景。
我已经启动了两个组件:活动和服务。配置应用程序,以便在活动停止并销毁后服务可以继续运行。用户可以多次重新启动/启动活动,它将使用相同的服务实例。
通常,活动会在onDestroy()期间通知它已被销毁的服务。但是可能不会调用onDestroy()。
我想知道是否有一些特定于android的机制可以用来通知服务该活动已经被杀死而没有调用它的onDestroy()方法。
[结束编辑]
感谢您的帮助。
威尔
答案 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)