閱讀619 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android之定時器AlarmManager .

 果圖:

       當我們點擊定時時,會彈出一個時間選擇器,選定好時間之後,係統便可以進行定時了。注意,這裏可不是會真的響鈴,我們在定時的任務裏並沒有添加響鈴的代碼,隻是在Logcat中做了個簡單的打印。本例子重點在於講解在android中AlarmManager的使用。

      activity的代碼:

 

  1. package cn.com.chenzheng_java;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.AlarmManager;  
  7. import android.app.PendingIntent;  
  8. import android.app.TimePickerDialog;  
  9. import android.app.TimePickerDialog.OnTimeSetListener;  
  10. import android.content.Intent;  
  11. import android.os.Bundle;  
  12. import android.util.Log;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.CheckBox;  
  17. import android.widget.CompoundButton;  
  18. import android.widget.TimePicker;  
  19. import android.widget.CompoundButton.OnCheckedChangeListener;  
  20.   
  21. public class AlarmManagerActivity extends Activity implements OnClickListener,OnTimeSetListener,OnCheckedChangeListener{  
  22.     Calendar calendar = Calendar.getInstance();// 代表當前時間的日曆  
  23.     Button button1 ;  
  24.     CheckBox checkBox;  
  25.     boolean flag = false ;// 是否隻執行一次  
  26.       
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.alarm);  
  31.           
  32.         button1 = (Button) findViewById(R.id.button_alarm1);  
  33.         checkBox = (CheckBox) findViewById(R.id.checkBox1_alarm);  
  34.         checkBox.setOnCheckedChangeListener(this);  
  35.           
  36.         button1.setOnClickListener(this);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onClick(View v) {  
  41.         if(v==button1){  
  42.             calendar.setTimeInMillis(System.currentTimeMillis());  
  43.             new TimePickerDialog(AlarmManagerActivity.thisthis,  
  44.                     calendar.get(Calendar.HOUR_OF_DAY),  
  45.                     calendar.get(Calendar.MINUTE), true).show();  
  46.         }  
  47.     }  
  48.   
  49.     /** 
  50.      * 當我們設置了新時間時觸發。 
  51.      */  
  52.     @Override  
  53.     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {  
  54.           
  55.         // 將時間設置為定時的時間  
  56.         calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);  
  57.         calendar.set(Calendar.MINUTE, minute);  
  58.           
  59.         Intent intent = new Intent(AlarmManagerActivity.this,MyAlarmBroadCast.class);  
  60.         PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);  
  61.           
  62.         /*** 
  63.          * 獲取全局定時器的服務管理器 
  64.          */  
  65.         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  
  66.       
  67.         if(flag){  
  68.               
  69.           
  70.         /** 
  71.          * 指定的任務隻會執行一次,如果該pendingIntent指定的任務已經被執行過了,那麼該方法直接會被cancel掉。 
  72.          *  set(int type, long triggerAtTime, PendingIntent operation) 
  73.          *  type 指定定時模式。 
  74.          *  triggerAtTime 觸發任務的時間。該參數和定時模式息息相關 
  75.          *  operation 該參數指定一個廣播Intent,當時間到了時,係統會廣播裏麵的intent,觸發相應的廣播接收者執行某些操作,比如響鈴…… 
  76.          */  
  77.         alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);  
  78.         }  
  79.         else  
  80.         {  
  81.             /** 
  82.              * 通過該方法指定的任務會一直間隔執行,第三個參數就指定了執行的時間間隔 
  83.              * 如果我們想取消的話,請使用:alarmManager.cancel(pendingIntent); 
  84.              * 注意,這裏的pendingIntent要和setRepeating方法中的一致哦。 
  85.              */  
  86.             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);    
  87.         }  
  88.         Log.i("通知""定時成功!");  
  89.           
  90.     }  
  91.       
  92.       
  93.       
  94.     @Override  
  95.     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  
  96.         flag = !isChecked;  
  97.     }  
  98.       
  99.       
  100.       
  101.       
  102. }  

 

alarm.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent" android:layout_height="match_parent"  
  4.     android:orientation="vertical">  
  5.     <AnalogClock android:id="@+id/analogClock1_alarm"  
  6.         android:layout_width="wrap_content" android:layout_height="wrap_content"></AnalogClock>  
  7.     <CheckBox android:text="是否重複響鈴" android:id="@+id/checkBox1_alarm" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>  
  8.     <Button android:text="定時" android:id="@+id/button_alarm1"  
  9.         android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
  10. </LinearLayout>  

 

MyAlarmBroadCast.java

 

  1. package cn.com.chenzheng_java;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7. import android.widget.Toast;  
  8.   
  9. /** 
  10.  * 聲明接受AlarmManager時間到了時發布的廣播 
  11.  * @author chenzheng_java 
  12.  */  
  13. public class MyAlarmBroadCast extends BroadcastReceiver{  
  14.   
  15.     @Override  
  16.     public void onReceive(Context context, Intent intent) {  
  17.         Log.i("通知""收到了廣播");  
  18.         // 可以在此處添加響鈴的代碼  
  19.     }  
  20.       
  21. }  

 

Manifest.xml代碼:

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="https://schemas.android.com/apk/res/android"  
  3.       package="cn.com.chenzheng_java"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name="AlarmManagerActivity"  
  10.                   android:label="@string/app_name">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category android:name="android.intent.category.LAUNCHER" />  
  14.             </intent-filter>  
  15.         </activity>  
  16.     <receiver android:name="MyAlarmBroadCast"/>          
  17.     </application>  
  18. </manifest>  

 

------------------------------------------------------------------

 

AlarmManager的使用機製有的稱唿為全局定時器,有的稱唿為鬧鍾。通過對它的使用,個人覺得叫全局定時器比較合適,其實它的作用和Timer有點相似。都有兩種相似的用法:(1)在指定時長後執行某項操作(2)周期性的執行某項操作

使用的步驟:

第一:獲取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);

第二:通過AlarmManager的set和setRepeating方法定時。可以通過cancel()方法取消定時。

      在set和setRepeating方法中,第一個參數type代表定時模式,這裏的定時模式主要有以下幾種。

 

 

 

最後更新:2017-04-02 06:51:55

  上一篇:go IE(微軟)瀏覽器擴展開發初探
  下一篇:go 關於android輸入框被鍵盤遮擋的問題