1. 程式人生 > >Android後臺保活4.0~8.0系統(三)

Android後臺保活4.0~8.0系統(三)

簡單回顧下:在之前的保活第一篇中,主要介紹了設定模組關於保活的一些作用;在第二篇中,主要介紹了在關閉activity和系統退出的時候,系統是如何反應的,我們能否利用這些機制創造出更多的保活條件;

這篇主要介紹下在4.0~8.0系統當中,我們可以利用的保活方案

1: 由第一篇可知,如果裝置允許後臺程式的數量變多,或者允許保留後臺程式,那麼service是不是就可以存活更長時間?
答案: 否;

2:常規方案:普通service修改onstartcommand,onDestroy等
低版本效果還可以,在5.0以上版本存活起來就比較短了

    @Override
    public int
onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); gcEnv(); } private void gcEnv() { Intent serviceTo = new Intent(); serviceTo.setClass(this
, MyService.class); this.startService(serviceTo); }

3:雙service,即我們常說的利用android framework層notification的一個漏洞,提高service的優先順序;一個service展示一個通知,另一個service將那個通知隱藏;
低版本里面是可以的,但是google很快也修復了這個漏洞

4: 守護程序保活,即native方式保活;即通過JNI的方式在底層hork一個程序
這個方案相容性不高,效果不好

5: 使用jobservice的方式
隨著android版本的更新,google越來越推薦使用jobservice的方式來進行後臺執行,jobservice我測試過,保活效果並沒有多麼好,而且也沒法做到低版本相容;

6: 開啟一個畫素的activity,並監聽Home鍵,當攔截到點選Home鍵的時候,展示一個畫素的activity,這樣提高元件的優先順序,同時需要注意設定activity的task的親和性,這樣點選back鍵才會像正常launcher那樣

7:後臺播放一段空白的音訊或者視訊
這種方式耗電量會增加很多

8: 通過系統鬧鐘的方式,每隔固定時間就啟動service

    private void runService() {
        Intent intent = new Intent(this, MyService.class);
        PendingIntent mAlarmPIent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // long firstTime = System.currentTimeMillis();
        // firstTime表示第1次執行時要等待的時間,也就是執行延遲時間,單位是毫秒。
        long firstTime = SystemClock.elapsedRealtime() + INTERVAL_THREE_DAYS;
        AlarmManager mAlarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        if (mAlarmManager == null) {
            return;
        }
        mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, INTERVAL_THREE_DAYS, mAlarmPIent);
    }

9:另外在三星的裝置中,在其packageinstaller上開啟自動執行功能,service存活時間明顯增強

綜述:為了更好的做到service保活,我們的方案是
一: 如果手機版本低於5.0,我們採用的方案是
方案2 + 方案3 + 方案6 + 方案8

二: 如果手機版本高於等於5.0,我們直接拋棄其他方案,只使用jobservice

其實如果不是核心應用必要,我們不需要再後臺保持長時間存活的service,如果真有這樣的需求,最好的方法還是新增白名單