1. 程式人生 > 其它 >Android程式保活的探索

Android程式保活的探索

本文就Android保活的話題展開實踐

 在android專案執行過程中,如果鎖屏,你會遇到以下兩種情況

           1、如果熄屏時間不太長,當手機再次解鎖,你會發現程式還會繼續執行,也就是繼續執行熄屏前的某個頁面

           2、如果熄屏時間長,當手機再次解鎖,你會發現程式重新開啟了閃屏頁,重新啟動了一遍

        以上兩種情況下都會影響到我們程式的執行

 

            第一種情況是自Android 6.0以來的Doze模式引起的,Doze模式是官方為了節省手機電量,當手機處於後臺執行時,讓程序休眠的一種機制,這個可以查資料瞭解一下;Doze模式下有一個特點就是程序並非被殺死,而是被停滯,如執行的handler會被停滯,當插上電源或者解鎖螢幕的時候,會突破Doze模式,此時先前的handler會繼續執行

            第二種是LMK(Low Memory Killer)引起的,這個是程序殺手,當手機記憶體不足,需要優化的時候,它決定了該殺死哪個程序;它會為每個程序打分,分值越高就越容易被殺,這個可以通過adb命令查詢程序處於不同狀態時的分值:

            當app處於前臺,分值adj_score: 0

            當app處於後臺,並且開啟了前臺service,分值:3

            當app處於後臺,不開啟前臺service,分值:11

        這也就是為啥app處於後臺時要開啟前臺服務,可以減少app後臺執行時被殺的概率

 

  二、以上兩種情況 當我們的app想在後臺執行一些任務時,都會被停滯或者被殺死,會阻塞到我們的業務流程,那麼如何解決呢?

       針對LMK 我們可以給app加前臺服務,提升程序的優先順序

       針對Doze我們測試一下網上的保活方案:

           1、wakeLock防止系統休眠,這個經過測試不好使

           2、兩個service互相檢測對方是否存活,如果其中一個死了 另一個將其啟動救活,經測試不好使,兩個service都會被

           3、一畫素Activity方式,當監聽到鎖屏的廣播時,開啟一畫素的Activity,當監聽到解鎖的廣播時,銷燬一畫素Activity其目的是想提高app的優先順序不被殺,Doze模式下不好使,該停滯還是會停滯

           4、

handler 定時任務方式 後臺運行了4min (不同機型,存活時長不一樣,但是都只是幾分鐘)

           5、alarmManager定時任務方式 後臺運行了2min (不同機型,存活時長不一樣,但是都只是幾分鐘)

           6JobScheduler定時任務方式 後臺運行了4min (不同機型,存活時長不一樣,但是都只是幾分鐘)

           7、後臺播放音樂方式,在華為以及榮耀系列成功存活 3小時+,小米9、紅米note8成功存活3小時 +但是在oppo K7下只存活了5min,如果播放的是純無聲音樂,那麼也是隻能存活幾分鐘

   

 三、測試那麼多方案都不好使,那麼有沒有真正好使的保活方案呢,有的!不信你看微信,即使你後臺息屏好長時間它依然收到新訊息,還可以彈出通知欄,為什麼呢?

    答案是:應用啟動白名單!

    微信幾乎是各大廠商都預設會後臺保留,不會主動殺死,不會被Doze的app,事實上,只要是被加入手機自啟動白名單的app都不會被Doze也不會被殺死

    經測試過可靠的方案:

          引導使用者手動去設定app的自啟動模式,允許後臺自啟動,允許後臺執行,這種方案是不管任何機型都好使的方案,只不過此方案需要我們去調研各個品牌手機主流機型的自啟動設定流程,然後整合到專案中,可以作為依賴庫供專案使用,這種方案是可靠也是最省電的保活方式

具體設定如下,以華為手機為例:

  

     網上很多介紹的保活的方案,幾乎都不好使,或許想要實現真正的保活如果不是讓使用者手動開啟白名單,用技術手段去實現後臺不死,目前來看可能真的是個偽命題,倘若真的有這種永生不死的技術,那麼我們的手機就要廢了,可能一天得充無數次電,這肯定得得到使用者的授權同意才可以,要不然手機就沒法用了

好了,本次總結到這裡,有好的保活方案的話可以私信我,大家一起進步,感謝!