AlarmManager是Android的全局定时器。就是在指定时间做一个事情(封装在PendingIntent)。通过PendingIntent的getActivity()、getService()或getBroadcast()来执行。

听起来AlarmManager和Timer很类似,但是Timer有可能因为手机休眠而被杀掉服务,但是AlarmManager可以做到唤醒手机。

创建方式

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

注:ALARM_SERVIC是context的一个常量。

闹钟类型

RTC_WAKEUP

表示闹钟在睡眠状态下唤醒系统并执行提示功能,绝对时间。

RTC

睡眠状态下不可用,绝对时间。

ELAPSED_REALTIME_WAKEUP

睡眠状态下可用,相对时间。

ELAPSED_REALTIME

睡眠状态下不可用,相对时间。

以上绝对时间就是手机的时间,相对时间是相对于当前开机时间来说。例如如果是绝对时间,那么你测试可以通过修改系统时间来提前触发。而相对时间的使用场景是强调多久之后触发,例如2小时后,这个时候把时间修改到2小时后也是没用的。

注:以前还有一个POWER_OFF_WAKEUP,即使在关机后还能提醒,但是Android4.0以后就没有了。

常用方法

set(int type, long triggerAtMillis, PendingIntent operation)

该方法用于设置一次性闹钟。第一个参数是闹钟类型,第二个参数是触发时间,第三个参数是动作。

setExact(int type, long triggerAtMillis, PendingIntent operation)

和set一样,但是时间更精准。

setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

重复闹钟,第1、2、4个参数同上,第3个参数是两次闹钟的时间间隔。

setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)

和setInexactRepeating一样,但是时间更精准。

以上四个方法时间精不精准的原因还没有深入研究,大概是是否允许系统同时发出多个提醒,意义在于系统唤醒cpu后会把时间接近的alarm同时发出,避免重复唤醒cpu,减少电量。

cancel(PendingIntent operation)

取消闹钟。

写个小程序实验一下

目的:在指定时间从一个发送个广播,收到广播后打印log。界面如下面这样。

布局:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.xuhongchuan.alarmclocktest.MainActivity">

android:id="@+id/view_group1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/time_picker"

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/view_group2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal"

android:layout_below="@id/view_group1">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="是否重复"/>

android:id="@+id/checkbox"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/confirm"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/view_group2"

android:text="确定" />

广播接收器:

public class AlarmReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action == MainActivity.INTENT_ALARM_LOG) {

Log.d("AlarmReceiver", "log log log");

}

}

}

MainActivity

public class MainActivity extends AppCompatActivity {

public static final String INTENT_ALARM_LOG = "intent_alarm_log";

private TimePicker timePicker;

private CheckBox checkBox;

private Button btnConfirm;

private int hour;

private int minute;

AlarmManager am;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init() {

timePicker = (TimePicker) findViewById(R.id.time_picker);

timePicker.setIs24HourView(true);

checkBox = (CheckBox) findViewById(R.id.checkbox);

btnConfirm = (Button) findViewById(R.id.confirm);

am = (AlarmManager) getSystemService(ALARM_SERVICE);

btnConfirm.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (Build.VERSION.SDK_INT >= 23) {

hour = timePicker.getHour();

minute = timePicker.getMinute();

} else {

hour = timePicker.getCurrentHour();

minute = timePicker.getCurrentMinute();

}

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, hour);

calendar.set(Calendar.MINUTE, minute);

calendar.set(Calendar.SECOND, 0);

Intent intent = new Intent(INTENT_ALARM_LOG);

PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

if (!checkBox.isChecked()) {

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);

} else {

long intervalMillis = 60 * 1000; // 60秒

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), intervalMillis, pi);

}

}

});

}

}

AndroidManifest要注册一下receiver

经过测试,以上的时间间隔intervalMillis即使设置5秒也是没用的,因为误差(几十秒呢)无法避免,即使是setRepeating。所以精确是相对的。

