17.6服务不被杀死
服务不被杀死分3种来讨论:
(1) 系统根据资源分配情况杀死服务
用户不干预,完全靠系统来控制,办法有很多。比如 onStartCommand() 方法的返回值设为 START_STICKY ,服务就会在资源紧张的时候被杀掉,然后在资源足够的时候再恢复。当然也可设置为前台服务,使其有高的优先级,在资源紧张的时候也不会被杀掉。
(2) 用户通过 settings -> Apps -> Running -> Stop 方式杀死服务
用户干预,主动杀掉运行中的服务。这个过程杀死服务会通过服务的生命周期,也就是会调用 onDestory() 方法,这时候一个方案就是在 onDestory() 中发送广播开启自己。这样杀死服务后会立即启动。如下:
@Override
publicvoid onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mBR = new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
//TODO Auto-generated method stub
Intent a = new Intent(ServiceA.this,ServiceA.class);
startService(a);
}
};
mIF = new IntentFilter();
mIF.addAction("listener");
registerReceiver(mBR, mIF);
}
@Override
publicvoid onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Intent intent = new Intent();
intent.setAction("listener");
sendBroadcast(intent);
unregisterReceiver(mBR);
}
这个方案在有些情况下,发送的广播在消息队列中排的靠后,就有可能服务还没接收到广播就销毁了。
为了能让这个机制完美运行,可以开启两个服务,相互监听,相互启动。服务A监听B的广播来启动B,服务B监听A的广播来启动A。
(3)用户通过 settings -> Apps -> Downloaded -> ForceStop 方式杀死服务
这种情况,在服务里加代码是无法被调用的。处理这个情况的唯一方法是屏蔽掉 forcestop和 uninstall 按钮,让其不可用。
网友评论