全局定时器AlarmManager

自从知道了android中Timer在手机锁屏的时候不会正常倒计时后,就寻找到了另外一种全局的计时器AlarmManager,它是android中提供的一个系统服务,即使手机在锁屏的情况下也能倒计时。短时间的计时是没问题的,长时间的倒计时正在进行测试。

下面先了解下AlarmManager的一些方法和属性:

AlarmManager 包含的主要方法:

// 取消已经注册的与参数匹配的定时器
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)

定时器主要类型:

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。

getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

==========================代码示例===========================================

package com.aibb.alarmmanagertest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Environment;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;

public class AlarmManagerService extends Service{

private class AlarmOnBroadcastReciver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(“com.aibb.alarmamanger.start”)){
logTimeMsg(“alarm manager end:”);
}
}

}

@Override
public void onCreate() {
super.onCreate();
//一定要注册reveicer
AlarmOnBroadcastReciver reve = new AlarmOnBroadcastReciver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(“com.aibb.alarmamanger.start”);
this.registerReceiver(reve, intentFilter);

startAlarmManager();
}

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

private void startAlarmManager() {
Intent intent =new Intent(“com.aibb.alarmamanger.start”);
PendingIntent sender=PendingIntent
.getBroadcast(this, 0, intent, 0);
//开始时间
long firstime=SystemClock.elapsedRealtime();//System.currentTimeMillis();//SystemClock.elapsedRealtime();
long currenttime = System.currentTimeMillis();
firstime+=1000;
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);

//如果是周期性的执行,就需要使用SystemClock.elapsedRealtime() time since boot
/*am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
, firstime, 5*1000, sender);*/
// am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime+180*1000, sender);
am.set(AlarmManager.RTC_WAKEUP, currenttime+1800*1000, sender);
logTimeMsg(“alarm manager start:”);
}

private static final String TAG = AlarmManagerActivity.class.getSimpleName();

private Writer logWriter;

private File logFile;

/**
* 记录Timer的执行时间
* @param location
*/
public void logTimeMsg(String prefixStr) {
if (null == logFile) {
logFile = new File(Environment.getExternalStorageDirectory(),”AlarmManagerTime.txt”);
}
if (null == logWriter) {
try {
logWriter = new FileWriter(logFile, true);
} catch (Exception e) {
Log.e(“EnvironmentChangeReceiver”, e.getMessage(), e);
}
}
try {
String jsonString = prefixStr;
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
String time = sdf.format(date);;
logWriter.write(jsonString+”:” +time+ “\r\n”);
logWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据