现在工作的原因,又要重新学习android。就打算写个应用。恰好最近不想起床,创意就来了,写个闹钟,一旦开始唱歌,不唱完休想停下来。

我学这个东西的时候还是2.2,现在都4.3了,变了很多。还真有点不适应。所以花了一个晚上才搞定。

首先新建工程。不多说了。

然后写一个页面。很简单,就一个Button,一个TimePicker。

Xml代码  
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:orientation="vertical"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:gravity="center_vertical"
  6. >
  7. <TimePicker
  8. android:id="@+id/timePicker"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. />
  12. <Button
  13. android:id="@+id/timeBtn"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:text="@string/done"
  17. android:textSize="20sp"
  18. android:onClick="setAlarm"
  19. />
  20. </LinearLayout>

就像这样,线性布局,TimePicker在上,Button在下。我们要实现的就是上边选一个时间,然后点一下button,这个闹钟就在你设定的时间响起来,想停都停不了。

然后再onCreate里,把布局搞上去。

Java代码  
  1. @Override
  2. rotected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. timePicker = (TimePicker)findViewById(R.id.timePicker);
  6. time = (Button)findViewById(R.id.timeBtn);
  7. timePicker.setIs24HourView(true);

然后注册Button事件

Java代码  
  1. public void setAlarm(View view) {
  2. int hour = timePicker.getCurrentHour();
  3. int minu = timePicker.getCurrentMinute();
  4. Calendar cal = Calendar.getInstance();
  5. cal.set(Calendar.HOUR_OF_DAY, hour);
  6. cal.set(Calendar.MINUTE, minu);
  7. if(cal.before(Calendar.getInstance())){
  8. cal.add(Calendar.DATE, 1);
  9. }
  10. Toast.makeText(this, cal.getTime().toString(), Toast.LENGTH_LONG).show();
  11. alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
  12. Intent intent = new Intent(this, AlarmReceiver.class);
  13. alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
  14. alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);
  15. /*alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
  16. AlarmManager.INTERVAL_DAY, alarmIntent);*/
  17. }

首先从TimePicker中取到小时和分钟,分别是hour 和minu。

创建一个Calendar对象,然后把Calendar中的hour和minu替换成我们设置的时间,然后对现在的时间比较一下,如果在现在时间之后,就设置为calendar中储存的时间,如果是在之前,就把calendar中的时间加一天。

然后是闹钟比较重要的几个类。首先得到AlarmManager这个系统服务。然后创建一个PendingIntent,AlarmManager通过set方法设置唤醒方式,时间和到时候抛出的intent。

Java代码  
  1. 01.alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);

RTC_WAKEUP代表绝对时间方式,切手机处于休眠状态时也会fire,第二个参数得到要fire的绝对时间,就是我们刚刚设置的时间,第三个参数是到时候抛出的intent。

代码跑到这里,intent应该能抛出来了,还得设计一个BroadcastRecevier来接这个Intent。认真看代码的应该已经看到了,这个intent已经写明白了,将被传递给AlarmReceiver.class,就是它。下面是代码:

Java代码  
  1. @Override
  2. public void onReceive(Context context, Intent intent) {
  3. // TODO Auto-generated method stub
  4. Log.d("REC", "The time is up,start the alarm...");
  5. Toast.makeText(context, "This the time", Toast.LENGTH_LONG).show();
  6. Intent serviceIntent = new Intent(context, MusicService.class);
  7. context.startService(serviceIntent);
  8. }

如果细心应该发现我在上一个代码段中有一行注释

Java代码  
  1. /*alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
  2. AlarmManager.INTERVAL_DAY, alarmIntent);*/

这是官方的推荐方法。所以首先是用的这个,但是不知道为什么总是不成功。所以我还是得好好研究下。

回到原来话题,认真看下上边代码发现他够简单,只是打开了一个service。恩,播放音乐就放在这个service里边。

Java代码  
  1. public class MusicService extends Service implements OnCompletionListener {
  2. //为日志工具设置标签
  3. private static String TAG = "MusicService";
  4. //定义音乐播放器变量
  5. private MediaPlayer mPlayer;
  6. @Override
  7. public void onCreate() {
  8. // TODO Auto-generated method stub
  9. Log.d(TAG, "MusicSerice onCreate()");
  10. mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.smoke);
  11. mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
  12. super.onCreate();
  13. }
  14. @Override
  15. public int onStartCommand(Intent intent, int flags, int startId) {
  16. // TODO Auto-generated method stub
  17. Log.d(TAG, "MusicSerice onStart()");
  18. mPlayer.start();
  19. return super.onStartCommand(intent, flags, startId);
  20. }
  21. @Override
  22. public void onDestroy() {
  23. // TODO Auto-generated method stub
  24. Log.d(TAG, "MusicSerice onDestroy()");
  25. mPlayer.stop();
  26. super.onDestroy();
  27. }
  28. public void onCompletion(MediaPlayer player) {
  29. // TODO Auto-generated method stub
  30. stopSelf();
  31. }
  32. }

onCreate的时候创建MediaPlayer对象。onStartCommand时开始播放。onCompletion在播放完毕时调用,于是在这里stop这个service。很简单。

这么快,功能都实现了。

在设置里看到service并没有自己停掉,这个有点奇怪,需要重新研究下。

大意了。。忘记了给MediaPlayer注册Listener导致的onCompletion方法没有被调用,所以歌曲播放完毕后service并没有被停掉。修改后的service代码如下

Java代码  
  1. @Override
  2. public void onCreate() {
  3. // TODO Auto-generated method stub
  4. Log.e(TAG, "MusicSerice onCreate()");
  5. mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.smoke);
  6. mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
  7. <SPAN style="COLOR: #ff0000">mPlayer.setOnCompletionListener(this);
  8. </SPAN>   super.onCreate();
  9. }

大功告成。核心功能都实现了,就剩下交互设计和UI了。慢慢丰满吧。

PS:我是直接把音乐资源功能打包在apk里的,所以闹铃是不能换的,而我打包了一首Smoke on the water,每天早上都要被嘈杂的电吉他身影弄醒,痛苦不堪。

所以最后的结果是,我用了两天,早起了两天后,把这个应用卸载了。。。。。

一个没有停止的android闹钟,一旦开始就要把歌唱完 .相关推荐

  1. android闹钟倒计时_如何在Android上使用闹钟,计时器和秒表

    android闹钟倒计时 Your Android device's built-in Clock app can serve as an alarm clock, a kitchen timer, ...

  2. Android闹钟 AlarmManager的使用

    转自:http://www.cnblogs.com/mengdd/p/3819806.html AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的 ...

  3. Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)

    android的时钟,也就是闹钟应用,从桌面的widget直接点进去的会打开AlarmClock这个Activity. 好像我平常都不上图的,今天就上两张图先. 一张是应用界面图如下:(改天再上传了, ...

  4. 简单实现 Android 闹钟

    Android 闹钟 比如:一次闹钟响过之后开关变为关的状态:直接点击开关不能实现开关闹钟的作用,需要在点击item的菜单中进行更改:未知原因闹钟不准时,不能及时响应,求大神讲解 话不多说,看代码 M ...

  5. Android闹钟最终版【android源码闹钟解析】

    我以前写了个复杂闹钟的demo,参见Android闹钟[复杂版][大明进化十五] .但是里面的bug有一些,好多人留言,所以我就看看源码,找找原因?顺便把源码代码整理出来,弄成一个完整的可以运行的ap ...

  6. Android 闹钟详解

    最近再做一个项目需要用到Android中的闹钟提醒,在这个过程中遇到很多问题,今天在这里总结分享给大家,希望能对读者有所帮助: 我们都知道Android总共有三种内置的闹钟类型,如下: (1)set( ...

  7. android闹钟测评,谁才是轻便实用好闹钟Android闹钟类应用横评

    谁才是轻便实用好闹钟Android闹钟类应用横评 作者: CBINews编辑责任编辑:申耀 2012-03-09 18:45:19 来源:电脑商情在线关键字:点心OS 手机现在已经让很多人的手表藏进了 ...

  8. android 设备关机后还能在设定的闹钟时刻响起的功能如何实现,Android闹钟 AlarmManager的使用...

    Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...

  9. Android闹钟拓展版【安卓闹钟可换壁纸版】

            经过写上篇文章Android闹钟最终版[android源码闹钟解析] .发现有一些留邮箱的,但凡留邮箱的,我就发源码过去了,不错,基本上收到邮箱的都留言感谢了,这样我的成就感就多一点, ...

最新文章

  1. 知识点讲解四:栈溢出(stack overflow)问题解决方案
  2. 华为Android9.0谷歌框架,华为Mate9怎样登陆谷歌商店 Mate9如何安装谷歌服务框架【详解】...
  3. ngx_lua模块API说明
  4. 时间序列与R语言应用(part5)--移动平均MA模型及其可逆性
  5. VTK:一个面向对象的可视化类库(zz)
  6. 新手程序员如何找一个靠谱的公司
  7. RestTemplate远程接口调用
  8. HTML5语音识别(已被抛弃)
  9. [UE4]复制引起的重复对象
  10. python装饰器作用噜咕_浅谈python中的装饰器
  11. 使用Canvas绘制简单工程符号(续)
  12. iOS开发初学者入门需要学习哪些知识?
  13. 【新知实验室】TRTC从体验到入门
  14. 从全面了解高级计量经济学体系+stata实操+实证研究前沿+论文+大数据机器学习+空间计量......._Stata高级计量经济学 陈强
  15. android 解压jar,解压和打包Jar - 海阔天空玩世不恭的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. Android面试题Java基础篇
  17. krpano php,krpano调试模式的开启
  18. c盘空间不足怎么清理(电脑磁盘空间不足怎么清理)
  19. Ae 效果快速参考:沉浸式视频
  20. Linux系统Shell if语句用法小结

热门文章

  1. C# ?? 操作符示例
  2. POJ 1154题解,此题不难理解方法就是DFS,属于水题。不过有一些细节要注意。...
  3. ubuntu 7.04 Feisty Fawn 安装手记之 一:系统安装
  4. 大数据_Flink_Java版_数据处理_流处理API_Sink操作_把数据存储到ElasticSearch---Flink工作笔记0040
  5. opnecv 读取视频与图像还是有区别的
  6. oe_runmake failed
  7. 嵌入式电路设计(第一个商业pcb电路图绘制)
  8. python编程(import头文件)
  9. 随想录(编写简单资源管理代码)
  10. 一步一步写算法(之哈夫曼树 上)