花了一周时间突发奇想写了一个个性闹钟应用,名叫"摇摇醒"。顾名思义,当预设的闹钟时间到时,闹钟响起,并且等待用户摇晃手机。直到一定的阈值之后才能停下,经过不断的测试调整,基本上用户在关闭闹钟的时候能够保证清醒状态。可以为广大的起床困难户解决实际问题~当然应用中也有许多不足之处,我也会继续修改,同时及时在GITHUB上更新源代码也希望大家一起帮助整改。下面介绍一下整个应用的设计思路。

应用中需要解决的主要问题:

  • AlarmManager的使用。这是使用android闹钟的必须类,可以设置闹钟重复提醒,切换关闭与打开状态。以及跳转的广播。
  • Broadcast的使用。通过广播的方式打开acivity,实现摇晃闹钟。
  • 使用播放铃声、控制振动器。通过MediaPlayer和Vibrator类来使闹钟自由切换振动和铃声两种方式来提醒用户。
  • SensorManager的使用。程序中需要用SensorManager来打开加速度传感器捕捉用户摇晃手机的力度,从而判断用户清醒值。
  • 锁屏弹窗。闹钟时间到的时候,需要在用户手机锁屏的时候开启提醒。
  • 定时器。通过精准定时器来计算从闹钟到点到摇晃接触闹钟的时间。

一、闹钟部分

首先要做的是完成的是应用的闹钟部分。在此之前首先要介绍一下Android全局定时器——AlarmManager类。
AlarmManager的作用文档中的解释是:在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent, 从而进入到我们制定的程序完成相应的动作。创建AlarmManager对象需要通过如下代码:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

AlarmManager类提供的两个非常重要的方法:

❑ void set(int type, long triggerAtTime, PendingIntent operation) //设置一个闹钟
❑ void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operate  //  设置一个会重复的闹钟

type :
❑ ELAPSED_REALTIME
在指定的延时过后,发送广播,但不唤醒设备。
❑ ELAPSED_REALTIME_WAKEUP
在指定的演示后,发送广播,并唤醒设备
延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。
❑ RTC
在指定的时刻,发送广播,但不唤醒设备
❑ RTC_WAKEUP
在指定的时刻,发送广播,并唤醒设备
triggerAtTime :首次触发时间
operation :PenddingIntent对象
interval :重复触发间隔时间

主界面非常简单,每个闹钟对象设置两个按钮。一个设置时间,一个用于开关。
如图:

主界面截图

在菜单项中可以选择添加或者删除闹钟。如图:

主界面菜单项

其中布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp" ><ToggleButtonandroid:id="@+id/btn_enClk"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_margin="10dp"android:layout_marginRight="10dp"android:checked="false"android:background="@drawable/small_button" /><Buttonandroid:id="@+id/btn_setClock"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignTop="@+id/btn_enClk"android:layout_toLeftOf="@+id/btn_enClk"android:background="@drawable/button"android:text="设置闹钟" /></RelativeLayout></LinearLayout>

按下闹钟按钮会弹出对话框,要求用户输入时间,闹钟方式。如下图:

设置闹钟窗口

闹钟时间旁边是一个ToggleButton,用于设置闹钟开关。这两个按键公用一个触发事件。按键触发事件代码如下:

