说实话,之前写的两篇博客Android广播机制Broadcast详解Android时间、日期相关类和方法以及现在要写的,都算是为之后要写的闹钟应用做铺垫,有兴趣的话,大家可以去看看前两篇博客。

一、AlarmManager简介

  对于一个闹钟应用的实现,个人觉得最主要的应该要属于AlarmManager了。AlarmManager称为全局定时器,字面意思就是闹钟管理(请原谅我蹩脚的英语),是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent(这货在调用系统发送短信的时候也有,找个时间温习下Intent,顺带把这个也好好学习下),PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。

//定义一个PendingIntent对象,此处先照样画葫芦,下次学了再细讲
PendingIntent pi = PendingIntent.getBroadcast(Context, int, Intent, int);

补充:网上有人再说PendingIntent的第二个和第四个参数不重要,其实不然,如果在闹钟这个应用中,你的第二个参数都是同一个常数,那么你之后设的闹钟会把之前的闹钟给覆盖掉,导致时间到了也不提醒的情况。解决办法就是:根据设置闹钟时的时间毫秒数来产生第二个参数。

二、AlarmManager常用方法简介

  AlarmManager类提供的常用方法主要有一下几个:

public void set(int type, long triggerAtMillis, PendingIntent operation)
功能:用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示触发这个闹钟要等待的时间,与type相关(不懂英文就查字典吧,我也是查了才理解这个参数的意思的),
第三个参数闹钟响应的动作
参数:type AlarmManager.ELAPSED_REALTIME 在指定的延时过后,发送广播,但不唤醒设备。
AlarmManager.ELAPSED_REALTIME_WAKEUP 在指定的演示后,发送广播,并唤醒设备
AlarmManager.RTC 在指定的时刻,发送广播,但不唤醒设备 时刻是相对于1970-01-01 00:00:00来说的毫秒数
AlarmManager.RTC_WAKEUP 在指定的时刻,发送广播,并唤醒设备
AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能状态值为4;不过我测试的时候并没有这个常量,估计和SDK有关
operation 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。 public void setExact(int type, long triggerAtMillis, PendingIntent operation)
功能:在规定的时间精确的执行闹钟,这个函数应该是闹钟执行精度比较高吧 public void setRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation)
功能:该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示触发这个闹钟要等待的时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。 public void setInexactRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation)
功能:设置一个重复闹钟的不精确版本,它相对而言更节能一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
由于不是精确版,所以这里的intervaMills会略有不同
参数:intervalMillis: INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY public void cancel(PendingIntent operation)
功能:取消一个设置的闹钟,移除任意匹配意图的闹钟 public void setTimeZone(String timeZone)
功能:设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限

三、一个简单的闹钟的实例Demo

  首先,我们现在AndroidManifest.xml中注册一个广播,如果不清楚可以去看我之前写的博客Android随笔之——Android广播机制Broadcast详解

    <receiver android:name=".AlarmReceiver" ><!-- Reveiver名称,如果是内部类静态注册广播,请在内部类前加$ -->
