AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent。而使用Intent的时候,我们还需要它执行一个动作,如startActivity,startService,startBroadcast,才能使Intent有用。通常我们使用PendingIntent,它可以理解为对Intent的封装,包含了指定的动作。

我们可以通过PendingIntent的静态方法得到一个PendingIntent对象,如下:

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);

使用PendingIntent的getBroadcast (Context context, int requestCode, Intent intent, int flags)方法可以得到一个发送广播动作的PendingIntent对象。其中getBroadcast的第4个参数可以为以下4个常量或其他支持使用Intent.fillIn()来控制它的变量:

FLAG_CANCEL_CURRENT:如果描述的PendingIntent对象已经存在时,会先取消当前的PendingIntent对象再生成新的。

FLAG_NO_CREATE:如果描述的PendingIntent对象不存在,它会返回null而不是去创建它。

FLAG_ONE_SHOT:创建的PendingIntent对象只使用一次。

FLAG_UPDATE_CURRENT:如果描述的PendingIntent对象存在,则保留它,并将新的PendingIntent对象的数据替换进去。

接下来看AlarmManager,我们通过以下代码来取得AlarmManager对象。

 AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

AlarmManager对象中常用的方法有三个:

1、set(int type,long startTime,PendingIntent pi),用于设置一次闹钟。

2、setRepeating(int type,long startTime,long intervalTime,PendingIntent pi),用于设置重复闹钟。

3、setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi),同样是用于设置重复闹钟,但是它是不准确的,相对于第二个方法,也更加节能。因为系统会将差不多的闹钟进行合并,以避免在不必要地唤醒设备。

在上面的三个方法中,type为闹钟的类型,它可以使用以下四个常量:

ELAPSED_REALTIME:闹钟在睡眠状态下不可用,使用的是相对系统启动时间。

ELAPSED_REALTIME_WAKEUP:闹钟在睡眠状态下可用,使用的是相对系统启动时间。

RTC:闹钟在睡眠状态下不可用,使用的是真实时间。

RTC_WAKEUP:闹钟在睡眠状态下可用,使用的是真实时间。

startTime为闹钟开始时间。

intervalTime为闹钟间隔,在第三个方法中,内置的几个变量如下:

INTERVAL_FIFTEEN_MINUTES 

INTERVAL_HALF_HOUR 

INTERVAL_HOUR 

INTERVAL_HALF_DAY 

INTERVAL_DAY

如果我们设定的是发送广播的闹钟,我们还需要写一个广播接收器,并对其进行注册,它才会在闹钟开始的时候接收到广播。

如果要设定启动Activity或Service的闹钟,则在创建PendingIntent的时候,首先Intent对象需设定指定的Activity或Service的class对象,然后对应的调用PendingIntent.getActivity()或PendingIntent.getService()方法。

下面以设置发送广播的闹钟代码实例来看AlarmManager的使用:

首先设定一个闹钟:

        Intent intent = new Intent("pw.msdx.ACTION_SEND");
        PendingIntent sendIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        am.cancel(sendIntent);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60 * 10 * 1000, sendIntent);

在上面的例子中,就会从当前的时间开始,每10分钟启动一次闹钟提醒。需要注意的是,如果设定的开始时间已经过去,它会马上启动闹钟提醒。

接下来需要写一个广播接收器来接收这个广播并进行处理。

代码如下:

public class SendReceiver extends BroadcastReceiver {
    public final static String ACTION_SEND = "pw.msdx.ACTION_SEND";

    @Override
    public void onReceive(final Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_SEND.equals(action)) {
            Log.i("SendReceiver", "send a message");
        }
    }
}

然后我们还需要注册这个广播接收器,这样它才能接收到广播。这里采用的是静态注册的方法,在AndroidManifest里进行注册:

        <receiver
            android:name=".SendReceiver"
            android:enabled="true"
            android:exported="true"
             >
            <intent-filter>
                <action android:name="pw.msdx.ACTION_SEND"/>
            </intent-filter>
        </receiver>

最新文章

  1. macOS 10.12 解决模拟器不流畅的一段命令行
  2. eclipse中jsp文档无语法着色,安装Eclipse Java Web Developer Tools插件
  3. Android getevent
  4. android mk odex问题 push apk 不生效
  5. [NOIP2012] 提高组 洛谷P1084 疫情控制
  6. 《DSP using MATLAB》示例Example4.9
  7. MySQL5.5 RPM安装的默认安装路径
  8. hdu 4001 dp 2011大连赛区网络赛A
  9. 关于P,V操作理解的分析
  10. SU sugethw命令学习
  11. boost之mutex scoped_lock
  12. 本地代码git到github上
  13. poj 1979 Red and Black(dfs水题)
  14. Python 自动化测试报告HTMLTestRunner
  15. Thread.join()的使用
  16. 在ROS中使用花生壳的域名服务
  17. CentOS 6.5 x64下查找依赖包,或用YUM安装
  18. 深入解析HashMap、HashTable
  19. 【6集iCore3_ADP触摸屏驱动讲解视频】6-2 基于FSMC总线的ARM与FPGA通信
  20. JS获取坐标

热门文章

  1. 中断下半部处理之tasklet
  2. ●BZOJ 1854 [Scoi2010]游戏
  3. Linux学习之CentOS(十七)-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 (转)
  4. Exchange Server 2010升级到Exchange Server 2016
  5. mysql数据库索引类型和原理
  6. Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问
  7. python学习之路web框架续
  8. python笔记一(语言简介、解释器、输入输出)
  9. vuejs关于函数式组件的探究
  10. 拾遗与填坑《深度探索C++对象模型》3.2节