双Service守护

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值