android全局计时_Android定时器AlarmManager相关推荐

  1. android全局计时_Android中使用定时器的三种方法

    本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第 ...

  2. android timer状态,android定时器alarmmanager和timer的区别

    2015-11-30 06:30:02 阅读( 428 ) 在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java ...

  3. android 开启一个定时线程_Android 定时器实现方式

    在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与线程的sleep(long)方法 二.采用Handler的postDelayed(Runnable, long)方法 三 ...

  4. Android 系统定时管理器AlarmManager的使用

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是AlarmManager? 按照Alarm+Manager的拼写可知,这是一个定时管理器,不能称为定时器,或者闹钟之 ...

  5. Android设置多个定时器时只有最后一个定时器有效的问题

    AlarmManager的常用方法有三个: (1)set(int type,long startTime,PendingIntent pi):         该方法用于设置一次性闹钟,第一个参数表示 ...

  6. Zynq定时器系统(上)—全局和私有定时器

    前言 定时/计数器是硬件系统运行状态的忠实记录者,它不受CPU直接干预,自己独立运行,可以完成计时.定时.中断.实时时钟等功能.常用功能: (1)定时产生中断信号 (2)用作产生延时函数delay() ...

  7. android之几种定时器实现

    在android中,经常用到的定时器主要有以下几种实现:  一.采用Handler与线程的sleep(long )方法  二.采用Handler的postDelayed(Runnable, long) ...

  8. Android全局异常捕获

    Android全局异常捕获 参考文章: (1)Android全局异常捕获 (2)https://www.cnblogs.com/heweiquan/p/10973201.html 备忘一下.

  9. Android全局捕获异常信息,并上传到服务器。

    android全局捕获异常信息 由于最近在做一个国外的项目,所以客户测试时,有些简单的问题直接可以改改.但是当客户拿着国外的手机,或者一些各种机型的手机出现不同的问题时,真心不知道咋解决了.所以如果在 ...

最新文章

  1. python读取进程内存_Python读取Linux内存进程错误(/ proc / $pid / mem...
  2. Android 怎样查看系统的memory swap 资讯/信息
  3. 扩展--使用队列来优化递归操作完成文件下载
  4. java 上传文件及预览_SpringBoot上传下载文件及在线预览
  5. 【转】Android应用的自动升级、更新模块的实现 (2)
  6. 疫情下的远程办公:理解Linux虚拟网络设备之tun/tap
  7. 易语言c调用,易语言调用C++编写的DLL
  8. 我已经不用 try catch 处理异常了!太辣鸡了!
  9. 陕西2020行政区划调整_陕西2020行政区划调整
  10. C语言基础入门:C-Free5新建C语言工程
  11. 一款校园社区APP,功能策划详解
  12. 信息学奥赛一本通1379:热浪(heatwv) 图论dijkastra算法
  13. 计算机的码片是指什么作用,码片速率
  14. 【Codeforces 777 D Cloud of Hashtags】
  15. 逆向工程第006篇:简易游戏辅助的实现
  16. 用AR试妆打通美妆新零售,岂止台湾“玩美彩妆”一家?
  17. asp mysql 查询_ASP基础教程:数据库查询语言(1)
  18. 有赞产品经理一面面试
  19. 网络安全--信息收集
  20. Linux中的默认权限与隐藏权限(文件、目录)

热门文章

  1. 这个是什么单机经典模式的引入
  2. 飞秋的不定长度字符串处理方法
  3. 《飞鸽传书2007怎么用》这种即时通讯技术已开始普及
  4. 【飞鸽传书】飞鸽传书2011绿色版
  5. 【飞秋】做需求分析一点心得
  6. eNet 软件发布要求多多
  7. 专家:番茄花园洪磊最高可判刑7年
  8. 风生水起:Linux的突破口在中国?
  9. 从系统中取得指定资源图像(转载)
  10. 第九节:掌握vue的另一个核心:组件