之前的博文一直在持续分享Phone相关的知识也算是知识笔记,但在工作中难免遇到其他模块的一些问题,因此在解决这些问题的时候顺手将这些知识记录并分享出来。有些知识在不知道的时候会觉得非常难,当了解之后便会觉得非常easy。同一时候部分知识也是具有时效性的,比方随着Android版本号的更迭。Phone的架构变化等等,因此希望自己的笔记可以帮助到一些童鞋。这样就足够了。

转载请务必注明出处:http://blog.csdn.net/yihongyuelan

Android中假设闹钟响起时。而应用须要对此做一些处理应该怎么办呢?首先我们须要接收到该事件。之后再考虑是关闭(stop)还是小睡(snooze)。

在代码packages/apps/DeskClock/src/com/android/deskclock/alarms/AlarmService.java 中有例如以下描写叙述:

35    // A public action send by AlarmService when the alarm has started.
36    public static final String ALARM_ALERT_ACTION = "com.android.deskclock.ALARM_ALERT";
37
38    // A public action sent by AlarmService when the alarm has stopped for any reason.
39    public static final String ALARM_DONE_ACTION = "com.android.deskclock.ALARM_DONE";

通过查看凝视能够知道,系统提供了两个Action用于广播闹钟事件,包含:com.android.deskclock.ALARM_ALERT和com.android.deskclock.ALARM_DONE,即当闹钟响起时触发com.android.deskclock.ALARM_ALERT,而当闹钟停止或者小睡时触发com.android.deskclock.ALARM_DONE。也就说须要监听广播事件就注冊一个广播监听器:

IntentFilter filter = new IntentFilter();
filter.addAction("com.android.deskclock.ALARM_ALERT");
filter.addAction("com.android.deskclock.ALARM_DONE");
registerReceiver(mReceiver, filter);

这里的mReceiver是BroadCastReceiver的对象,在onReceive中处理事件。当闹钟响起时,弹出的界面是AlarmActivity.java路径位于:packages/apps/DeskClock/src/com/android/deskclock/alarms/AlarmActivity.java。在该类中提供了两个重要的闹钟操作接口,即stop和snooze,能够看到例如以下描写叙述:

49    // AlarmActivity listens for this broadcast intent, so that other applications
50 // can snooze the alarm (after ALARM_ALERT_ACTION and before ALARM_DONE_ACTION).
51 public static final String ALARM_SNOOZE_ACTION = "com.android.deskclock.ALARM_SNOOZE";
52
53 // AlarmActivity listens for this broadcast intent, so that other applications
54 // can dismiss the alarm (after ALARM_ALERT_ACTION and before ALARM_DONE_ACTION).
55 public static final String ALARM_DISMISS_ACTION = "com.android.deskclock.ALARM_DISMISS";

该方法提供了两个广播接收的接口各自是com.android.deskclock.ALARM_SNOOZE和com.android.deskclock.ALARM_DISMISS,前者用于snooze后者用于stop。在AlarmActivity中能够看到对该action的处理,例如以下:

184        IntentFilter filter = new IntentFilter(AlarmService.ALARM_DONE_ACTION);
185 filter.addAction(ALARM_SNOOZE_ACTION);
186 filter.addAction(ALARM_DISMISS_ACTION);
187 registerReceiver(mReceiver, filter); 118 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
119 @Override
120 public void onReceive(Context context, Intent intent) {
121 String action = intent.getAction();
122 Log.v("AlarmActivity - Broadcast Receiver - " + action);
123 if (action.equals(ALARM_SNOOZE_ACTION)) {
124 snooze();
125 } else if (action.equals(ALARM_DISMISS_ACTION)) {
126 dismiss();
127 } else if (action.equals(AlarmService.ALARM_DONE_ACTION)) {
128 finish();
129 } else {
130 Log.i("Unknown broadcast in AlarmActivity: " + action);
131 }
132 }
133 };

也就是说能够在代码中通过使用广播的方式来控制闹钟的stop和snooze:

private void stopAlarm() {
Intent intent = new Intent();
intent.setAction("com.android.deskclock.ALARM_DISMISS");
sendBroadcast(intent);
} private void snoozeAlarm() {
Intent intent = new Intent();
intent.setAction("com.android.deskclock.ALARM_SNOOZE");
sendBroadcast(intent);
}

最后附上Demo。当闹钟响起时接收并将其Stop/Snooze,代码例如以下:

    private void stopAlarm() {
        Intent intent = new Intent();
        intent.setAction("com.android.deskclock.ALARM_DISMISS");
        sendBroadcast(intent);
    }
    
    private void snoozeAlarm() {
        Intent intent = new Intent();
        intent.setAction("com.android.deskclock.ALARM_SNOOZE");
        sendBroadcast(intent);
    }
    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    Log.i("Seven", "stop alarm");
                    stopAlarm();
                    break;
                case 1:
                    Log.i("Seven", "snooze alarm");
                    snoozeAlarm();
                    break;                 default:
                    break;
            }
        }
    };
    
    private void registerAlarmReceiver() {
        mReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.android.deskclock.ALARM_ALERT");
        filter.addAction("com.android.deskclock.ALARM_DONE");
        registerReceiver(mReceiver, filter);
    }     class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("com.android.deskclock.ALARM_ALERT")) {
                Log.i("Seven","ALARM_ALERT");
                mHandler.sendEmptyMessageDelayed(0,15); //stop alarm
                //mHandler.sendEmptyMessageDelayed(1,15); //snooze alarm
            }else if (intent.getAction().equals("com.android.deskclock.ALARM_DONE")) {
                Log.i("Seven","ALARM_DONE");
            }
        }
    }

