service 在android app里 应用 越来越多,特别是联网的app中,不管app是否启动,总需要一个service来维护与后台数据的连接,接收服务端的推送,获取及时的数据信息。
可是 service 总是在后台不知不觉的别系统回收 或者被 一些优化软件 给 “优化”了,怎么解决这个问题?
查资料 找到了 Service对象的onStartCommand(Intent,int,int)方法 ,此方法介绍:
onStartCommand有4种返回值:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
写个简单的验证程序 看看service 被kill掉后 是否会重新启动:
public class AutoRunService extends Service {
private static AutoRunService msService = null;
private Thread mThread;
private static boolean isRun;
private static float num=0;
@Override
public void onCreate() {
super.onCreate();
Log.d("mservice", "onCreate");
msService = this;
isRun=true;
num=0;
if(mThread==null){
mThread=new Thread(runnable);
}
if(!mThread.isAlive()){
mThread.start();
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("mservice", "onStartCommand");
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId) {
Log.d("mservice", "onStart");
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
Log.d("mservice", "onDestroy");
super.onDestroy();
// restartService(this);
msService=null;
isRun=false;
}
public static AutoRunService getService() {
return msService;
}
public Runnable runnable=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while(isRun){
SystemClock.sleep(1000);
num+=1;
Log.d("mservice", "i am run times="+num);
}
}
};
}
启动service:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("mservice", "activity onCreate");
Intent intent =new Intent(this, AutoRunService.class);
this.startService(intent);
}
启动 程序 有log 输出:
杀死 service;
等待了一段时间 service 果然重新启动:
看重启时间 和杀死 service时间间隔 30秒 ,多试了几次 重启时间在 0-300秒之间, 测试手机 是 htc one,理论上来说 重启时间是不确定的,所以如果想做更
安全的保障,建议 加上 开机 和解锁的 广播接收,在那里再做进一步的service 启动, 如果要求不高,上面的即可满足。