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样式:<style name="OnePixelActivity" parent="android:Theme.Holo.Light.NoActionBar"> <!-- 一像素这只为透明--> <item name="android:windowIsTranslucent">true</item> </style> // 清单文件:
<activity android:name=".OnePixelActivity" android:screenOrientation="portrait" android:theme="@style/OnePixelActivity"> </activity>
//解释: //FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity, //注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中),如果有,刚直接把这个栈整体移动 //到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity