最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android設(shè)置鬧鐘相對完善的解決方案

 更新時間:2017年06月19日 15:45:44   作者:loongggdroid  
這篇文章主要為大家詳細(xì)介紹了Android設(shè)置鬧鐘相對完善的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

效果圖

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

設(shè)置界面

鬧鐘提醒界面

AlarmManager

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

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

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

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

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

從API 19開始,AlarmManager的機(jī)制都是非準(zhǔn)確傳遞,操作系統(tǒng)將會轉(zhuǎn)換鬧鐘,來最小化喚醒和電池使用。targetSdkVersion在API 19之前應(yīng)用仍將繼續(xù)使用以前的行為,所有的鬧鐘在要求準(zhǔn)確傳遞的情況下都會準(zhǔn)確傳遞。

從API 19以后,則采用了如下方法:
* setWindow(int, long, long, PendingIntent)
* setExact(int, long, PendingIntent)

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

主要問題

 1.API 19以后沒有了重復(fù)設(shè)置,那如果設(shè)置一個鬧鐘每天都準(zhǔn)確提醒呢?
 2.手機(jī)重啟之后,設(shè)置的鬧鐘是否還有效?
 3.應(yīng)用程序被停止之后,鬧鐘是否還有效? 

說實話,這些問題我相信大家肯定都遇到過,而且解決起來相當(dāng)費勁,確實是。來看我們?nèi)绾我灰唤鉀Q吧。

解決遇到的坑

API 19以后如何設(shè)置重復(fù)鬧鐘

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

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);
      }
    }

根據(jù)判斷系統(tǒng)版本,使用不同的設(shè)置鬧鐘的方法,進(jìn)行設(shè)置。接下來我們通過廣播接收系統(tǒng)發(fā)來的通知,進(jìn)行鬧鐘提醒。

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之后是否是重復(fù)鬧鐘,不為0,就再重新設(shè)置一遍。我們來一起看看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);
    }
  }

就這樣,重復(fù)的問題就解決了。

手機(jī)重啟之后,鬧鐘失效怎么解決

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

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

應(yīng)用程序被停止,鬧鐘失效

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

這個封裝的類庫的好處

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 超詳細(xì)SplashScreen入門教程

    Android 超詳細(xì)SplashScreen入門教程

    Android 12正式版即將發(fā)布,有一個非常顯著的視覺變化就是,Android 12強(qiáng)制給所有的App都增加了SplashScreen的功能。是的,即使你什么都不做,只要你的App安裝到了Android 12手機(jī)上,都會自動擁有這個新功能
    2022-03-03
  • Input系統(tǒng)之InputReader處理合成事件詳解

    Input系統(tǒng)之InputReader處理合成事件詳解

    這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理合成事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • android實現(xiàn)簡易登錄注冊界面及邏輯設(shè)計

    android實現(xiàn)簡易登錄注冊界面及邏輯設(shè)計

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)簡易登錄注冊界面及邏輯設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android?Flutter實現(xiàn)任意拖動的控件

    Android?Flutter實現(xiàn)任意拖動的控件

    使用flutter開發(fā)是需要控件能拖動,比如畫板中的元素,或者工具條等,所以本文為大家準(zhǔn)備了Flutter實現(xiàn)任意拖動控件的示例代碼,希望對大家有所幫助
    2023-07-07
  • Android編程根據(jù)系列圖片繪制動畫實例總結(jié)

    Android編程根據(jù)系列圖片繪制動畫實例總結(jié)

    這篇文章主要介紹了Android編程根據(jù)系列圖片繪制動畫的方法,以實例形式總結(jié)了Android根據(jù)圖片繪制動畫的常見情況與具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android split分割特殊字符取名稱的方法

    Android split分割特殊字符取名稱的方法

    這篇文章主要為大家詳細(xì)介紹了Android split分割特殊字符取名稱的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • android studio 使用adb 命令傳遞文件到android 設(shè)備的方法

    android studio 使用adb 命令傳遞文件到android 設(shè)備的方法

    這篇文章主要介紹了android studio 使用adb 命令傳遞文件到android 設(shè)備的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • Qt6.5.3?Android環(huán)境配置的實現(xiàn)

    Qt6.5.3?Android環(huán)境配置的實現(xiàn)

    本文主要介紹了Qt6.5.3?Android環(huán)境配置的實現(xiàn),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Android表格圖標(biāo)庫制作

    Android表格圖標(biāo)庫制作

    本篇文章主要給大家分享了在Android平臺上制作一個含有表格的圖標(biāo)庫實例,對此有興趣的朋友參考下吧。
    2018-01-01
  • Android 使用XML做動畫UI的深入解析

    Android 使用XML做動畫UI的深入解析

    在Android應(yīng)用程序,使用動畫效果,能帶給用戶更好的感覺。做動畫可以通過XML或Android代碼。本教程中,介紹使用XML來做動畫。在這里,介紹基本的動畫,如淡入,淡出,旋轉(zhuǎn)等,需要的朋友可以參考下
    2013-07-07

最新評論

崇文区| 临江市| 米易县| 宁南县| 文成县| 唐河县| 民乐县| 荣成市| 南郑县| 连州市| 开化县| 右玉县| 抚松县| 滨海县| 南京市| 淮北市| 太谷县| 大邑县| 建瓯市| 绥棱县| 桦南县| 东至县| 长泰县| 南郑县| 山西省| 安仁县| 衡东县| 福泉市| 辉南县| 新安县| 鲁山县| 全州县| 那曲县| 友谊县| 忻州市| 鸡泽县| 枣庄市| 商城县| 运城市| 昆明市| 山西省|