果圖:
當我們點選定時時,會彈出一個時間選擇器,標明好時間之後,系統便可以進行定時了。注意,這裡可不是會真的響鈴,我們在定時的任務裡并沒有添加響鈴的代碼,隻是在logcat中做了個簡單的列印。本例子重點在于講解在android中alarmmanager的使用。
activity的代碼:
view plaincopy to clipboardprint?
package cn.com.chenzheng_java;
import java.util.calendar;
import android.app.activity;
import android.app.alarmmanager;
import android.app.pendingintent;
import android.app.timepickerdialog;
import android.app.timepickerdialog.ontimesetlistener;
import android.content.intent;
import android.os.bundle;
import android.util.log;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.checkbox;
import android.widget.compoundbutton;
import android.widget.timepicker;
import android.widget.compoundbutton.oncheckedchangelistener;
public class alarmmanageractivity extends activity implements onclicklistener,ontimesetlistener,oncheckedchangelistener{
calendar calendar = calendar.getinstance();// 代表目前時間的月曆
button button1 ;
checkbox checkbox;
boolean flag = false ;// 是否隻執行一次
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.alarm);
button1 = (button) findviewbyid(r.id.button_alarm1);
checkbox = (checkbox) findviewbyid(r.id.checkbox1_alarm);
checkbox.setoncheckedchangelistener(this);
button1.setonclicklistener(this);
}
public void onclick(view v) {
if(v==button1){
calendar.settimeinmillis(system.currenttimemillis());
new timepickerdialog(alarmmanageractivity.this, this,
calendar.get(calendar.hour_of_day),
calendar.get(calendar.minute), true).show();
}
/**
* 當我們設定了新時間時觸發。
*/
public void ontimeset(timepicker view, int hourofday, int minute) {
// 将時間設定為定時的時間
calendar.set(calendar.hour_of_day, hourofday);
calendar.set(calendar.minute, minute);
intent intent = new intent(alarmmanageractivity.this,myalarmbroadcast.class);
pendingintent pendingintent = pendingintent.getbroadcast(getapplicationcontext(), 0, intent, 0);
/***
* 擷取全局定時器的服務管理器
*/
alarmmanager alarmmanager = (alarmmanager) getsystemservice(alarm_service);
if(flag){
/**
* 指定的任務隻會執行一次,如果該pendingintent指定的任務已經被執行過了,那麼該方法直接會被cancel掉。
* set(int type, long triggerattime, pendingintent operation)
* type 指定定時模式。
* triggerattime 觸發任務的時間。該參數和定時模式息息相關
* operation 該參數指定一個廣播intent,當時間到了時,系統會廣播裡面的intent,觸發相應的廣播接收者執行某些操作,比如響鈴……
alarmmanager.set(alarmmanager.rtc_wakeup, calendar.gettimeinmillis(), pendingintent);
else
{
/**
* 通過該方法指定的任務會一直間隔執行,第三個參數就指定了執行的時間間隔
* 如果我們想取消的話,請使用:alarmmanager.cancel(pendingintent);
* 注意,這裡的pendingintent要和setrepeating方法中的一緻哦。
*/
alarmmanager.setrepeating(alarmmanager.rtc_wakeup, calendar.gettimeinmillis(), 5*1000, pendingintent);
log.i("通知", "定時成功!");
public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) {
flag = !ischecked;
}
alarm.xml
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">
<analogclock android:id="@+id/analogclock1_alarm"
android:layout_width="wrap_content" android:layout_height="wrap_content"></analogclock>
<checkbox android:text="是否重複響鈴" android:id="@+id/checkbox1_alarm" android:layout_width="wrap_content" android:layout_height="wrap_content"></checkbox>
<button android:text="定時" android:id="@+id/button_alarm1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></button>
</linearlayout>
myalarmbroadcast.java
import android.content.broadcastreceiver;
import android.content.context;
import android.widget.toast;
/**
* 聲明接受alarmmanager時間到了時釋出的廣播
* @author chenzheng_java
*/
public class myalarmbroadcast extends broadcastreceiver{
public void onreceive(context context, intent intent) {
log.i("通知", "收到了廣播");
// 可以在此處添加響鈴的代碼
manifest.xml代碼:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.com.chenzheng_java"
android:versioncode="1"
android:versionname="1.0">
<uses-sdk android:minsdkversion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="alarmmanageractivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<receiver android:name="myalarmbroadcast"/>
</application>
</manifest>
------------------------------------------------------------------
alarmmanager的使用機制有的稱呼為全局定時器,有的稱呼為鬧鐘。通過對它的使用,個人覺得叫全局定時器比較合适,其實它的作用和timer有點相似。都有兩種相似的用法:(1)在指定時長後執行某項操作(2)周期性的執行某項操作
使用的步驟:
第一:擷取管理器。alarmmanager alarmmanager = this.getsystemservice(alarm_service);
第二:通過alarmmanager的set和setrepeating方法定時。可以通過cancel()方法取消定時。
在set和setrepeating方法中,第一個參數type代表定時模式,這裡的定時模式主要有以下幾種。