2019独角兽企业重金招聘Python工程师标准>>>

1.什么是AlarmManager?

按照Alarm+Manager的拼写可知,这是一个定时管理器,不能称为定时器,或者闹钟之类的,这样让人感觉他的重要性并不是那么高,功能那么简单。
作为管理器而言,首先是要有至少一个被管理者,否则就多此一举了。官方定义是,它是一种系统级别的提示服务,因此也就说他是一种可后台运行的
全局Service(不要担心创建了多余的Service,AlarmManager本身是一种已经被创建的Service)。

2.在java中timer也是一个定时器,那么与Alarm的区别是什么呢?

Alarm是一种系统级别的全局定时器,一般来说系统级别的程序不会被随意kill,timer是与之相反的程序级别的定时器,因此要受到屏幕熄灭,锁屏,
内存不足等影响而被kill。我们目前使用的一些IM聊天软件往往是借助alarm来实现的。

3.使用AlarmManager

下面是制作闹钟的一段程序

//创建响应(reponsone)意图,alarm出发时需要做出处理的Activity,BroadcastReceiver,Service
Intent alarmIntent = new Intent(SettingAlarmActivtiy.this, AlarmResponseActivity.class);alarmIntent.putExtra("title", "我的定时闹钟"); //自定义参数
alarmIntent.putExtra("content", "主人,起床了"); //自定义参数
//PendingIntent是一种持久的Intent,用来再次包装intent,使其具有持久性,requestcode有待确定
PendingIntent pi = PendingIntent.getActivity(this, 1024, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pi); //设定的一次性闹钟,这里决定是否使用绝对时间

4.首先,我们需要明白,AlarmManager的类型,也就是第一个参数的选择说明

AlarmManager.ELAPSED_REALTIME  = 0x00000003;
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,
可以通过调用SystemClock.elapsedRealtime()获得。   AlarmManager.ELAPSED_REALTIME_WAKEUP   = 0x00000002;
//能唤醒系统用法同ELAPSED_REALTIME。   AlarmManager.RTC  = 0x00000001;
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用
System.currentTimeMillis()获得。   AlarmManager.RTC_WAKEUP  = 0x00000000;
//能唤醒系统,属于硬件唤醒,也称为强制唤醒,这种常用语聊天软件的轮询,用法同RTC类型,系统值为 0 。   AlarmManager.POWER_OFF_WAKEUP = 0x00000004;
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型。

5.和通知一样Alarm从后台启动响应的Activity,这里不再说明,希望读者亲自试验。

6.再来看看,定时器的其他方法

//创建响应(reponsone)意图,alarm出发时需要做出处理的Activity,BroadcastReceiver,Service
Intent alarmIntent = new Intent(SettingAlarmActivtiy.this, AlarmResponseActivity.class);
alarmIntent.putExtra("title", "我的定时闹钟"); //自定义参数
alarmIntent.putExtra("content", "主人,起床了"); //自定义参数
//PendingIntent是一种持久的Intent,用来再次包装intent,使其具有持久性
PendingIntent pi = PendingIntent.getActivity(this, 1024, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP,SystemClock.elapsedRealtime(),5*1000, pi); //每5秒唤醒一次

7.执行间隔不精确放入定时器

//创建响应(reponsone)意图,alarm出发时需要做出处理的Activity,BroadcastReceiver,Service
//这里注意,如果设置成Activity,请设置lanchMode=singleTask
Intent alarmIntent = new Intent(SettingAlarmActivtiy.this, AlarmResponseActivity.class);
alarmIntent.putExtra("title", "我的定时闹钟"); //自定义参数
alarmIntent.putExtra("content", "主人,起床了"); //自定义参数
//PendingIntent是一种持久的Intent,用来再次包装intent,使其具有持久性
PendingIntent pi = PendingIntent.getActivity(this, 1024, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),10*1000, pi);//每次执行间隔不精确,有时具有较长具有延迟,

8.取消定时器

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(SettingAlarmActivtiy.this, AlarmResponseActivity.class);
PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 与上面的intent匹配(filterEquals(intent))的闹钟会被取消
alarmMgr.cancel(pendIntent);

这里再次强调,我设置的 Activity的lanchMode=singleTask,保证了Activity在栈中的唯一性,使得Activity不会重复创建,

如果你没有设置,当你感觉你回退的时候比较吃力的话,那不要怪我啊!

