当程序退到后台后依然想不停做一些服务请求,或其他需要运转功能时,往往会被很快杀掉。可以用service守护,让它在被杀时立刻重新开启。
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
Intent serviceIntent = new Intent(this, NewMsgFirstService.class);
boolean isServiceExist = ServiceUtil.isServiceWorked(this, "com.my.service.NewMsgFirst
Service");//判断服务是否存在
if (!isServiceExist) {
serviceIntent.setClass(MainActivity.this, NewMsgFirstService.class);
startService(serviceIntent);
}
Intent serviceIntent2 = new Intent(this, NewMsgSecondeService.class);
boolean isServiceExist2 = ServiceUtil.isServiceWorked(this, "com.my.service.NewMsgSecondService");
if (!isServiceExist2) {
serviceIntent2.setClass(MainActivity.this, NewMsgSecondService.class);
startService(serviceIntent2);
}
}
}
下面是两个服务
NewMsgFirstService.class
public class NewMsgFirstService extends Service {
private int time = 5;
@Override
public void onCreate() {
super.onCreate();
LogUtil.logi("----------start----------");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtil.logi("---onStartCommand------one--");
checkServiceWork();
return START_STICKY;
}
private void checkServiceWork(){
if (checkNetWork()) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
if(WebViewError.isRequestSuccess(code)){
Log.i("ServiceOne Run: " + System.currentTimeMillis());
boolean isServiceExist = ServiceUtil.isServiceWorked(NewMsgFirstService.this, "com.my.service.NewMsgSecondService");
if (!isServiceExist) {
Intent service = new Intent(NewMsgTipsService.this, NewMsgSecondService.class);
service.setClass(NewMsgFirstService.this, NewMsgSecondService.class);
startService(service);
}
}
}
};
timer.schedule(task, 0, 5 * 1000);
}
}}
NewMsgSecondService.class
public class NewMsgDoubleService extends Service {
private String code;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
LogUtil.logi("Start ---------------ServiceTwo");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mThread.start();
return START_REDELIVER_INTENT;
}
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
timerRefresh();
}
});
// 定時获取新消息
private void timerRefresh() {
if (checkNetWork()) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
Log.i("ServiceTwo Run---: ", System.currentTimeMillis());
boolean isServiceExist = ServiceUtil.isServiceWorked(NewMsgSecondService.this, "com.my.service.NewMsgFirstService");
if (!isServiceExist && WebViewError.isRequestSuccess(code)) {
Intent service = new Intent(NewMsgSecondService.this, NewMsgFirstService.class);
service.setClass(NewMsgSecondService.this, NewMsgFirstService.class);
startService(service);
}
}
};
timer.schedule(task, 0, 1 * 1 * 1000);
} else {
// NewMsgSecondService.this.stopSelf();
}
}
}
ServiceUtil.class工具类
public class ServiceUtil {
/**
* 判断服务是否运行
* @param context
* @param serviceName
* @return
*/
public static boolean isServiceWorked(Context context, String serviceName) {
ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ArrayList<ActivityManager.RunningServiceInfo> runningService = (ArrayList<ActivityManager.RunningServiceInfo>) myManager.getRunningServices(Integer.MAX_VALUE);
if(runningService != null){
for (int i = 0; i < runningService.size(); i++) {
if (runningService.get(i).service.getClassName().toString().equals(serviceName)) {
return true;
}
}
}
return false;
}
}
其实,Service守护并不能保证程序在后台一直运行,一段时间后还是会被系统kill掉整个进程,而service并没有进onDestroy()方法。要想不被kill,只能用户手动设置白名单了。哈哈,当然,也可以让厂商设置。。。。