標籤:app 保活
我的原文: http://blog.csdn.net/brycegao321/article/details/52312030
有圖有真相, 親測鎚子T2、華為Mate8手機殺掉進程後能自啟, 我設定的自啟時間間隔為500ms(僅僅是為了測試)。
650) this.width=650;" src="http://img.blog.csdn.net/20160825102131689" /> 650) this.width=650;" src="http://img.blog.csdn.net/20160825204320387" />
首先要明確保活的概念:
1、非android核心進程(例如com.android.phone)都可以被幹掉;
2、保活並不能真正的保證app進程不死, 而是能在被幹掉後馬上啟動;
Android系統按照進程的優先順序分為:
1. 前台進程(Forgroud process): 頂層activity(已執行onResume); 有個Service,並綁定到跟使用者正在互動的activity;在Service裡調用了startForground函數;正在執行onReceive函數的BroadCastReceiver。
2. 可見進程(Visible process): 被對話方塊遮擋的activity, 執行了onPause; 擁有綁定到Activity的Service, 但該Activity被遮擋了, 例如按Home鍵,並執行了onStop。
3. 服務進程(Service process): 有正在啟動並執行Service, 但是沒有1/2的特性。
4. 後台進程(Background process)沒有正在啟動並執行Service, 只有不可見的Activity, 即Activity執行了onStop函數。
5. 空進程(Empty Process), 不含Android 4大組件的進程。
按照Android的設計, app只能提高自己的進程優先順序, 降低被殺掉的機率。
我們更關心的是進程被幹掉後怎麼拉起來, 有如下幾個方法:
1、 註冊靜態BroadcastReceiver, 監聽系統廣播;
2、 啟動一個服務, 並覆蓋Service的onStartCommand函數, 返回Service.START_STICKY。 用處是被gc回收後在以後某個時間被系統拉起來, 然並卵, 並不是我們想要的。
3. 使用Native進程保活, Android5.0以下好用, 在Android5.0以上就廢了, 所以不細說了。
4. 使用JobSheduler機制保活, 上帝在關閉一扇門的時候(native進程保活廢棄了),開啟了一扇窗(JobSheduler替代了native進程方式)。
5. 家族系app互拉, 例如百度旗下所有app, 啟動其中一個app時, 它會拉起百度旗下其他app進程。作法很流氓, 也是廠商和使用者深惡痛絕的。
以下是參考代碼, 只是為驗證進程能自啟, 所以寫的很簡單650) this.width=650;" alt="委屈" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif" />
public class MyJobService extends JobService { @Override public void onCreate() { super.onCreate(); startJobSheduler(); } public void startJobSheduler() { try { int id = 1; JobInfo.Builder builder = new JobInfo.Builder(id, new ComponentName(getPackageName(), MyJobService.class.getName() )); builder.setPeriodic(500); //間隔500毫秒調用onStartJob函數, 500隻是為了驗證 JobScheduler jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE); int ret = jobScheduler.schedule(builder.build()); } catch (Exception ex) { ex.printStackTrace(); } } @Override public boolean onStartJob(JobParameters jobParameters) { Log.d("brycegao", "onStartJob alive"); return false; } @Override public boolean onStopJob(JobParameters jobParameters) { Log.d("brycegao", "onStopJob alive"); return false; }}
<service android:name=".MyJobService" android:permission="android.permission.BIND_JOB_SERVICE"/>
我的公眾號, 歡迎關注, 讓我們一起成長650) this.width=650;" alt="大笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif" />
650) this.width=650;" src="http://img.blog.csdn.net/20160824153944826" />
Android5.0以上app進程保活的正確姿勢