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









    



       <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