`
小码哥BASE64
  • 浏览: 124324 次
社区版块
存档分类
最新评论

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

阅读更多

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

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

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

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical"
    >
    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="fill_parent" 
    	android:layout_height="wrap_content" 
    />
    <Button  
	android:id="@+id/timeBtn"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/done"
        android:textSize="20sp"
        android:onClick="setAlarm"
    />
</LinearLayout>

 

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

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

 

 

 

        @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		timePicker = (TimePicker)findViewById(R.id.timePicker);
		time = (Button)findViewById(R.id.timeBtn);
		timePicker.setIs24HourView(true);		
	}

 然后注册Button事件

 public void setAlarm(View view) {
	     int hour = timePicker.getCurrentHour();
	     int minu = timePicker.getCurrentMinute();
	     Calendar cal = Calendar.getInstance();
	     cal.set(Calendar.HOUR_OF_DAY, hour);
	     cal.set(Calendar.MINUTE, minu);
	     if(cal.before(Calendar.getInstance())){
	    	 cal.add(Calendar.DATE, 1);
	     }
	     Toast.makeText(this, cal.getTime().toString(), Toast.LENGTH_LONG).show();
	     alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
	     Intent intent = new Intent(this, AlarmReceiver.class);
	     alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
	     alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);
	     /*alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
	    	        AlarmManager.INTERVAL_DAY, alarmIntent);*/
	 }

 

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

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

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

01.alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);  

 

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

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

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

 

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

 /*alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
	    	        AlarmManager.INTERVAL_DAY, alarmIntent);*/

 

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

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

public class MusicService extends Service implements OnCompletionListener {

	//为日志工具设置标签
	private static String TAG = "MusicService";
	//定义音乐播放器变量
	private MediaPlayer mPlayer;
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		Log.d(TAG, "MusicSerice onCreate()");
		mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.smoke);
		mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
		super.onCreate();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.d(TAG, "MusicSerice onStart()");
		mPlayer.start();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		Log.d(TAG, "MusicSerice onDestroy()");
		mPlayer.stop();
		super.onDestroy();
	}

	public void onCompletion(MediaPlayer player) {
		// TODO Auto-generated method stub
		stopSelf();
	}

}

 

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

这么快,功能都实现了。

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

 

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

@Override
public void onCreate() {
	// TODO Auto-generated method stub
	Log.e(TAG, "MusicSerice onCreate()");
	mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.smoke);
	mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
	<SPAN style="COLOR: #ff0000">mPlayer.setOnCompletionListener(this);
</SPAN>	super.onCreate();
}

 

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

 

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

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

 

2
0
分享到:
评论

相关推荐

    Android系统闹钟com.android.deskclock源码

    它通过`Notification`类创建闹钟通知,并启动一个Activity来显示闹钟界面,让用户可以停止闹钟或设定其他操作。 在源码中,我们可以看到闹钟的重复设定、静音模式下的处理、闹钟音量控制等多个细节实现。例如,闹钟...

    Android实现闹钟的所有功能(Android studio)

    在Android平台上,开发一款闹钟应用需要掌握一系列关键知识点,包括但不限于系统广播接收者、定时器、通知管理、用户界面设计以及数据存储等。以下是对这些核心概念的详细阐述: 1. **系统广播接收者...

    Android闹钟.zip

    本压缩包"Android闹钟.zip"包含了一个实现此类功能的示例项目,帮助开发者了解如何在Android应用中创建和管理闹钟。 在Android开发中,`AlarmManager`是系统服务类,用于安排一次性或周期性的任务。`AlarmManager`...

    Android源码——闹钟源代码.zip

    在Android系统中,闹钟功能是用户日常生活中不可或缺的一部分,它涉及到系统级的服务以及与用户界面的交互。这个"Android源码——闹钟源代码.zip"文件可能包含了Android系统闹钟应用(DeskClock)的源代码,以及相关...

    android闹钟源码 多个闹钟程序源码合集(15个).zip

    android闹钟源码闹钟程序源码15个合集: AlarmClock.tar.gz AlarmTest.zip AndroidRTC-master.zip Android自动开关机实现.pdf Android自动开关机实现.rar ClockPackage.apk-af47e27b7952e0ecccc9b005352d19d20c67eb...

    android翻转手机闹铃停止源码

    在Android应用开发中,"android翻转手机闹铃停止源码"是一个有趣且实用的功能,它利用了设备的重力感应传感器来实现闹钟的控制。这个功能使得用户可以通过简单的翻转手机动作来关闭闹钟,增加了用户体验的便捷性和...

    Android一个小闹钟例子

    以下将详细解析这个"Android一个小闹钟例子"所涵盖的技术点。 首先,我们需要理解Android的AlarmManager服务。AlarmManager是Android系统提供的一个用于安排周期性或者一次性任务的服务。在这个小闹钟例子中,...

    Android 闹钟源码.zip

    这份"Android 闹钟源码.zip"压缩包包含了一个实现Android闹钟功能的源代码示例,对于开发者来说,这是一个很好的学习和参考资源。我们将深入探讨Android闹钟的实现机制及相关知识点。 1. **AlarmManager**: Android...

    Android项目源码支持闹钟秒表倒计时的小明闹钟.zip_ANDROID 闹钟_android_android秒表_闹钟

    在Android平台上,开发一款具有闹钟、秒表和倒计时功能的应用是一项常见的任务,而“小明闹钟”项目源码就是一个很好的学习资源。这个项目不仅提供了基本的闹钟功能,还集成了秒表和倒计时计时器,为用户提供了全...

    android 闹钟 源代码

    本文将深入探讨Android闹钟功能的源代码实现,并基于提供的"DeskClock"文件名,推测这是一个Android桌面时钟应用的源码。 在Android中,闹钟功能主要依赖`AlarmManager`服务来实现。`AlarmManager`负责调度和管理...

    Android 闹钟 倒计时源代码.rar

    "Android 闹钟 倒计时源代码.rar"是一个包含Android应用源代码的压缩包,它提供了一个名为BrewClock的项目,这个项目实现了闹钟和倒计时功能。下面我们将深入探讨这个源代码中涉及的一些关键知识点。 1. **...

    简单的android闹钟源代码.zip

    在Android平台上,开发一个简单的闹钟应用涉及到许多关键知识点,这些知识点构成了Android应用程序的基础结构以及与系统服务交互的方式。从标题"简单的android闹钟源代码.zip"和描述中,我们可以推测这是一个教学...

    20个android闹钟代码

    本资源提供了20个不同的Android闹钟代码示例,涵盖了多种实现方式和功能,对于开发者来说是一份非常宝贵的参考资料。下面我们将详细探讨这些知识点。 1. **AlarmManager**: Android系统的`AlarmManager`服务是实现...

    利用android传感器实现手机摇一摇解除闹铃

    这个功能允许用户在闹钟响起时,通过简单地摇动手机来停止闹铃,而无需触摸屏幕。接下来,我们将深入探讨如何实现这样一个功能。 首先,我们需要了解Android的传感器系统。Android提供了SensorManager服务,它允许...

    android闹钟源码安卓时钟闹钟程序源码合集(16例).zip

    在Android平台上,开发一款闹钟应用是常见的任务,它涉及到许多关键的技术点。这份"android闹钟源码安卓时钟闹钟程序源码合集(16例)"提供了丰富的实例,帮助开发者深入理解如何实现此类功能。以下是这些源码中可能...

    android设置和取消闹钟

    本文将详细介绍如何在Android中使用AlarmManager来设置和取消闹钟,并结合`TextDemo5`这个项目进行讲解。 一、AlarmManager介绍 AlarmManager是Android系统提供的一个用于安排周期性或一次性任务的服务。它可以调度...

    Android一个小闹钟例子demo.zip

    在这个"Android一个小闹钟例子demo"中,我们可以探索如何构建这样一个实用的功能。 首先,我们关注的是`AlarmManager`,这是Android系统中的一个重要组件,用于安排在未来某个时间执行一次性或重复的任务。在闹钟...

    Android Studio闹钟[android源码]

    在Android平台上,开发一款闹钟应用需要对Android Studio的使用、Android SDK以及AlarmManager服务有深入理解。Android Studio是Google官方推出的集成开发环境,用于构建Android应用,它提供了丰富的工具和功能来...

Global site tag (gtag.js) - Google Analytics