<intent-filter>
<action android:name="android.intent.action.ALARM_RECEIVER" /><!-- 广播接收的Intent --> <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

  接着,我们就要编写一个广播接收器,用来接收闹钟的广播事件,进行相关处理

 package com.example.alarmmanager;

 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class AlarmReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context arg0, Intent arg1) {
//此处可以添加闹钟铃声
System.out.println("我是闹钟,我要叫醒你...");
Toast.makeText(arg0, "我是闹钟,我要叫醒你...", Toast.LENGTH_SHORT).show();
} }

  最后,在MainActivity.java写上具体的实现代码

 package com.example.alarmmanager;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener; public class MainActivity extends Activity implements OnClickListener { private AlarmManager alarmManager;
private PendingIntent operation; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 初始化按钮,并绑定监听事件
findViewById(R.id.ELAPSED_REALTIME_CLOCK).setOnClickListener(this);
findViewById(R.id.ELAPSED_REALTIME_WAKEUP_CLOCK).setOnClickListener(
this);
findViewById(R.id.RTC_CLOCK).setOnClickListener(this);
findViewById(R.id.RTC_WAKEUP_CLOCK).setOnClickListener(this);
findViewById(R.id.repeating_clock).setOnClickListener(this);
findViewById(R.id.cancel_clock).setOnClickListener(this); // 获取AlarmManager对象
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); // 创建Intent对象,action为android.intent.action.ALARM_RECEIVER
Intent intent = new Intent("android.intent.action.ALARM_RECEIVER");
operation = PendingIntent.getBroadcast(this, 0, intent, 0);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ELAPSED_REALTIME_CLOCK:
// 在指定的演示后,发送广播,并唤醒设备
// 延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的
int triggerAtTime = (int) (SystemClock.elapsedRealtime() + 10 * 1000);
alarmManager.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, operation);
break;
case R.id.ELAPSED_REALTIME_WAKEUP_CLOCK:
// 在指定的演示后,发送广播,并唤醒设备
// 延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的
int triggerAtTime1 = (int) (SystemClock.elapsedRealtime() + 5 * 1000);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
triggerAtTime1, operation);
break;
case R.id.RTC_CLOCK:// 在指定的时刻,发送广播,但不唤醒设备
alarmManager.set(AlarmManager.RTC,
getDateMills("2014-08-30 10:06:00"), operation);
break;
case R.id.RTC_WAKEUP_CLOCK:// 在指定的时刻,发送广播,并唤醒设备
alarmManager.set(AlarmManager.RTC_WAKEUP,
getDateMills("2014-08-30 10:10:00"), operation);
break;
case R.id.repeating_clock:// 设置重复闹钟
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 10000,
operation);
break;
case R.id.cancel_clock:// 取消闹钟
alarmManager.cancel(operation);
break;
default:
break;
}
} @SuppressLint("SimpleDateFormat")
public long getDateMills(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
Date date;
try {
date = format.parse(dateStr);
return date.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
}

  activity_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/ELAPSED_REALTIME_CLOCK"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="一次性闹钟:ELAPSED_REALTIME" /> <Button
android:id="@+id/ELAPSED_REALTIME_WAKEUP_CLOCK"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="一次性闹钟:ELAPSED_REALTIME_WAKEUP " /> <Button
android:id="@+id/RTC_CLOCK"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="一次性闹钟:RTC " /> <Button
android:id="@+id/RTC_WAKEUP_CLOCK"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="一次性闹钟:RTC_WAKEUP_CLOCK" /> <Button
android:id="@+id/repeating_clock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="设置重复闹钟" /> <Button
android:id="@+id/cancel_clock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消闹钟" /> </LinearLayout>

  这样,一个简单的闹钟就完成了,呼~我的目标是做一个真正可以使用的闹钟,再接再厉!也欢迎大家关注我的博客!

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

源码下载:百度云盘

Android随笔之——闹钟制作铺垫之AlarmManager详解的更多相关文章

  1. Android 调用图库选择图片实现和参数详解

    //选择图片,调用图库        bt4.setOnClickListener(new OnClickListener() { @Override            public void o ...

  2. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  3. Android textAppearance的属性设置及TextView属性详解

    textAppearance的属性设置 android:textAppearance="?android:attr/textAppearanceSmall" android:tex ...

  4. 【转】ANDROID自定义视图——onLayout源码 流程 思路详解

    转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...

  5. Android Developer -- Bluetooth篇 开发实例之四 API详解

    http://www.open-open.com/lib/view/open1390879771695.html 这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每 ...

  6. 【Android面试查漏补缺】之Handler详解,带你全面理解Handler消息机制

    在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一.题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQue ...

  7. Android开发之AlarmManager详解

    AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...

  8. android AlarmManager 详解

    在开发互联网应用时候,我们常常要使用心跳来保证客户端与服务器的连接.怎么完成心跳很关键,在说道客户端心跳功能时,如果使用Timer或者专门开起一个线程来做心跳的工作,会浪费CPU工作时间,而且也会更多 ...

  9. Android M 特性 Doze and App Standby模式详解

    版权声明:本文由郑桂涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/185 来源:腾云阁 https://www.qclo ...

随机推荐

  1. bzoj 3821: 玄学

    题目大意 有一个长度为 n 数列,有若干个事件,事件分为操作和询问两种, 一次操作是把数列[l...r] 区间中的每个元素x变成 ax + b mod p. 一次询问是询问 执行了 第l 次到第r次操 ...

  2. 关于C#的微信开发的入门记录二

    在准备了空间和域名之后,现在来讲讲我们接下来的编码过程: 今天就先到这里了!没有服务器那些的请看我之前的博客:http://www.cnblogs.com/zhankui/p/4515905.html ...

  3. 如何将本地的jar包上传到maven本地仓库中

    首先需要将本地的jar包做mvn install到本地仓库中 mvn install:install-file -Dfile=D:\skyeye-ruleInfo\lib\lucene-querypa ...

  4. 解决:View调用invalidate()后不刷新onDraw()

    近来学android图片处理,按照例子来,自定义一个View,之后在Activity里面手动调用该View的invalidate()后,一直无法刷新onDraw() 上网搜了一下,有两种解决办法: 一 ...

  5. tomcat:域名指向项目名

    把项目部署到tomcat目录webapps后,使用域名访问的时候域名后面需要加上项目名称,如果想直接输入域名就可以访问项目呢?看了下tomcat官方文档,我修改了tomcat安装目录下conf/ser ...

  6. 封装自己的DB类(PHP)

    封装一个DB类,用来专门操作数据库,以后凡是对数据库的操作,都由DB类的对象来实现.这样有了自己的DB类,写项目时简单的sql语句就不用每次写了,直接调用就行,很方便! 1.封装一个DB类.一个类文件 ...

  7. ArcGIS10的附件功能

    转自 积思园 http://blog.csdn.net/linghe301/article/details/6386176 老是忘记怎么使用这个ArcGIS10的附件功能,这次就做个记录吧. 在项目应 ...

  8. 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法

    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...

  9. Microsoft Azure Web Sites应用与实践【3】—— 通过Visual Studio Online在线编辑Microsoft Azure 网站

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  10. Oracle没有WM_CONCAT函数的解决办法

    WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上. 1.下载三个文件:owmctab.plb  . owmaggrs.plb . owmagg ...