`

android双进程守护

阅读更多

双进程守护

 

一个应用,拥有两个进程

RemoteService

LocalService

 

重要代码

 

public void onCreate(){

  //这里必须判断,否则会出现内存溢出
  if(localBinder != null){
     localBinder = new LocalServiceBinder();
  }

   localServiceConnection = new LocalServiceConnection();

}

public int onStartCommand(Intent intent,int flags,int startId){

     startTimer();
     Notification.Builder builder = new Notification.Builder(this);
     builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
     builder.setContentTitle("");
     builder.setSmallICon(R.mipmap....);
     builser.setContentInfo("info");
     builder.setWhen(System.currentTimeMillis());
     PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
     builder.setContentIntent(pi);
     startForeground(startId,builder,build);

    return START_STICKY;


}


class LocalServiceConnection implements ServiceConnection(){

  public void onServiceConnected(ComponentName name,IBinder service){
  }

   public void onSerivceDisConnected(CompoentName name){

     LocalService.this.startService(new Intent(RemoteService));//启动远程服务
     LocalService.this.bindService(new Intent(RemoteService))  //绑定远程服务

  }



}

 

 

 

每个Sercie中都存在Connection,

 

思路:

进程A   进程B

进程A被杀死时,启动进程B

进程B被杀死时,启动进程A

 

使用JobService&JobSceduler

思路:

1.获取应用中的JobSceduler

2.通过JobSceduler来启动LocalService和RemoteService

 

步骤:

MainActivity.java

1、启动LocalService

2、启动RemoteService

3、启动JobHandlerService,它继承Jobservice

 

private void scheduleJob(JobInfo job){

     JobScheduler js = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
     js.schedule(job);

}
 
 

public int OnStartCommand(Intent intent,int flags,int startId){

  scheduleJob(getJobInfo());
  return START_NOT_START;

}

public JobInfo getJobInfo(){

    JobInfo.Builder builder = new JobInfo.Builder(jobId,new CompoentName)(this,JobHandlerService.class);
    builder.setPersisted(true);
    builder.setPeriodic(100);
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
    builder.setRequiresCharging(false);
    builder.setRequiresDeviceIdle(false);
    return builder.build();

}

public boolean onStartJob(JobParameters params){


      boolean isLocalServiceWorking = isServiceWork(this,"com.yourLocalservice.LocalService"
   boolean isLocalServiceWorking = isServiceWork(this,"com.yourLocalservice.RemoteService");
 
      this.startService(new Intent(this,LocalService.class));
      this.startService(new Intent(this,RemoteService.class));

      return true;//注意这里

}

public boolean onStopJob(JobParameters params){

     scheduleJob(getJobInfo);
     return true;//注意这里
}

public boolean isServiceWork(Context context,String serviceName){

   ActivityManager manager  = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
   List<ActivityManager.RunningServiceInfo> list = manager.getRunningService(128);

   if(list.size()<0){
     return false;
   }

   for(int i=0;i< list.size();i++){
       String name = list.get(i).service.getClassName().toString();
       if(serviceName.equal(name)){
          return true;
       }
   }
   return false;
}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics