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

现在工作的原因,又要重新学习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.     //为日志工具设置标签  
  4.     private static String TAG = "MusicService";  
  5.     //定义音乐播放器变量  
  6.     private MediaPlayer mPlayer;  
  7.       
  8.     @Override  
  9.     public void onCreate() {  
  10.         // TODO Auto-generated method stub  
  11.         Log.d(TAG, "MusicSerice onCreate()");  
  12.         mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.smoke);  
  13.         mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);  
  14.         super.onCreate();  
  15.     }  
  16.   
  17.     @Override  
  18.     public int onStartCommand(Intent intent, int flags, int startId) {  
  19.         // TODO Auto-generated method stub  
  20.         Log.d(TAG, "MusicSerice onStart()");  
  21.         mPlayer.start();  
  22.         return super.onStartCommand(intent, flags, startId);  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onDestroy() {  
  27.         // TODO Auto-generated method stub  
  28.         Log.d(TAG, "MusicSerice onDestroy()");  
  29.         mPlayer.stop();  
  30.         super.onDestroy();  
  31.     }  
  32.   
  33.     public void onCompletion(MediaPlayer player) {  
  34.         // TODO Auto-generated method stub  
  35.         stopSelf();  
  36.     }  
  37.   
  38. }  

 

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,每天早上都要被嘈杂的电吉他身影弄醒,痛苦不堪。

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

时间: 2024-10-21 07:47:35

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

android闹钟-我勒个缺android 闹钟设置异常!!!!!alarmManger所发送的广播启动一个activity

问题描述 我勒个缺android 闹钟设置异常!!!!!alarmManger所发送的广播启动一个activity 虚拟机上没问题,一到手机上就各种问题,我的android5.1手机上不是准点报时,要晚4分钟,我的Android5.0系统里无视定点直接报时.我真没辙了. 解决方案 Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹钟响起,实际上是系

android asynctask-取消一个 AsyncTask 停止启动的方法

问题描述 取消一个 AsyncTask 停止启动的方法 public void get(View view){ try { asPt = new ProgressTask().execute(nullnullnull); Log.d(""Watcher""Get finished""); } catch (Exception e) { e.printStackTrace(); Log.e(""Watcher"&quo

Android闹钟设置的解决方案_Android

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案.主要问题1.API19开始AlarmManager的机制修改. 2.应用程序被Kill掉后,设置的闹钟不响. 3.6.0以上进入Doze模式会使JobScheduler停止工作. 4.手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

最近的时间间隔-Android闹钟 自定义重复周期 怎样计算当前时间与自定义周期的最近的那一天的时间间隔

问题描述 Android闹钟 自定义重复周期 怎样计算当前时间与自定义周期的最近的那一天的时间间隔 如果重复周期是 "只有一次" 或者 "每天",算法很好写,只要计算 当前时间 与 给定时间 的时间差就可以,如果 当前时间 < 给定时间,加上一天就ok! 现在问题是:假设 我 自定义了一个重复周期,设定 每周三,每周五7:30 AM的闹铃. 那么如果今天是在周三设定的时间之前,那么要计算与周三的时间差. 如果是周三设定的时间之后,周五设定的时间之前,那么要计算

简单实现Android闹钟程序 附源码_Android

这个应用实现了简单的闹钟功能,关闭程序的状态中也可以进行闹钟的提醒. 这里遗留了一个问题: 如果我通过应用本身关闭程序,是可以实现我上述所说的功能,但是如果我在手机进程管理中实现应用程序的关闭操作,这个提醒就不起作用了,我很疑惑的是,我通过应用程序本身关闭了后,在进程中也是查看不到这个应用了的.所以哪位知道的帮留个言指点下,谢谢.ClockDemo.java package com.example.clock; import java.util.Calendar; import android.

创建一个基于 Kotlin 的 Android 项目(下集)

本文讲的是创建一个基于 Kotlin 的 Android 项目(下集), 在先前的文章中,我们从零开始新建了一个项目,并且为小猫咪应用调整了 build.gradle. 接下来就是针对应用的基础部分编写代码了. 数据模型 此应用的一个主要特征是通过网络从 http://thecatapi.com/ 中解析数据. 完整的 API 如此调用:http://thecatapi.com/api/images/get?format=xml&results_per_page=10 API 返回一个 XML 

服务器-一个关于学习的android客户端上面加入讨论功能。想部署到虚拟主机上。

问题描述 一个关于学习的android客户端上面加入讨论功能.想部署到虚拟主机上. 但是不知道后台服务器后与数据库之间怎么编写.大家有没类似的demo..现在不会ssh和php.如果有合适的方法.十分乐意愿意花时间学习.![![![![ 解决方案 你把程序写好,当然可以部署了,只是你至少要会PHP或者jsp,不然你怎么写后台?淘宝买的虚拟主机估计限制很大,这个要看你自己的需求了. 解决方案二: 用web service做后端,前端做一个界面就可以了. 解决方案三: 这个问题比较复杂,上百度查

opengl es fbo-求一个opengl es 在android上用 FBO的demo

问题描述 求一个opengl es 在android上用 FBO的demo 如题,最近需要做这个项目,在网上找了很久也找不到es的FBO例子,困在这里好久了,请高人拉我一把! 我需要c++版本的 解决方案 http://www.cnblogs.com/mengdd/archive/2013/05/02/3055649.html 解决方案二: http://blog.sina.com.cn/s/blog_4062094e0100alvv.html 解决方案三: 找了一些看看有没有符合要求的 And