Android平臺預置GMS包后關機鬧鐘失效問題及解決方法
1.介紹
關機鬧鐘為Android中默認支持的功能,實現(xiàn)起來則需要滿足一定的條件:自動開機、開機后響鈴。對于自動開機來說,自動關機可以在應用層通過設置alarm來實現(xiàn),而自動開機需要底層rtc時鐘的支持;開機后檢查時間,到點響鈴。
2.原理
一般智能手機的硬件架構都是分為RF,BB,AP這三個部分, RF射頻部分的功能主要是接收和發(fā)射射頻,大家不用關注這個。而AP部分就是應用程序處理器,其實也就是CPU模塊;BB部分則是基帶模塊。通常手機關機都是AP模塊完全斷電,而BB雖然處在關機狀態(tài),但實際上鬧鐘和時間部分并沒有斷電。而當所設置鬧鐘到點時BB模塊會自動給AP模塊上電,這樣系統(tǒng)也就能開機并激活鬧鐘功能了。
3.流程
在鬧鐘設置一個時間合適且有效響鈴的鬧鐘后,向PowerOffAlarm發(fā)送設定關機鬧鐘廣播并傳入鬧鐘時間參數(shù),PowerOffAlarm接收到廣播后,根據(jù)預設提前開機時間和鬧鐘時間往rtc中寫入時間,并將該時間寫入文件中暫存。
設置好鬧鐘后關機,機器會根據(jù)rtc中的alrm_time時間參數(shù)來開機,開機后AlarmManagerService會檢查鬧鐘,并在鬧鐘時間發(fā)送廣播后彈出響鈴界面。
點擊關閉鬧鐘后,會發(fā)送取消關機鬧鐘廣播,PowerOffAlarm會對傳入時間與暫存的時間對比,如果相同則會取消該關機鬧鐘。
4.遇到問題及解決方法
4.1預置GMS包后,關機鬧鐘失效
在對比平臺鬧鐘分析后,發(fā)現(xiàn)谷歌鬧鐘在設置鬧鐘后并沒有向PowerOffAlarm發(fā)送廣播,但是由于谷歌鬧鐘無法進行修改。
在分析了平臺的鬧鐘設置鬧鐘步驟后,發(fā)現(xiàn)在設置鬧鐘后都會調用AlarmManager.setAlarmClock()這個方法,然后再AlarmStateManager的updateNextAlarm方法中發(fā)送設置關機鬧鐘的廣播。
谷歌鬧鐘在設置鬧鐘也會調用AlarmManager.setAlarmClock()這個方法,所以在該方法中直接發(fā)送廣播到PowerOffAlarm中。
@@ -615,8 +633,34 @@ public class AlarmManager {
public void setAlarmClock(AlarmClockInfo info, PendingIntent operation) {
setImpl(RTC_WAKEUP, info.getTriggerTime(), WINDOW_EXACT, 0, 0, operation,
null, null, null, null, info);
+ setPowerOffAlarm(mContext,info.getTriggerTime());
}
+
+ /*add by hxj at Aug.6,for PowerOffAlarm*/
+ private void setPowerOffAlarm(Context context, long time) {
+ Log.d(TAG, "setPowerOffAlarm: saveAlarmToPreference and sendBroadcast to setPowerOffAlarm,the time is "+time);
+ DEFAULT_ALARM_TIME = time;
+ Intent intent = new Intent(ACTION_SET_POWEROFF_ALARM);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.setPackage(POWER_OFF_ALARM_PACKAGE);
+ intent.putExtra(TIME, time);
+ context.sendBroadcast(intent);
+ }
+
+ private void cancelPowerOffAlarm(Context context) {
+ //long time = getAlarmFromPreference(context);
+ Log.d(TAG, "cancelPowerOffAlarm: cancel alarm and cancelPowerOffAlarm(mContext),time is "+DEFAULT_ALARM_TIME );
+ Intent intent = new Intent(ACTION_CANCEL_POWEROFF_ALARM);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(TIME, DEFAULT_ALARM_TIME);
+ intent.setPackage(POWER_OFF_ALARM_PACKAGE);
+ context.sendBroadcast(intent);
+ DEFAULT_ALARM_TIME = 0L;
+ }
+
+
/** @hide */
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
@@ -930,6 +974,7 @@ public class AlarmManager {
try {
mService.remove(operation, null);
+ cancelPowerOffAlarm(mContext);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
4.2 PowerOffAlarm無法接收廣播
在分析log后,發(fā)現(xiàn)接受該廣播需要在應用中添加特定的權限,即"org.codeaurora.permission.POWER_OFF_ALARM"權限,但是由于谷歌鬧鐘中未添加并且無法修改,所以在PowerOffAlarm中接收管廣播處移除該權限。
@@ -29,7 +29,7 @@
android:defaultToDeviceProtectedStorage="true">
<receiver android:name=".PowerOffAlarmBroadcastReceiver"
- android:permission="org.codeaurora.permission.POWER_OFF_ALARM"
+
android:exported="true"
android:directBootAware="true"
android:label="PowerOffAlarmBroadcastReceiver">
4.3 開機時間過長導致開機后鬧鐘過期
提前開機時間平臺預設默認為90000毫秒,項目中開機時間較長,所以增長開機時間,改為150000毫秒。
@@ -42,7 +42,7 @@ public class PowerOffAlarmUtils {
private static final int FAILURE = -1;
- public static final long MS_IN_ONE_MIN = 90000L;
+ public static final long MS_IN_ONE_MIN = 150000L;
private static final long SEC_TO_MS = 1000L;
此外還有其他的問題也會導致關機鬧鐘的失效,有時間再來記錄一下。
總結
到此這篇關于Android平臺預置GMS包后,關機鬧鐘失效的文章就介紹到這了,更多相關android 預置GMS包關機鬧鐘失效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數(shù)
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數(shù),非常不錯,具有參考借鑒價值,需要的朋友參考下2017-01-01
詳解androidstudio項目上傳到github方法以及步驟
在使用studio開發(fā)的項目過程中有時候我們想將項目發(fā)布到github上,studio其實是自帶這種功能的,那么如何使用呢,下面我們就一起來了解一下2019-01-01
使用androidx BiometricPrompt實現(xiàn)指紋驗證功能
這篇文章主要介紹了使用androidx BiometricPrompt實現(xiàn)指紋驗證功能,對android指紋驗證相關知識感興趣的朋友跟隨小編一起看看吧2021-07-07
Android studio報: java.lang.ExceptionInInitializerError 錯誤
本篇文章主要介紹了Android studio報: java.lang.ExceptionInInitializerError錯誤的解決方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03

