Android編程實現(xiàn)鬧鐘的方法詳解
本文實例講述了Android編程實現(xiàn)鬧鐘的方法。分享給大家供大家參考,具體如下:
在Android中,有一個鬧鐘的類,AlarmManager
類,我們可以通過其來對系統(tǒng)內(nèi)的通知進行操作!
本文用到了Service
和Broadcast
兩個后臺管理,在處理時,曾出現(xiàn)過很多問題,但經(jīng)過半天的努力,終于解決了!
首先是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; //獲取系統(tǒng)進程 am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); //設(shè)置周期??! am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(10*1000), (24*60*60*1000), pendingIntent); String tmps = "設(shè)置鬧鐘時間為:"+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; //獲取系統(tǒng)進程 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 { // 在調(diào)用stop后如果需要再次通過start進行播放,需要之前調(diào)用prepare函數(shù) player.prepare(); } catch (IOException ex) { ex.printStackTrace(); } } } }
下面就是本文的關(guān)鍵性代碼,了解Activity到Broadcast的機制,這小應(yīng)用就很好實現(xiàn)了~
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:關(guān)于AndroidManifest.xml文件相關(guān)屬性功能可參考本站在線工具:
Android Manifest功能與權(quán)限描述大全:
http://tools.jb51.net/table/AndroidManifest
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android通過AlarmManager類實現(xiàn)簡單鬧鐘功能
- Android編程使用AlarmManager設(shè)置鬧鐘的方法
- Android 使用AlarmManager和NotificationManager來實現(xiàn)鬧鐘和通知欄
- Android手機鬧鐘服務(wù)AlarmManagerk開發(fā)案例
- 簡單實現(xiàn)Android鬧鐘程序 附源碼
- Android實現(xiàn)簡易鬧鐘功能
- 簡單實現(xiàn)Android鬧鐘功能
- Android鬧鐘設(shè)置的解決方案
- Android鬧鐘機制實現(xiàn)定時任務(wù)功能
- Android使用AlarmManager設(shè)置鬧鐘功能
相關(guān)文章
Android 線程thread的兩種實現(xiàn)方法(必看)
下面小編就為大家?guī)硪黄狝ndroid 線程thread的兩種實現(xiàn)方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Android開發(fā)之Sqliteopenhelper用法實例分析
這篇文章主要介紹了Android開發(fā)之Sqliteopenhelper用法,實例分析了SQLiteOpenHelper類操作數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-05-05Android自定義View之RadioGroup實現(xiàn)跨多行顯示
這篇文章主要介紹了Android自定義View之RadioGroup實現(xiàn)跨多行顯示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11Android TextView 去掉自適應(yīng)默認的fontpadding的實現(xiàn)方法
這篇文章主要介紹了Android TextView 去掉自適應(yīng)默認的fontpadding的實現(xiàn)方法的相關(guān)資料,希望通過本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Android編程實現(xiàn)ActionBar的home圖標動畫切換效果
這篇文章主要介紹了Android編程實現(xiàn)ActionBar的home圖標動畫切換效果,涉及Android布局、樣式、Activity及菜單相關(guān)操作技巧,需要的朋友可以參考下2017-01-01sqlite查詢結(jié)果在listview中展示的實現(xiàn)
下面小編就為大家?guī)硪黄猻qlite查詢結(jié)果在listview中展示的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04