@Overridepublic void onClick(View v){switch (v.getId()){case R.id.btn_setClock:setAlarmLayout = (LinearLayout) inflater.inflate(R.layout.alarm_dialog, null);togbtn_AlarmStyle = (ToggleButton) setAlarmLayout.findViewById(R.id.togbtn_alarm_style);togbtn_AlarmStyle.setChecked(sharedData.getBoolean("style",false));timePicker = (TimePicker) setAlarmLayout.findViewById(R.id.timepicker);timePicker.setIs24HourView(true);new AlertDialog.Builder(MainActivity.this).setView(setAlarmLayout).setTitle("设置闹钟时间").setPositiveButton("确定",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog,int which){disableClk();enableClk();if (togbtn_AlarmStyle.isChecked()){MainActivity.setAlarmStyle(true);}else{MainActivity.setAlarmStyle(false);}edit.putBoolean("style",togbtn_AlarmStyle.isChecked());btn_enClk.setChecked(true);Toast.makeText(MainActivity.this,"闹钟设置成功", Toast.LENGTH_LONG).show();// 提示用户}}).setNegativeButton("取消", null).show();break;case R.id.btn_enClk:if (btn_enClk.isChecked()){enableClk();              //打开闹钟}else{disableClk();            //关闭闹钟}break;}}}

其中要注意两点。一个就是TimePicker的使用,可以用24小时计时法或者12小时计时法,但是在设置AlarmManager的时候默认是用24小时,所以要注意这个关系,这里我都是用的24小时计时法。另外打开和关闭闹钟的函数:enableClk()和disableClk()这两个函数。disableClk()当中里面只有一句话,通过alarmManager.cancel(pi); 函数关闭闹钟。主要是要注意enableClk()函数,首先看看代码:

private void enableClk(){timePicker = (TimePicker) setAlarmLayout.findViewById(R.id.timepicker);c.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());        // 设置闹钟小时数c.set(Calendar.MINUTE, timePicker.getCurrentMinute());            // 设置闹钟的分钟数c.set(Calendar.SECOND, 0); // 设置闹钟的秒数c.set(Calendar.MILLISECOND, 0); // 设置闹钟的毫秒数if (c.getTimeInMillis() - System.currentTimeMillis() < 0){c.roll(Calendar.DATE, 1);}btn.setText(sdf.format(new Date(c.getTimeInMillis())));intent = new Intent(MainActivity.this, AlarmReceiver.class);    // 创建Intent对象pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);    // 创建PendingIntentalarmManager.setRepeating(AlarmManager.RTC,    // 设置闹钟,当前时间就唤醒c.getTimeInMillis(), 24 * 60 * 60 * 1000, pi);}

AlarmManager有个特性,就是如果你设置的时间是已经过去的时间,那么会立即发出广播。这样明显是和我们所希望的闹钟功能不相符合的,所以在这里我做了一个判断,如果时间已经过去,我会通过roll函数将时间延后一天。接下来传入广播接收器的类创建intent对象,用PendingIntent(可以脱离acivity而存在的intent)包装Intent。最后使用setRepeating()方法设置闹钟。
至此,对AlarmManager的使用基本结束。用户设置完闹钟时间之后,就是静静等待闹钟时间的到来。。。然后跳转到广播接收器进行下一步的操作。

源码地址:https://github.com/hust-MC/ShakeAlarm

APK下载地址:http://yun.baidu.com/share/link?shareid=479604504&uk=67973003

未来待续。。。。



Android个性闹钟——摇摇醒相关推荐

  1. 基于android个性闹钟的设计与开发,Android个性闹钟计算机毕业设计答辩ppt.ppt

    基于Android的闹钟设计与开发 Logo 绪论 Contents 1 相关技术及开发平台 2 系统分析 3 系统设计 4 系统实现 5 Logo 绪论 随着移动平台的崛起 越来越多的传统PC软件被 ...

  2. Android 实现闹钟功能

      原文地址:Android 实现闹钟功能作者:Android_Learners 一.手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以 ...

  3. android闹钟例子,自己软件中调用android系统闹钟

    [实例简介] 自己软件中调用android系统闹钟! 综合网上资料,得来 [实例截图] [核心代码] 54ba60f3-fa09-4e61-b3ab-c4fca16d07b2 └── CallSyst ...

  4. android小闹钟程序,Android实现闹钟小程序.pdf

    Android实实现现闹闹钟钟小小程程序序 这篇文章主要为大家详细介绍了Android实现闹钟小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近写了 闹钟的程序,看到SharedPrefe ...

  5. 基于Android的闹钟的软件

    一.本课题要求:设计一个基于Android的闹钟的软件. 实现的功能有:能通过界面设置闹钟的启动条件建立后台服务进程,当满足触发条件时,闹钟响应相应事件. 二.需求分析 该课题实现在手机操作系统And ...

  6. android 小米闹钟铃声,闹钟铃声王

    应用介绍 闹钟.闹铃.时钟.语音备忘录.生日提醒.各种提醒事项,功能齐全. 这是一款界面简洁而功能不简单的生活提醒工具,有极简闹钟界面,闹钟功能强大,完全可以代替系统闹钟,同时展现你的个性,让您的手机 ...

  7. 基于android系统的闹钟,基于Android的闹钟的软件

    一.本课题要求:设计一个基于Android的闹钟的软件. 实现的功能有:能通过界面设置闹钟的启动条件建立后台服务进程,当满足触发条件时,闹钟响应相应事件. 二.需求分析 该课题实现在手机操作系统And ...

  8. Android:闹钟提醒结合通知(alarm+notification)

    Android的Notification是android系统中很重要的一个机制, 产品人员常常利用通知栏的方式,跟用户进行弱沟通.拥有推送通知的app要比没有此类功能的app活跃率要高很多.另外类似于 ...

  9. android位置闹钟测试图,位置闹钟安卓版

    位置闹钟安卓版是一款有趣的闹钟提醒APP,你可以设置自己需要提醒的地点和事项,当位置闹钟在后台检测到你已经接近制定地点的时候就会启动提醒服务,非常的实用哟,帮助你不会做车坐过站,本来先喊已经很累了,在 ...

最新文章

  1. 三层交换机工作原理(转载)
  2. 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];...
  3. java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰...
  4. linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP
  5. 一个关于C++ Inline关键字的引发的一个错误
  6. 小学信息技术了解计算机课件,小学信息技术《走进计算机》ppt课件
  7. ACM/IOI 历年国家集训队论文集和论文算法分类整理
  8. ThoughtWorks待遇
  9. 高等数学:微分、积分物理以及几何意义
  10. Altium designer原理图检查(编译检查)
  11. 计算机课反思的作文600字,中考反思作文600字6篇
  12. 脑子里想的是A,嘴巴上说的是B,实际上做的是C,幻想前景远大的是D,可真正赚钱的恰恰却是E...
  13. pytorch版Class-Balanced Loss训练模型
  14. Python入门自学进阶-Web框架——8、认识Ajax,与Django交互,基于jQuery
  15. vue使用外部字体文件
  16. 智慧工地系统包括哪些部分
  17. 程序猿有话说:计算机,学着挺有意思的,就是头冷
  18. 手机辐射问题研究(转)
  19. python爬取2345天气网上2011年-2018年历史天气
  20. 这些年MAC下我常用的那些快捷键

热门文章

  1. 委内瑞拉将向OPEC推出Petro币用于国际石油交易
  2. 如何用纯 CSS 创作一个小和尚 1
  3. 【论文笔记】DUDA‑Net: a double U‑shaped dilated attention network for automatic infection area segmentati
  4. Cerea学习,包含示例代码
  5. 《首先,打破一切常规》读后感
  6. Element Tiptap Editor - 免费开源的 Vue 富文本编辑器,专门为搭配 Element UI 使用优化,使用很简单
  7. 2022年科技公司薪酬排行榜,来了!
  8. 宽屏欧式家具电子商务网站模板
  9. java实验报告第8章_java实验报告8.doc
  10. Ubuntu系统下生成Android app系统签名