天天看點

android之定時器AlarmManager .

 果圖:

android之定時器AlarmManager .

       當我們點選定時時,會彈出一個時間選擇器,標明好時間之後,系統便可以進行定時了。注意,這裡可不是會真的響鈴,我們在定時的任務裡并沒有添加響鈴的代碼,隻是在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代表定時模式,這裡的定時模式主要有以下幾種。

android之定時器AlarmManager .

繼續閱讀