码迷,mamicode.com
首页 > 移动开发 > 详细

Android随笔之——闹钟制作铺垫之AlarmManager详解

时间:2014-08-29 23:50:58      阅读:394      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   http   color   os   使用   java   io   

  说实话,之前写的两篇博客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);

二、AlarmManager常用方法简介

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

public void set(int type, long triggerAtMillis, PendingIntent operation)
功能:用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示触发这个闹钟要等待的时间,与type相关(不懂英文就查字典吧,我也是查了才理解这个参数的意思的),
第三个参数闹钟响应的动作 参数:type: AlarmManager.ELAPSED_REALTIME 表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3; AlarmManager.ELAPSED_REALTIME_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2; AlarmManager.RTC  表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1; AlarmManager.RTC_WAKEUP  表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0; 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>

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

 1 package com.example.alarmmanager;
 2 
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.widget.Toast;
 7 
 8 public class AlarmReceiver extends BroadcastReceiver{
 9 
10     @Override
11     public void onReceive(Context arg0, Intent arg1) {
12         //此处可以添加闹钟铃声
13         System.out.println("我是闹钟,我要叫醒你...");
14         Toast.makeText(arg0, "我是闹钟,我要叫醒你...", Toast.LENGTH_SHORT).show();  
15     }
16 
17 }

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

 1 package com.example.alarmmanager;
 2 
 3 import android.app.Activity;
 4 import android.app.AlarmManager;
 5 import android.app.PendingIntent;
 6 import android.content.Intent;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 
11 public class MainActivity extends Activity implements OnClickListener {
12 
13     private AlarmManager alarmManager;
14     private PendingIntent operation;
15 
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19 
20         // 初始化按钮,并绑定监听事件
21         findViewById(R.id.clock).setOnClickListener(this);
22         findViewById(R.id.repeating_clock).setOnClickListener(this);
23         findViewById(R.id.cancel_clock).setOnClickListener(this);
24 
25         // 获取AlarmManager对象
26         alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
27 
28         // 创建Intent对象,action为android.intent.action.ALARM_RECEIVER
29         Intent intent = new Intent("android.intent.action.ALARM_RECEIVER");
30         operation = PendingIntent.getBroadcast(this, 0, intent, 0);
31     }
32 
33     @Override
34     public void onClick(View v) {
35         switch (v.getId()) {
36         case R.id.clock:// 设置一次性闹钟
37             alarmManager.set(AlarmManager.RTC_WAKEUP, 10000, operation);
38             break;
39         case R.id.repeating_clock:// 设置重复闹钟
40             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 10000,
41                     operation);
42             break;
43         case R.id.cancel_clock:// 取消闹钟
44             alarmManager.cancel(operation);
45             break;
46         default:
47             break;
48         }
49     }
50 }

  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/clock"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置一次性闹钟" />

    <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详解

标签:android   style   blog   http   color   os   使用   java   io   

原文地址:http://www.cnblogs.com/travellife/p/3945754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!