Android 进程保活分为如下两种情况:
1. 提供进程优先级,降低进程被杀死的概率
2. 在进程被杀死后,进行拉活
进程的优先级分为5级:
1.前台进程-------Foreground process
只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。
A. 界面上显示的,用户正在交互的 Activity(已调用 onResume()
)
B. 某个 Service,绑定到用户正在交互的 Activity
C. 调用了 startForeground()正在运行的service
D. 正执行一个生命周期回调的 Service(onCreate()
、onStart()
或onDestroy()
)
E.正执行其 onReceive()
方法的 BroadcastReceiver
2.可见进程 —— Visible process
可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
A. 不在前台、但仍对用户可见的 Activity(已调用 onPause()
)。
B. 绑定到可见(或前台)Activity 的 Service
3.服务进程 —— Service process
后台运行的服务如播放音乐 下载数据。
4,.后台进程 —— Background process
用户不可见的activity
5.空进程-------Empty process 一般做缓存
进程优先级1为最高 最不容易被系统杀死,1像素保活就是在程序退出后将进程优先级提高 减少被系统杀死的几率,奉上例子:
一:创建一个一像素的继承fragmentActivity的活动
public class OnePixelActivity extends FragmentActivity {
//注册广播接受者 当屏幕开启结果成功结束一像素的activity
BroadcastReceiver br;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设定一像素的activity
Window window = getWindow();
window.setGravity(Gravity.LEFT | Gravity.TOP);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = 0;
params.height = 1;
params.width = 1;
window.setAttributes(params);
//在一像素activity里注册广播接受者 接受到广播结束掉一像素
br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG", "--------OnePixelActivity finish");
finish();
}
};
registerReceiver(br, new IntentFilter("finish activity"));
checkScreenOn("onCreate");
}
@Override
protected void onDestroy() {
Log.d("TAG", "--------OnePixelActivity onDestroy");
try {
unregisterReceiver(br);
} catch (IllegalArgumentException e) {
}
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
checkScreenOn("onResume");
}
/**
* 检查锁屏 解屏的方法 isScreenOn为true 则表示屏幕“亮”了 否则屏幕“暗”了。 亮着就结束1像素
*/
private void checkScreenOn(String methodName) {
Log.d("TAG", "-------from call method: " + methodName);
PowerManager pm = (PowerManager) OnePixelActivity.this.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
Log.d("TAG", "-------isScreenOn: " + isScreenOn);
if (isScreenOn) {
finish();
}
}
}
// 二:在main里注册接受锁屏 解锁的的广播接受者
public class MainActivity extends AppCompatActivity {
private OnepxReceiver mOnepxReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 注册广播接受者 接受屏幕的
*/
//注册一像素的receiver
mOnepxReceiver=new OnepxReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.SCREEN_OFF");
intentFilter.addAction("android.intent.action.SCREEN_ON");
intentFilter.addAction("android.intent.action.USER_PRESENT");
registerReceiver(mOnepxReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mOnepxReceiver);
}
}
// 三:创建广播接受者
//一像素activity的广播接受者
public class OnepxReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { //屏幕关闭的时候接受到广播
Intent it = new Intent(context, OnePixelActivity.class);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
Log.d("TAG", "-------screen off");
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { //屏幕打开的时候发送广播 结束一像素
context.sendBroadcast(new Intent("finish activity"));
Log.d("TAG", "------screen on");
Intent home=new Intent(Intent.ACTION_MAIN);
home.setFlags(Intent.FLAG_ACTION_CLEAR_TOP);
home.addCateGory(Intent.CATEGORY_HOME);
context.startActivity(home);
}
}
}
// 四:清单文件一像素activity设置为透明无actionBar
// Styles样式:
// 清单文件:
//解释:
//FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,
//注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中),如果有,刚直接把这个栈整体移动
//到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity