应用进程分为五个等级:
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"/>
结合Netty框架,实现socket长连接
Android--Netty的理解和使用 : https://www.jianshu.com/p/7399b52a5ab2