public class AlarmResponseActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle saveInstance) {super.onCreate(saveInstance);LayoutParams lp = getWindow().getAttributes();lp.alpha = 1.0f;getWindow().setAttributes(lp);getWindow().setBackgroundDrawableResource(R.drawable.avatar3);handleAlarm();}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);handleAlarm();}private void handleAlarm() {String title = getIntent().getStringExtra("title");String content = getIntent().getStringExtra("content");Toast.makeText(activity, title+"—"+content, Toast.LENGTH_SHORT).show();}}
<activityandroid:name="test.view.weitop.home.AlarmResponseActivity"android:windowSoftInputMode="adjustPan|stateAlwaysHidden"android:launchMode="singleTask"android:screenOrientation="portrait" >
</activity>

另外注意,如果使用BroadcastReceiver来处理时,需要将广播注册为全局广播,即在Manifest.xml中注册

9.对于AlarmManager的认识上,我们更应该明白,他是一个Service,并且具有系统级别的权限,有兴趣的读这个可以查看AlarmManager源码。

转载于:https://my.oschina.net/ososchina/blog/347753

Android 系统定时管理器AlarmManager的使用相关推荐

  1. 音效管理android,Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  2. 一个 epoll 连接句柄定时管理器

    一个 epoll 连接句柄定时管理器 当使用 epoll 作服务端框架,如果缓存了客户端到服务器的连接句柄(connfd),服务端需要管理起来,例如定时检查连接会话是否过期,自动清理连接等等.如下提供 ...

  3. Android系统下载管理DownloadManager

    转载: http://www.trinea.cn/android/android-downloadmanager/ http://www.trinea.cn/android/android-downl ...

  4. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  5. linux 引导管理器,linux系统引导管理器GRUB

    1.什么是多重操作系统引导管理器及工作原理: 系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引 ...

  6. [Android]之一:Android系统下载管理DownloadManager

    嗷,这个android系统下载管理DownloadManager功能还是蛮强大的.虽然老大只是让我做一个下载工具类给他们使用,但是想加深一下印象,接下来是摘抄笔记,以后也要自己再看看不要又忘了. 一. ...

  7. linux多系统引导管理,Linux 多重引导MBR与系统引导管理器GRUB.docx

    Linux 多重引导MBR与系统引导管理器GRUB Linux 多重引导MBR与系统引导管理器GRUB1 Linux 多重引导MBR简单的说,从开机到进入操作系统之前的流程应该是这样的:BIOS:开机 ...

  8. 计算机管理器为什么没有本地用户和组,windows7系统服务器管理器没有“本地用户和组”选项解决方法...

    本地用户和组功能可以分配本地用户帐户或组帐户的权限和权利.win7系统点击"计算机"图标右键"管理"来打开"计算机管理"中的"本地 ...

  9. win8计算机管理没本地用户和组,win7系统服务器管理器没有本地用户和组选项怎么办?...

    win7系统服务器管理器没有"本地用户和组"选项怎么办? 具体方法如下: 1.出现这种情况一般是组策略做限制了,打开运行gpedit.msc打开组策略编辑器; 2.依次点击,用户设 ...

最新文章

  1. 三分钟教你快速选择机器视觉传感器
  2. DirectX和DirectShow介绍和区别
  3. UWP 查找模板中的控件
  4. 简单话题:LED呼吸灯和串口LED指示灯
  5. 1445.32php,nginx实现mysql的负载均衡
  6. 产品经理必读:用户场景分析的四要素
  7. 实现两个Mysql数据库同步
  8. 网易漫画Swift混编实践
  9. 最新手机号段 归属地数据库(20191210,共439265条,包括最新的号段)
  10. 微软卸载工具msicuu2(附带资源)
  11. dell笔记本安装win7.ios
  12. 如何把PDF拆分成单页文档
  13. 小米android的手机根目录,手机网站根目录在哪?
  14. php expecting,php – 解析错误:语法错误,意外的’.’,expecting’,’或’;’
  15. 数学基础知识之Sin、cos画圆
  16. 【DockerCE】onlyoffice从7.2 版本开始默认启用JWT
  17. 生日祝福html_说祝福 | 祝4月的你生日快乐
  18. 英语学习(10个句子练到极致)
  19. Codeforces Round #731 (Div. 3)(ABCDEFG)
  20. h5中设置div中的内容水平并垂直居中

热门文章

  1. 人工智能——框架表示法
  2. UPS Online Tools(一) --- Tracking
  3. xposed环境搭建
  4. jQuery对象与DOM对象之间的转换方法
  5. android中的屏幕单位介绍
  6. IM系统中聊天记录模块的设计与实现
  7. jsf标签,jsp标签与jstl标签
  8. Creating and Interning Symbols
  9. linux 一句话备忘
  10. JBOSS 5.0.0GA的集群搭建