Android5.0以上app進程保活的正確姿勢

來源:互聯網
上載者:User

標籤: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進程保活的正確姿勢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.