Android平臺預(yù)置GMS包后關(guān)機鬧鐘失效問題及解決方法
1.介紹
關(guān)機鬧鐘為Android中默認支持的功能,實現(xiàn)起來則需要滿足一定的條件:自動開機、開機后響鈴。對于自動開機來說,自動關(guān)機可以在應(yīng)用層通過設(shè)置alarm來實現(xiàn),而自動開機需要底層rtc時鐘的支持;開機后檢查時間,到點響鈴。
2.原理
一般智能手機的硬件架構(gòu)都是分為RF,BB,AP這三個部分, RF射頻部分的功能主要是接收和發(fā)射射頻,大家不用關(guān)注這個。而AP部分就是應(yīng)用程序處理器,其實也就是CPU模塊;BB部分則是基帶模塊。通常手機關(guān)機都是AP模塊完全斷電,而BB雖然處在關(guān)機狀態(tài),但實際上鬧鐘和時間部分并沒有斷電。而當所設(shè)置鬧鐘到點時BB模塊會自動給AP模塊上電,這樣系統(tǒng)也就能開機并激活鬧鐘功能了。
3.流程
在鬧鐘設(shè)置一個時間合適且有效響鈴的鬧鐘后,向PowerOffAlarm發(fā)送設(shè)定關(guān)機鬧鐘廣播并傳入鬧鐘時間參數(shù),PowerOffAlarm接收到廣播后,根據(jù)預(yù)設(shè)提前開機時間和鬧鐘時間往rtc中寫入時間,并將該時間寫入文件中暫存。
設(shè)置好鬧鐘后關(guān)機,機器會根據(jù)rtc中的alrm_time時間參數(shù)來開機,開機后AlarmManagerService會檢查鬧鐘,并在鬧鐘時間發(fā)送廣播后彈出響鈴界面。
點擊關(guān)閉鬧鐘后,會發(fā)送取消關(guān)機鬧鐘廣播,PowerOffAlarm會對傳入時間與暫存的時間對比,如果相同則會取消該關(guān)機鬧鐘。
4.遇到問題及解決方法
4.1預(yù)置GMS包后,關(guān)機鬧鐘失效
在對比平臺鬧鐘分析后,發(fā)現(xiàn)谷歌鬧鐘在設(shè)置鬧鐘后并沒有向PowerOffAlarm發(fā)送廣播,但是由于谷歌鬧鐘無法進行修改。
在分析了平臺的鬧鐘設(shè)置鬧鐘步驟后,發(fā)現(xiàn)在設(shè)置鬧鐘后都會調(diào)用AlarmManager.setAlarmClock()這個方法,然后再AlarmStateManager的updateNextAlarm方法中發(fā)送設(shè)置關(guān)機鬧鐘的廣播。
谷歌鬧鐘在設(shè)置鬧鐘也會調(diào)用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)接受該廣播需要在應(yīng)用中添加特定的權(quán)限,即"org.codeaurora.permission.POWER_OFF_ALARM"權(quán)限,但是由于谷歌鬧鐘中未添加并且無法修改,所以在PowerOffAlarm中接收管廣播處移除該權(quán)限。
@@ -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 開機時間過長導(dǎo)致開機后鬧鐘過期
提前開機時間平臺預(yù)設(shè)默認為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;
此外還有其他的問題也會導(dǎo)致關(guān)機鬧鐘的失效,有時間再來記錄一下。
總結(jié)
到此這篇關(guān)于Android平臺預(yù)置GMS包后,關(guān)機鬧鐘失效的文章就介紹到這了,更多相關(guān)android 預(yù)置GMS包關(guān)機鬧鐘失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- android實現(xiàn)短按電源鍵關(guān)機的實現(xiàn)代碼
- Android實現(xiàn)關(guān)機后數(shù)據(jù)不會丟失問題
- Android 6.0開發(fā)實現(xiàn)關(guān)機菜單添加重啟按鈕的方法
- Android開發(fā)實現(xiàn)長按返回鍵彈出關(guān)機框功能
- Android仿蘋果關(guān)機界面實現(xiàn)代碼
- Android 修改系統(tǒng)關(guān)機動畫的實現(xiàn)
- Android下的CMD命令之關(guān)機重啟及重啟recovery
- Android實現(xiàn)關(guān)機與重啟的幾種方式(推薦)
- Android系統(tǒng)關(guān)機的全流程解析
- Android 實現(xiàn)關(guān)機的多種方式
相關(guān)文章
Android UI設(shè)計系列之自定義ViewGroup打造通用的關(guān)閉鍵盤小控件ImeObserverLayout(9)
這篇文章主要介紹了Android UI設(shè)計系列之自定義ViewGroup打造通用的關(guān)閉鍵盤小控件ImeObserverLayout,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下2016-06-06Android 自定義view實現(xiàn)進度條加載效果實例代碼
這篇文章主要介紹了Android 自定義view實現(xiàn)進度條加載效果實例代碼,需要的朋友可以參考下2017-08-08Kotlin擴展函數(shù)及實現(xiàn)機制的深入探索
擴展函數(shù)與擴展屬性的神奇之處在于,可以在不修改原來類的條件下,使用函數(shù)和屬性,表現(xiàn)得就像是屬于這個類的一樣。下面這篇文章主要給大家介紹了關(guān)于Kotlin擴展函數(shù)及實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下2018-06-06Android基于HttpUrlConnection類的文件下載實例代碼
本文通過實例代碼給大家介紹了Android基于HttpUrlConnection類的文件下載功能,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-09-09