close
我們專案裡有用到通話功能
只要有一端打電話,就會送推播通知另一端
然後收到推播後就會開啟響鈴的 Activity
現在問題來了,當手機閒置很久沒用的時候
為了節省電源,Doze mode 會啟動
這時候推播雖然收到了,但 Activity 卻開不起來
看了一下生命週期,發現 Activity 是有起來的,只不過又被 destory 而已
Doze mode 是從 Android 6 出現的,它會把不必要的程式殺掉來保存電力
那 Line 的訊息會不會收不到呢?
不會,它固定一段時間會跑網路,更新資料
有興趣可以看這篇
回到專案,那我們該如何避免 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教學筆記
文章標籤
全站熱搜
留言列表