Android应用进程防杀死

879 阅读2分钟
原文链接: www.jianshu.com

应用进程分为五个等级: 1.前台进程:Foreground process

1).用户正在交互的activity( onResume() );
2).当某个Service绑定正在交互的Activity;
3).被主动调用为前台Service(startForeground());
4).组件正在执行生命周期的回调(onCreate()/onStart/onDestroy);

2.可见进程:Visible process

我们的Activity出于onPause()(没有进入onStop());

3.服务进程:Service process

简单的startService();

4.后台进程:Background process

对用户没有直接影响的进程,Activity出于onStop()的时候;

5.空进程:Empty process

不包含任何的活动的组件.(Android设计的,为了第二次启动更快,采取了一起权衡);

可行的防应用杀死技术:

1、白名单;
2、双进程守护;
3、JobScheduler把任务加到系统调度队列中,当达到任务窗口期的时候就会执行,然后在任务里面启动进程;
4、监听系统级广播,然后把自己启动;
5、NDK来解决,Native进程来完成双进程守护;

双进程服务在Java层的实现:

1、作为前台进程,提升了优先级;(应用在后台运行的时候,另起一个一像素的页面,覆盖在桌面上,将这个"后台进程"变为前台进程)
2、防止用户在设置界面杀死某个进程服务和停止应用;
3、防止手机优化软件杀死进程;

JobScheduler的作用:

1)、固定周期唤醒;
2)、充电唤醒;
3)、设备空闲时唤醒;
4)、免费网络连接时唤醒;

利用JobScheduler重启服务:

1)、Android系统5.0后提供了JobScheduler来重新启动服务;
2)、Android系统5.0之前可以使用AlarmManager来代替;

开发步骤: 1)、重写JobService的startJob()和stopJob():

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {

        @Override
        public boolean onStartJob(JobParameters params) {
                 startService(new Intent(this,MyService.class));
                return false;
        }

        // 如果确定停止系统调度作业,即使调度作业可能被完成,将调用此方法
        @Override
        public boolean onStopJob(JobParameters params) {
                startService(new Intent(this,MyService.class));
                return false;
        }

        @Override
        public void onTaskRemoved(Intent rootIntent) {
                 startService(new Intent(this,MyService.class));
        }
}

2)、绑定JobService:

public class MyServiceextends Service {
      
        @Override
        public void onCreate() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        JobScheduler jobScheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
                       JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(this, MyService.class));  
                        builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10)); //执行的最小延迟时间
                        builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(15));  //执行的最长延时时间
                        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NOT_ROAMING);  //非漫游网络状态
                        builder.setBackoffCriteria(TimeUnit.MINUTES.toMillis(10),  JobInfo.BACKOFF_POLICY_LINEAR);  //线性重试方案
                        builder.setRequiresCharging(false); // 未充电状态
                        jobScheduler.schedule(builder.build());
                } else {
                        PendingIntent pendingIntent = PendingIntent.getService(this, 0, getIntentAlarm(this), PendingIntent.FLAG_UPDATE_CURRENT);
                        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                        alarmManager.cancel(pendingIntent);
                        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + KEEP_ALIVE_INTERVAL, KEEP_ALIVE_INTERVAL, pendingIntent);
                }
        }
        @Override
        public void onDestroy() {
                super.onDestroy();
        }

        @Override
        public void onLowMemory() {
                super.onLowMemory();
        }

        @Override
        public IBinder onBind(Intent arg0) {
                return null;
        }
}

3)、在AndroidManifest注册服务:

如果Service等的AndroidManifest中声明为android:exported="false" , 则该服务不能够跨进程使用;

4、声明权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

//17年最后一篇文章, 大家节日快乐!