<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 10.5 AlarmManager(鬧鐘服務) ## 本節引言: > 本節帶來的Android中的AlarmManager(鬧鐘服務),聽名字我們知道可以通過它開發手機鬧鐘類的APP, 而在文檔中的解釋是:在特定的時刻為我們廣播一個指定的Intent,簡單說就是我們自己定一個時間, 然后當到時間時,AlarmManager會為我們廣播一個我們設定好的Intent,比如時間到了,可以指向某個 Activity或者Service!另外官方文檔中有一些要注意的地方: > > ![](http://www.runoob.com/wp-content/uploads/2015/10/97469413.jpg) > > 另外要注意一點的是,AlarmManager主要是用來在某個時刻運行你的代碼的,即時你的APP在那個特定 時間并沒有運行!還有,從API 19開始,Alarm的機制都是非準確傳遞的,操作系統將會轉換鬧鐘 ,來最小化喚醒和電池的使用!某些新的API會支持嚴格準確的傳遞,見 setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。 targetSdkVersion在API 19之前應用仍將繼續使用以前的行為,所有的鬧鐘在要求準確傳遞的情況 下都會準確傳遞。更多詳情可見官方API文檔:[AlarmManager](http://androiddoc.qiniudn.com/reference/android/app/AlarmManager.html) ## 1.Timer類與AlarmManager類區別: > 如果你學過J2SE的話,那么你對Timer肯定不會陌生,定時器嘛,一般寫定時任務的時候 肯定離不開他,但是在Android里,他卻有個短板,不太適合那些需要長時間在后臺運行的 定時任務,因為Android設備有自己的休眠策略,當長時間的無操作,設備會自動讓CPU進入 休眠狀態,這樣就可能導致Timer中的定時任務無法正常運行!而AlarmManager則不存在 這種情況,因為他具有喚醒CPU的功能,可以保證每次需要執行特定任務時CPU都能正常工作, 或者說當CPU處于休眠時注冊的鬧鐘會被保留(可以喚醒CPU),但如果設備被關閉,或者重新 啟動的話,鬧鐘將被清除!(Android手機關機鬧鐘不響...) ## 2.獲得AlarmManager實例對象: ``` AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); ``` ## 3.相關方法講解: > * **set**(int type,long startTime,PendingIntent pi):一次性鬧鐘 > * **setRepeating**(int type,long startTime,long intervalTime,PendingIntent pi): 重復性鬧鐘,和3有區別,3鬧鐘間隔時間不固定 > * **setInexactRepeating**(int type,long startTime,long intervalTime,PendingIntent pi): 重復性鬧鐘,時間不固定 > * **cancel**(PendingIntent pi):取消AlarmManager的定時服務 > * **getNextAlarmClock**():得到下一個鬧鐘,返回值AlarmManager.AlarmClockInfo > * **setAndAllowWhileIdle**(int type, long triggerAtMillis, PendingIntent operation) 和set方法類似,這個鬧鐘運行在系統處于低電模式時有效 > * **setExact**(int type, long triggerAtMillis, PendingIntent operation): 在規定的時間精確的執行鬧鐘,比set方法設置的精度更高 > * **setTime**(long millis):設置系統墻上的時間 > * **setTimeZone**(String timeZone):設置系統持續的默認時區 > * **setWindow**(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation): 設置一個鬧鐘在給定的時間窗觸發。類似于set,該方法允許應用程序精確地控制操作系統調 整鬧鐘觸發時間的程度。 **關鍵參數講解**: > * **Type**(鬧鐘類型): 有五個可選值: AlarmManager.**ELAPSED_REALTIME**: 鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對于系統啟動開始),狀態值為3; AlarmManager.**ELAPSED_REALTIME_WAKEUP** 鬧鐘在睡眠狀態下會喚醒系統并執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值為2; AlarmManager.**RTC** 鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值為1; AlarmManager.**RTC_WAKEUP** 表示鬧鐘在睡眠狀態下會喚醒系統并執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值為0; AlarmManager.**POWER_OFF_WAKEUP** 表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間,狀態值為4;不過本狀態好像受SDK版本影響,某些版本并不支持; > * **startTime**:鬧鐘的第一次執行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。 需要注意的是,本屬性與第一個屬性(type)密切相關,如果第一個參數對應的鬧鐘使用的是相對時間 (ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本屬性就得使用相對時間 (相對于系統啟動時間來說),比如當前時間就表示為:SystemClock.elapsedRealtime(); 如果第一個參數對應的鬧鐘使用的是絕對時間(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP), 那么本屬性就得使用絕對時間,比如當前時間就表示 為:System.currentTimeMillis()。 > * **intervalTime**:表示兩次鬧鐘執行的間隔時間,也是以毫秒為單位. > * **PendingIntent**:綁定了鬧鐘的執行動作,比如發送一個廣播、給出提示等等。 PendingIntent是Intent的封裝類。需要注意的是,如果是通過啟動服務來實現鬧鐘提 示的話,PendingIntent對象的獲取就應該采用Pending.getService (Context c,int i,Intent intent,int j)方法;如果是通過廣播來實現鬧鐘 提示的話,PendingIntent對象的獲取就應該采用 PendingIntent.getBroadcast (Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式來實 現鬧鐘提示的話,PendingIntent對象的獲取就應該采用 PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。 如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。 ## 4.使用示例:一個簡單的定時任務 > 要說的是,此例子只在Android 4.4以下的系統可行,5.0以上并不可行,后續如果有5.0 以上AlarmManager的解決方案,到時再補上!另外,這里用set方法可能有點不準,如果要 更精確的話可以使用setExtra()方法來設置AlarmManager! **運行效果圖**: ![](http://www.runoob.com/wp-content/uploads/2015/10/64437379.jpg) ![](http://www.runoob.com/wp-content/uploads/2015/10/40691071.jpg) **實現代碼**: 首先一個簡單的布局文件:**activity_main.xml**,另外在res創建一個raw文件夾,把音頻文件丟進去! 另外創建一個只有外層布局的**activity_clock.xml**作為鬧鐘響時Activity的布局!沒東西,就不貼了 ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_set" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="設置鬧鐘" /> <Button android:id="@+id/btn_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="關閉鬧鐘" android:visibility="gone" /> </LinearLayout> ``` 接著是**MainActivity.java**,也很簡單: ``` public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button btn_set; private Button btn_cancel; private AlarmManager alarmManager; private PendingIntent pi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { btn_set = (Button) findViewById(R.id.btn_set); btn_cancel = (Button) findViewById(R.id.btn_cancel); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Intent intent = new Intent(MainActivity.this, ClockActivity.class); pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); btn_set.setOnClickListener(this); btn_cancel.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_set: Calendar currentTime = Calendar.getInstance(); new TimePickerDialog(MainActivity.this, 0, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //設置當前時間 Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); // 根據用戶選擇的時間來設置Calendar對象 c.set(Calendar.HOUR, hourOfDay); c.set(Calendar.MINUTE, minute); // ②設置AlarmManager在Calendar對應的時間啟動Activity alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); Log.e("HEHE",c.getTimeInMillis()+""); //這里的時間是一個unix時間戳 // 提示鬧鐘設置完畢: Toast.makeText(MainActivity.this, "鬧鐘設置完畢~"+ c.getTimeInMillis(), Toast.LENGTH_SHORT).show(); } }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime .get(Calendar.MINUTE), false).show(); btn_cancel.setVisibility(View.VISIBLE); break; case R.id.btn_cancel: alarmManager.cancel(pi); btn_cancel.setVisibility(View.GONE); Toast.makeText(MainActivity.this, "鬧鐘已取消", Toast.LENGTH_SHORT) .show(); break; } } } ``` 然后是鬧鈴頁面的**ClockActivity.java**: ``` /** * Created by Jay on 2015/10/25 0025. */ public class ClockActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_clock); mediaPlayer = mediaPlayer.create(this,R.raw.pig); mediaPlayer.start(); //創建一個鬧鐘提醒的對話框,點擊確定關閉鈴聲與頁面 new AlertDialog.Builder(ClockActivity.this).setTitle("鬧鐘").setMessage("小豬小豬快起床~") .setPositiveButton("關閉鬧鈴", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mediaPlayer.stop(); ClockActivity.this.finish(); } }).show(); } } ``` 代碼非常簡單,核心流程如下: > * AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); **獲得系統提供的AlarmManager服務的對象** > * **Intent設置要啟動的組件**: Intent intent = new Intent(MainActivity.this, ClockActivity.class); > * **PendingIntent對象設置動作,啟動的是Activity還是Service,又或者是廣播!** PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); > * **調用AlarmManager的set( )方法設置單次鬧鐘的鬧鐘類型,啟動時間以及PendingIntent對象!** alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi); 另外假如出現鬧鈴無效的話,你可以從這些方面入手: > 1.系統版本或者手機,5.0以上基本沒戲,小米,自行百度吧~ 2.ClockActivity有注冊沒? 3.假如你用的是alarmManager發送廣播,廣播再激活Activity的話,則需要為Intent設置一個flag: i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4\. ![](http://www.runoob.com/wp-content/uploads/2015/10/31411707.jpg) 這些地方沒寫錯吧~別把getActivity寫成了getService等哦~ 另外,關于AlarmManager結合后來Service實現定時后臺任務的例子,可見: [4.2.2 Service進階](http://www.runoob.com/w3cnote/android-tutorial-service-2.html "4.2.2 Service進階") ## 5.代碼示例下載: [AlarmManagerDemo.zip](http://static.runoob.com/download/AlarmManagerDemo.zip) ## 本節小結: > 好的,本節跟大家講解了Android中的AlarmManager(鬧鐘服務)的使用,除了可以像例子那樣定制 一個自己的鬧鐘,也可以結合Service,Thread來完成輪詢等,用法多多,還需各位自行探究,嗯 本節就到這里,謝謝~![](http://www.runoob.com/wp-content/uploads/2015/10/77734594.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看