这里可能有的人会感觉奇怪,为什么不直接调用stopAlarm和snoozeAlarm而是使用handler的sendEmptyMessageDelayed方法。

假设直接使用stopAlarm和snoozeAlarm方法会没有效果。最少须要延迟15ms才会有作用。

最后加上一些英文的翻译,以便国外的童鞋也能获得一些帮助。

How to stop an alarm in android

How to turn off the alarm clock on the droid

How to cancel the android alarm

Android Alarm not turning off programmatically

Automatically silence the sound volume of Android Phone programmatically

Android中对闹钟Alarm的事件处理的更多相关文章

  1. 解剖android中的闹钟app 一

    首先,看一看android市场上有哪些主流的闹钟app了,我们来进行一个简单的评测: 一.正点闹钟 这是一款源自金山技术的闹钟app,其主力创始团队都是来自于金山,其装机量,下载量都是排名第一.老样子 ...

  2. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  3. 揭破android中的闹钟app 二

    · 这节,我们通过wheelview来模仿一个简易的正点闹钟. 我这里不说wheelview来龙去脉,只阐述几个简单的方法,如果,想看一看具体wheelview的内容,请看下面两篇文章: androi ...

  4. 关于Android中设置闹钟的相对比较完善的解决方案

    我当时说承诺为大家写一个,一直没空,直到最近又有人跟我要,我决定抽时间写一个吧.确实设置闹钟是一个比较麻烦的东西.我在这里写的这个demo抽出来了封装了一个类库,大家直接调用其中的设置闹钟和取消闹钟的 ...

  5. 关于Android中设置闹钟的相对完善的解决方案

    前些时候,有人在我「非著名程序员」微信公众号的后台问我有没有设置闹钟的demo,我当时说承诺为大家写一个,一直没空,直到最近又有人跟我要,我决定抽时间写一个吧.确实设置闹钟是一个比较麻烦的东西.我在这 ...

  6. Android零基础入门第35节:Android中基于回调的事件处理

    原文:Android零基础入门第35节:Android中基于回调的事件处理 通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理. 一. ...

  7. Android中的几种多线程实现

    有以下几种方式: 1)Activity.runOnUiThread(Runnable) 2)View.post(Runnable) ;View.postDelay(Runnable , long) 3 ...

  8. Android中Alarm的机制

    本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...

  9. Android中使用AlarmManager设置闹钟

    场景 设置闹钟 闹钟提醒 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建 ...

随机推荐

  1. Google map v3 using simple tool file google.map.util.js v 1.1

    /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 2013-08-23 * @notice 地图容器的z-index不能小于 ...

  2. 【数据结构(ywm版)】异或指针双向链表

    在<数据结构题集>中看到这种链表,实际上就是把一般的双向链表的next和prior两个指针通过异或运算合并为一个指针域来存储,每个结点确实可以减少一个指针的空间,但会带来取指针值时运算的开 ...

  3. POJ 3368 RMQ-ST

    一直感觉RMQ水,没自己写过,今天写了一道题,算是完全独立写的,这感觉好久没有了... 一直以来,都是为了亚洲赛学算法,出现了几个问题: 1.学的其实只是怎么用算法,对算法的正确性没有好好理解,或者说 ...

  4. hdu 5510 Bazinga(暴力)

    Problem Description Ladies and gentlemen, please sit up straight. Don't tilt your head. I'm serious. ...

  5. 2014 ACM省赛总结

    今年ACM省赛已经过去一个星期左右了,2年的ACM训练是该做个总结了,因为前几日去參加蓝桥杯总决赛,所以没来的及写总结,如今在这小小总结一下吧-- 依晰记得去年省赛时候的样子,如今感觉那时像是个无知的 ...

  6. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  7. HTML 4.01 符号实体

    HTML 4.01 符号实体 http://www.w3school.com.cn/tags/html_ref_symbols.html

  8. Jquery二级简单折叠菜单

    写在前面: 1.前端新手 2.欢迎交流 3. 源代码百度云页面示例链接: http://pan.baidu.com/s/1nt0yjd3 链接失效请留言 效果图: 代码部分:jquery部分: < ...

  9. Spring-----3、Spring的核心机制(依赖注入)

    转载自:http://blog.csdn.net/hekewangzi/article/details/41345237

  10. UNIX环境高级编程--#include "apue.h"

    apue.h头文件为作者自己编写而非系统自带,故需要自行添加! 第一:打开网站 http://www.apuebook.com/第二:选择合适的版本(一共有三个版本,根据书的版本选择)下载源码sour ...