双Service守护

    xiaoxiao2021-03-25  128

    当程序退到后台后依然想不停做一些服务请求,或其他需要运转功能时,往往会被很快杀掉。可以用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,只能用户手动设置白名单了。哈哈,当然,也可以让厂商设置。。。。

    转载请注明原文地址: https://ju.6miu.com/read-11763.html

    最新回复(0)