国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android設置鬧鐘相對完善的解決方案

2019-12-12 02:38:44
字體:
來源:轉載
供稿:網友

前些時候,有人在我「非著名程序員」微信公眾號的后臺問我有沒有設置鬧鐘的demo,我當時說承諾為大家寫一個,一直沒空,直到最近又有人跟我要,我決定抽時間寫一個吧。確實設置鬧鐘是一個比較麻煩的東西。我在這里寫的這個demo抽出來了封裝了一個類庫,大家直接調用其中的設置鬧鐘和取消鬧鐘的方法即可。可以設置每天的鬧鐘,周一到星期天之間多選的鬧鐘,也可以設置選擇一次性鬧鐘,跟系統設置鬧鐘的方式基本差不多吧。 

效果圖

來看分析和講解之前,先看看效果吧,效果圖如下:

設置界面

鬧鐘提醒界面


AlarmManager

對于AlarmManager里的方法我就不逐一介紹了,如果都介紹講完估計就天黑了。AlarmManager這個類提供對系統鬧鐘服務的訪問接口。

在API 19 以前,AlarmManager的常用方法有三個:

* set(int type,long startTime,PendingIntent pi);
該方法用于設置一次性鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘執行時間,第三個參數表示鬧鐘響應動作。

* setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
該方法用于設置重復鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘首次執行時間,第三個參數表示鬧鐘兩次執行的間隔時間,第三個參數表示鬧鐘響應動作。

* setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
該方法也用于設置重復鬧鐘,與第二個方法相似,不過其兩個鬧鐘執行的間隔時間不是固定的而已。

從API 19開始,AlarmManager的機制都是非準確傳遞,操作系統將會轉換鬧鐘,來最小化喚醒和電池使用。targetSdkVersion在API 19之前應用仍將繼續使用以前的行為,所有的鬧鐘在要求準確傳遞的情況下都會準確傳遞。

從API 19以后,則采用了如下方法:
* setWindow(int, long, long, PendingIntent)
* setExact(int, long, PendingIntent)
從上面的兩個方法我們可以看出,沒有了repeat,就是設置了鬧鐘只能響一次了,而且這兩種方法都可以設置精確的,第一個相對于第二種方法來說,應該是比較省電的。因為setWindow這個方法允許應用程序利用電池優化來自交貨批處理即使它適度的及時性要求警報。

主要問題

 1.API 19以后沒有了重復設置,那如果設置一個鬧鐘每天都準確提醒呢?
 2.手機重啟之后,設置的鬧鐘是否還有效?
 3.應用程序被殺死之后,鬧鐘是否還有效? 

說實話,這些問題我相信大家肯定都遇到過,而且解決起來相當費勁,確實是。來看我們如何一一解決吧。

解決遇到的坑

API 19以后如何設置重復鬧鐘

我們知道,我們在使用AlarmManager設置了提醒之后,是通過廣播接收的,設置的提醒時間一到,系統發送我們自定義的廣播,我們接收到,應用程序提醒。那提醒的時候,我們可以再重新設置一次嘛,這就解決了API 19設置重復鬧鐘的問題。

PendingIntent sender = PendingIntent.getBroadcast(context, id, intent, PendingIntent        .FLAG_CANCEL_CURRENT);    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {      am.setWindow(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis()),          intervalMillis, sender);    } else {      if (flag == 0) {        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);      } else {        am.setRepeating(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis            ()), intervalMillis, sender);      }    }

根據判斷系統版本,使用不同的設置鬧鐘的方法,進行設置。接下來我們通過廣播接收系統發來的通知,進行鬧鐘提醒。

public class LoongggAlarmReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {    // TODO Auto-generated method stub    String msg = intent.getStringExtra("msg");    long intervalMillis = intent.getLongExtra("intervalMillis", 0);    if (intervalMillis != 0) {      AlarmManagerUtil.setAlarmTime(context, System.currentTimeMillis() + intervalMillis,          intent);    }    int flag = intent.getIntExtra("soundOrVibrator", 0);    Intent clockIntent = new Intent(context, ClockAlarmActivity.class);    clockIntent.putExtra("msg", msg);    clockIntent.putExtra("flag", flag);    clockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    context.startActivity(clockIntent);  }}

通過上面的廣播,我們可以看到,我是通過那個時間間隔是否為零來判斷API 19之后是否是重復鬧鐘,不為0,就再重新設置一遍。我們來一起看看setAlarmTime()這個方法。如下:

 public static final String ALARM_ACTION = "com.loonggg.alarm.clock";  public static void setAlarmTime(Context context, long timeInMillis, Intent intent) {    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);    PendingIntent sender = PendingIntent.getBroadcast(context, intent.getIntExtra("id", 0),        intent, PendingIntent.FLAG_CANCEL_CURRENT);    int interval = (int) intent.getLongExtra("intervalMillis", 0);    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {      am.setWindow(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);    }  }

就這樣,重復的問題就解決了。

手機重啟之后,鬧鐘失效怎么解決

對,手機重啟之后,鬧鐘確實是失效了,要想解決這個問題,那就再設置一個監聽手機重啟的廣播,等手機重啟的時候,再重新設置一遍,即可解決上面的問題。

看看我在手機重啟廣播里調用了我封裝的重新設置鬧鐘的方法。這樣就解決了手機重啟之后,鬧鐘失效的問題。
注意:廣播需要在清單文件注冊,小伙伴們別忘記了哈。我在這里就不貼出代碼來了。

應用程序被殺死,鬧鐘失效

可以告訴你們的是,這個還真的沒有什么好的解決方案,如果你們程序里寫了服務,可以在服務重啟的時候,判斷重新再把鬧鐘注冊一次,或者在打開應用的時候重新注冊一次,反正就是能有利于鬧鐘注冊的地方,進行重新設置。如果鬧鐘設置的id是一樣的,后邊設置的會自動覆蓋先前設置的鬧鐘。如果誰有比較好的解決應用程序被殺死后,鬧鐘失效的問題,歡迎大家提供出來分享。

這個封裝的類庫的好處

好處就是我把方法都給你們封裝好了,直接就可以調用。

* 直接傳入時分的值就可以了。比如:直接傳入某個時間點:12:30,然后傳入是否是每天提醒,還是周幾提醒等
* 鬧鐘提醒的界面我也已經封裝到里面了,還算好看,懶的同學不需要再寫了,不滿意的同學可以直接下載類庫修改。
* 取消鬧鐘的方法,我也已經進行了封裝。

總之,就是非常方便,到底有多方便大家直接看demo就知道了,不滿意的同學可以直接下載類庫進行修改。

demo和類庫地址:https://github.com/loonggg/Android-AlarmManagerClock

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拉萨市| 崇仁县| 昌平区| 安吉县| 阿尔山市| 古蔺县| 白玉县| 富源县| 苍梧县| 禹州市| 资中县| 怀来县| 屯昌县| 庆城县| 东乌| 揭西县| 洱源县| 西青区| 和林格尔县| 彰化县| 大同县| 湘西| 清河县| 上饶县| 灌阳县| 扎兰屯市| 银川市| 察哈| 大邑县| 新和县| 皮山县| 柳州市| 长泰县| 多伦县| 乐山市| 永靖县| 桑植县| 平山县| 建昌县| 京山县| 台南县|