我們專案裡有用到通話功能

只要有一端打電話,就會送推播通知另一端

然後收到推播後就會開啟響鈴的 Activity

 

現在問題來了,當手機閒置很久沒用的時候

為了節省電源,Doze mode 會啟動

這時候推播雖然收到了,但 Activity 卻開不起來

看了一下生命週期,發現 Activity 是有起來的,只不過又被 destory 而已

 

Doze mode 是從 Android 6 出現的,它會把不必要的程式殺掉來保存電力

那 Line 的訊息會不會收不到呢?

不會,它固定一段時間會跑網路,更新資料

有興趣可以看這篇

Willy's Fish教學筆記』 Android 7.0 Nougat 開發人員API介紹 & 使用者需知實用新功能!!! Android 6.0 Marshmallow vs. Android 7.0 Nougat

 

回到專案,那我們該如何避免 Doze mode 殺掉我們的程式呢?

教大家一招,我們可以向使用者要求權限來獲得免死金牌

1、先在 AndroidManifest.xml 加入權限

<uses-permission android:name=
"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"

 

2、然後在程式裡加入確認權限的 code

PowerManager powerManager = 
  (PowerManager) getApplicationContext()
  .getSystemService(Context.POWER_SERVICE);

boolean isIgnoringBatteryOptimizations = 
  powerManager.isIgnoringBatteryOptimizations(packageName);

這裡我們用 PowerManager.isIgnoringBatteryOptimizations() 來幫我們檢查是否有權限 ( api 23 增加的 function )

 

3、若沒有權限則要求權限

Intent intent = new Intent();
intent.setAction(
  Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivityForResult(
  intent, REQUEST_CODE_IGNORE_OPTIMIZATION_REQUEST);

如此一來用戶就會看到要求權限的 dailog 如下圖

 

有了權限之後,Activity 終於可以順利的運行了

不過 Android 9 的用戶可能還會發生一個問題,請看下篇

Android 9 鎖屏遮擋 Activity 解決方法 』Willy's Fish教學筆記

 

 

 

 

 

 


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()