正文  UI设计 > AlarmManager >

Android之AlarmManager

// 取消已经注册的与参数匹配的定时器void cancel(PendingIntent operation)//注册一个新的延迟定时器void set(int type, long triggerAtTime, PendingIntent operation)//注册一个重复类型的定时器voi......

// 取消已经注册的与参数匹配的定时器

  1. void cancel(PendingIntent operation)
  2. //注册一个新的延迟定时器
  3. void set(int type, long triggerAtTime, PendingIntent operation)
  4. //注册一个重复类型的定时器
  5. void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
  6. //注册一个非精密的重复类型定时器
  7. void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
  8. //设置时区
  9. void setTimeZone(String timeZone)
// 取消已经注册的与参数匹配的定时器   
void   cancel(PendingIntent operation)  
//注册一个新的延迟定时器
void   set(int type, long triggerAtTime, PendingIntent operation)  
//注册一个重复类型的定时器
void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)  
//注册一个非精密的重复类型定时器
void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
//设置时区  
void   setTimeZone(String timeZone) 


 

 

定时器主要类型:

 

源码copy to clipboard打印?
  1. public static final int ELAPSED_REALTIME
  2. // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
  3.  
  4. public static final int ELAPSED_REALTIME_WAKEUP
  5. //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
  6.  
  7. public static final int RTC
  8. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
  9.  
  10. public static final int RTC_WAKEUP
  11. //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
  12.  
  13. Public static final int POWER_OFF_WAKEUP
  14. //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。
public   static   final   int  ELAPSED_REALTIME  
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。   
  
public   static   final   int  ELAPSED_REALTIME_WAKEUP  
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。   
  
public   static   final   int  RTC  
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。   
  
public   static   final   int  RTC_WAKEUP  
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。   
  
Public static   final   int  POWER_OFF_WAKEUP  
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。   

 

 

 

当你的应用不在运行,而此时你仍然需要你的应用去执行一些操作(比如,短信拦截),只有这种时候才使用AlarmManager, 其他正常情况下的,推荐使用Handler。

 

AlarmManager 生命周期:

repeating AlarmManager一旦启动就会一直在后台运行(除非执行cancel方法),可以在“应用管理”中看到这个应用状态是正在运行。 “强行停止”可以让Alarmmanager停掉。

尝试了几种任务管理器, 都只能重置计数器(确实释放内存了),但都无法关闭定时器,只有系统自带的“强行停止”奏效。

 

 

如果某个AlarmManager已经启动, 程序又再次去启动它,只要PendingIntent是一样,那么之前那个AlarmManager会被release掉。

 

如何使用AlarmManager?

使用AlarmManager共有三种方式, 都是通过PendingIntent。

 

源码copy to clipboard打印?
  1. getActivity(Context, int, Intent, int)
  2.  
  3. getBroadcast(Context, int, Intent, int)
  4.  
  5. getService(Context, int, Intent, int)
getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

这边就举一个使用BroadCast的例子。

 

 

首先是创建一个BroadCast类,需要继承BroadCastReceiver, 如下:

 

源码copy to clipboard打印?
  1. /*
  2. * Copyright (c) 2011, Yulong Information Technologies
  3. * All rights reserved.
  4. *
  5. * @Project: AlarmTest
  6. * @author: Robot
  7. */
  8. package com.yfz;
  9.  
  10. import android.content.BroadcastReceiver;
  11. import android.content.Context;
  12. import android.content.Intent;
  13. import android.util.Log;
  14.  
  15. /**
  16. * @author Robot
  17. * @weibo http://weibo.com/feng88724
  18. * @date Nov 18, 2011
  19. */
  20. public class ActionBroadCast extends BroadcastReceiver {
  21.  
  22. private static int num = 0;
  23. /* (non-Javadoc)
  24. * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
  25. */
  26. @Override
  27. public void onReceive(Context context, Intent intent) {
  28. // TODO Auto-generated method stub
  29. Log.e("ActionBroadCast", "New Message !" + num++);
  30. }
  31.  
  32. }
/*
 *	Copyright (c) 2011, Yulong Information Technologies
 *	All rights reserved.
 *  
 *  @Project: AlarmTest
 *  @author: Robot	
 */
package com.yfz;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * @author Robot
 * @weibo http://weibo.com/feng88724
 * @date Nov 18, 2011	
 */
public class ActionBroadCast extends BroadcastReceiver {
	
	private static int num = 0;
	/* (non-Javadoc)
	 * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
	 */
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Log.e("ActionBroadCast", "New Message !" + num++);
	}

}

下面就让我们启动AlarmManager, 这边就直接在Activity中启动了, 如下:

 

 

源码copy to clipboard打印?
  1. package com.yfz;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlarmManager;
  5. import android.app.PendingIntent;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8.  
  9. public class AlarmTestActivity extends Activity {
  10. /** Called when the activity is first created. */
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15.  
  16. AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
  17.  
  18. PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(this, ActionBroadCast.class), Intent.FLAG_ACTIVITY_NEW_TASK);
  19. long now = System.currentTimeMillis();
  20. am.setInexactRepeating(AlarmManager.RTC_WAKEUP, now, 3000, pi);
  21. }
  22. }
package com.yfz;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;

public class AlarmTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(this, ActionBroadCast.class), Intent.FLAG_ACTIVITY_NEW_TASK);
        long now = System.currentTimeMillis();
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, now, 3000, pi);
    }
}

 

这边用Repeating的方式。 每隔3秒发一条广播消息过去。RTC_WAKEUP的方式,保证即使手机休眠了,也依然会发广播消息。

最后看一下AndroidManifest文件,主要是注册一下Activity和BroadCast。 (实际使用中最好再加个filter,自己定义一个Action比较好)

 

源码copy to clipboard打印?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.yfz"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk android:minSdkVersion="7" />
  8.  
  9. <application
  10. android:icon="@drawable/ic_launcher"
  11. android:label="@string/app_name" >
  12. <activity
  13. android:label="@string/app_name"
  14. android:name=".AlarmTestActivity" >
  15. <intent-filter >
  16. <action android:name="android.intent.action.MAIN" />
  17.  
  18. <category android:name="android.intent.category.LAUNCHER" />
  19. </intent-filter>
  20. </activity>
  21. <receiver
  22. android:name="ActionBroadCast">
  23.  
  24. </receiver>
  25. </application>
  26.  
  27. </manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yfz"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AlarmTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name="ActionBroadCast">
            
        </receiver>
    </application>

</manifest>

Service的其实也差不多,只要在OnStart()方法中写需要执行的操作即可。

做了一个例子,包含了使用AlarmManager的所有三种方式。已经上传至CSDN,下载地址: http://download.csdn.net/detail/feng88724/3812718 。 截图: