
本文实例讲述了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,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); 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程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android编程实现闹钟的方法详解全部内容,希望文章能够帮你解决Android编程实现闹钟的方法详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)