双进程守护
一个应用,拥有两个进程
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; }