Android编程实现闹钟的方法详解

本文实例讲述了Android编程实现闹钟的方法。分享给大家供大家参考,具体如下:

在Android中,有一个闹钟的类,AlarmManager类,我们可以通过其来对系统内的通知进行操作!

本文用到了Service和Broadcast两个后台管理,在处理时,曾出现过很多问题,但经过半天的努力,终于解决了!

首先是Main.xml文件:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/mText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/setTimeButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/setTimeButton" /> <Button android:id="@+id/cancelButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancelButton" /> </LinearLayout>

MainActivity.Java:

package com.chiefcto.Alarm; import java.text.Format; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.TimePicker; public class MainActivity extends Activity { //Properties private Button msetButton; private Button mcancelButton; private AlermReceiver uIReceiver; private TextView mTextView; //就用了Java的日历 private Calendar calendar; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); calendar = Calendar.getInstance(); mTextView = (TextView)this.findViewById(R.id.mText); msetButton = (Button)this.findViewById(R.id.setTimeButton); mcancelButton = (Button)findViewById(R.id.cancelButton); msetButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub calendar.setTimeInMillis(System.currentTimeMillis()); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { calendar.setTimeInMillis(System.currentTimeMillis()); //set(f, value) changes field f to value. calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Intent intent = new Intent(MainActivity.this, AlermReceiver.class); intent.putExtra("music", true); PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); AlarmManager am; //获取系统进程 am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); //设置周期!! am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(10*1000), (24*60*60*1000), pendingIntent); String tmps = "设置闹钟时间为:"+format(hourOfDay)+":"+format(minute); mTextView.setText(tmps); } },hour,minute,true).show(); } }); mcancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlermReceiver.class); intent.putExtra("music", true); PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); AlarmManager am; //获取系统进程 am = (AlarmManager)getSystemService(ALARM_SERVICE); //cancel am.cancel(pendingIntent); mTextView.setText("取消了!"); } }); } private String format(int x) { String s = ""+x; if(s.length() == 1) s = "0"+s; return s; } }

AlarmService.java

package com.chiefcto.Alarm; import java.io.IOException; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.RingtoneManager; import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; public class AlarmService extends Service { // MediaPlayer实例 private MediaPlayer player; // IBinder实例 @Override public IBinder onBind(Intent intent) { playMusic(); return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); playMusic(); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (player != null) { player.stop(); player.release(); } } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); if (intent != null) { Bundle bundle = intent.getExtras(); if (bundle != null) { if(bundle.getBoolean("music")) playMusic(); else stopMusic(); } } } public void playMusic() { if(player == null) { Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); try { player = new MediaPlayer(); player.setDataSource(this, uri); final AudioManager audioManager = (AudioManager)this .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { player.setAudioStreamType(AudioManager.STREAM_ALARM); player.setLooping(true); player.prepare(); } } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } if(!player.isPlaying()) { player.start(); } } public void stopMusic() { if (player != null) { player.stop(); try { // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数 player.prepare(); } catch (IOException ex) { ex.printStackTrace(); } } } }

下面就是本文的关键性代码,了解Activity到Broadcast的机制,这小应用就很好实现了~

AlermReceiver.java

package com.chiefcto.Alarm; import java.io.IOException; import java.util.Calendar; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class AlermReceiver extends BroadcastReceiver { private MediaPlayer mMediaPlayer; Context context; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); int minute = calendar.get(Calendar.MINUTE); CharSequence text = String.valueOf(minute); Toast.makeText(context, text, Toast.LENGTH_LONG).show(); this.context = context; Bundle bundle = intent.getExtras(); Intent serviceIntent = new Intent("chief_musicService"); serviceIntent.putExtras(bundle); if(bundle != null) { Log.i("CTO", String.valueOf(bundle.getBoolean("music"))); if(bundle.getBoolean("music")) context.startService(serviceIntent); else context.stopService(serviceIntent); } //在这里是播放不了的!! //playAlarmRing(); } private void playAlarmRing() { Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.setLooping(true); mMediaPlayer.prepare(); } } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mMediaPlayer.start(); } private void StopAlarmRing() { mMediaPlayer.stop(); } }

要注意的是Mainifest.xml:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.chiefcto.Alarm" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".AlarmService"> <intent-filter> <action android:name="chief_musicService"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </service> <receiver android:name=".AlermReceiver" android:process=":remote"/> </application> <uses-permission android:name="android.permission.MOUT_UNMOUNT_FILESYSTEMS"/> </manifest>

注:在模拟器中是运行不了的~

PS:关于AndroidManifest.xml文件相关属性功能可参考本站在线工具:

Android Manifest功能与权限描述大全:
http://tools.jb51.net/table/AndroidManifest

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

时间: 2024-10-24 08:16:57

Android编程实现闹钟的方法详解的相关文章

Android中XUtils3框架使用方法详解(一)_Android

xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

Android 中Context的使用方法详解

Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

Android中XUtils3框架使用方法详解(一)

xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

Android 中RxPermissions 的使用方法详解

Android 中RxPermissions 的使用方法详解 以请求拍照.读取位置权限为例 module的build.gradle: compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar' compile 'io.reactivex.rxjava2:rxjava:2.0.5' AndroidManifest.xml: <uses-permission android:name="android.permission.AC

Android VideoCache视频缓存的方法详解

Android VideoCache视频缓存的方法详解 项目中遇到视频播放,需要加载网络url,不可能每次都进行网络加载,当然了,就需要用到我们的缓存机制 AndroidVideoCache AndroidVideoCache是一个视频/音频缓存库,利用本地代理实现了边下边播,使用起来非常简单. HttpProxyCacheServer是主要类,是一个代理服务器,可以配置缓存文件的数量.缓存文件的大小.缓存文件的目录和缓存文件命名算法,文件缓存均基于LRU算法,利用Builder来配置: //配

Android 监听网络状态方法详解

Android 监听网络状态方法详解 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" /> 二.判断手机网络的几个方案 1)判断是否有网络连接 public boolean isMobileConnected(Context context) { if (context != nul

Android编程闹钟设置方法详解_Android

本文实例讲述了Android编程闹钟设置方法.分享给大家供大家参考,具体如下: 闹钟在生活中最常见了,在Android中可以通过AlarmManager来实现闹钟,AlarmManager类专门用来设置在某个指定的时间去完成指定的时间.AlarmManager就会通过onReceive()方法去执行这些事件,就算系统处于待机状态,同样不会影响运行.可以通过Context.getSystemService方法来获得该服务.AlarmManager中的方法不少,如下: 方法 说明 Cancel 取消

Android编程闹钟设置方法详解

本文实例讲述了Android编程闹钟设置方法.分享给大家供大家参考,具体如下: 闹钟在生活中最常见了,在Android中可以通过AlarmManager来实现闹钟,AlarmManager类专门用来设置在某个指定的时间去完成指定的时间.AlarmManager就会通过onReceive()方法去执行这些事件,就算系统处于待机状态,同样不会影响运行.可以通过Context.getSystemService方法来获得该服务.AlarmManager中的方法不少,如下: 方法 说明 Cancel 取消

Android编程开发之NotiFication用法详解_Android

本文实例讲述了Android编程开发之NotiFication用法.分享给大家供大家参考,具体如下: notification就是通知的意思,安卓中指通知栏,一般用在电话,短信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个快讯,这时手从上方滑动状态栏就可以展开并处理这个快讯. 在帮助文档中,是这么说的, notification类表示一个持久的通知,将提交给用户使用NotificationManager.已添加的Notification.Builder,使其更容易构建通知