APP开发实战71-服务不被杀死

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 按钮,让其不可用。

(转自:http://www.tuicool.com/articles/iu22QnF)

你可能感兴趣的:(APP开发实战71-服务不被杀死)