本文針對鬧鐘應用對于此次Android 7.0增加DB模式所需要的應對方式,
Direct Boot模式:設備已開機但用戶尚未解鎖設備時,Android 7.0 將在安全的“直接啟動”模式下運行,
簡單來說,如果不做處理,在手機開機鎖屏的情況下(DB模式),設定的鬧鐘是無法使用的,
開發者網站請參考:支持“直接啟動”模式 | Android 開發者 | Android Developers
應對方式:
1.請求在DB模式下運行
默認情況下,應用不會在“直接啟動”模式下運行,如果應用需要在DB模式下執行操作,需要注冊應在此模式下運行的應用組件,應用通過將組件標記為加密感知來向系統注冊,然后才能在“直接啟動”模式下運行或訪問設備加密存盤,
android:directBootAware="true"
當設備重啟后,加密感知組件可以注冊以接收來自系統的ACTION_LOCKED_BOOT_COMPLETED廣播訊息,此時,設備加密存盤可用,
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
2.接收用戶解鎖通知
當用戶在重啟后解鎖設備時,應用可以切換至訪問憑據加密存盤,并使用依賴用戶憑據的常規系統服務,
需立即獲取通知的前臺行程,監聽ACTION_USER_UNLOCKED訊息,
<action android:name="android.intent.action.USER_UNLOCKED" />
對延遲通知執行操作的后臺行程,監聽ACTION_BOOT_COMPLETED訊息,
<action android:name="android.intent.action.BOOT_COMPLETED" />
也可以通過呼叫userManager.isUserUnlocked(),直接查詢用戶是否已解鎖設備,
AppClock遇到的問題:
1.開機的時候,鬧鐘到時不響被miss掉了,分析log發現是:
當用戶使用手機時(flip打開,螢屏on的狀態下),一個鬧鈴響鈴,用戶在通過非代碼設定的按鍵而離開響鈴界面(像是誤操作等原因),此時會把這個鬧鈴置位missed狀態,同時關閉響鈴、發送notification,
if (AlarmSubLcd.isFlipOpen(mContext) == true && mIsScreenOn == true) {
missed();
}
處理方法:將此方法所在的組件在清單中注冊
android:showWhenLocked="true"
將此組件浮在鎖屏界面的上方,回傳即進入解鎖界面,
2.在DB模式下,概率性出現鬧鐘到時不響(解鎖后鬧鐘可響,過時鬧鐘被miss掉)
這個問題給我整emo了兩天,通常概率性bug是執行緒的事,從log中分析出來,不知道是誰把alarmInstance的狀態從fire變成了miss,導致鬧鐘到時不響,后來從crash log發現,在DB模式下,clock的widget crash了,DB模式下,不能呼叫updateWidget()方法,
處理方法:
通過呼叫userManager.isUserUnlocked()是否已解鎖設備,解鎖設備后再呼叫updateWidget()方法,
UserManager mUserManager = context.getSystemService(UserManager.class);
if (mUserManager.isUserUnlocked()) {
UpdateWidget();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392168.html
標籤:其他
上一篇:ATX 移動設備共享平臺
