使用service播放sdcard中的一首歌曲,並在service中通過廣播broadcast通知Activity更新介面。下面三個最終的圖分別是:初始化時,播放時,暫停時。
介面是兩個按鈕,採用LinearLayout布局。代碼如下:
<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="horizontal"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><Button<br /> android:id="@+id/btnPlayOrPause"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="播放"<br /> android:layout_weight="1"<br /> android:onClick="clickHandle"<br /> /><br /><Button<br /> android:id="@+id/btnStop"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="停止"<br /> android:layout_weight="1"<br /> android:onClick="clickHandle"<br /> /><br /></LinearLayout>
1.主Activity中,有四部分:onCreate()方法、onDestroy()方法、BroadcastReceiver的一個類updateUIReceiver、和按鈕事件處理方法clickHandl()。
在onCreate()方法中主要是註冊一個廣播。注意在onCreate()裡註冊,記得在onDestroy()方法裡解除註冊。
@Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);</p><p> btnStartOrPause = (Button) findViewById(R.id.btnPlayOrPause);<br /> btnStop = (Button) findViewById(R.id.btnStop);</p><p> //onCreate()裡註冊BroadcastReceiver<br /> //onDestroy()裡解除註冊<br /> //下面的"giuz.receiver.music"要在manifest.xml裡註冊 <br /> IntentFilter filter = new IntentFilter("giuz.receiver.music");<br /> registerReceiver(updatUIReceiver, filter);</p><p> }
在onDestroy()方法裡解除註冊,不然退出時會報異常。
@Override<br /> protected void onDestroy() {<br /> super.onDestroy();<br /> unregisterReceiver(updatUIReceiver);<br /> }
這裡的廣播類是在Activity裡面定義的(也可以作為一個單獨的類來寫)。
//定義一個BroadcastReceiver<br /> private BroadcastReceiver updatUIReceiver = new BroadcastReceiver() {<br /> //當service發出廣播後,此方法就可以得到service傳回來的值<br /> @Override<br /> public void onReceive(Context context, Intent intent) {<br /> //更新介面。這裡改變Button的值<br /> //得到intent返回來的值,0表示此時是播放,1表示暫停, 2是停止<br /> int backFlag = intent.getExtras().getInt("backFlag");<br /> switch(backFlag){<br /> case 0:<br /> btnStartOrPause.setText("暫停");<br /> break;<br /> case 1:<br /> case 2:<br /> btnStartOrPause.setText("播放");<br /> break;<br /> }<br /> }<br /> };
按鈕處理事件
//處理按鈕事件<br /> public void clickHandle(View v){<br /> switch(v.getId()){<br /> case R.id.btnPlayOrPause:<br /> intent = new Intent(AudioActi.this, giuz.service.MyAudioService.class);<br /> Bundle bundle2service = new Bundle();<br /> bundle2service.putString("audioPath", AUDIO_PATH);//前面要定義AUDIO_PATH<br /> //BC_RECEIVER也要在前面定義,並在manifest.xml裡註冊<br /> bundle2service.putString("bc_receiver", BC_RECEIVER);<br /> intent.putExtras(bundle2service);<br /> startService(intent);//開啟服務<br /> break;<br /> case R.id.btnStop:<br /> if(intent != null){<br /> stopService(intent);//停止服務<br /> }<br /> break;<br /> }<br /> }
2.在Service裡,主要有onStart()、onDestroy()和sendBC4UpdateUI()幾個方法。
先定義好下面這些對象
private MediaPlayer mediaPlayer = null;<br />private Intent intent2bc = null;<br />private Bundle bundle2bc = null;<br />private String audioPath = null;<br />private String bc_receiver = null;
在onStart()方法中,通過用mediaPlayer.isPlaying()方法來判斷當前音樂是在播放還是暫停,並利用廣播傳遞相應的值給Activity用以更新介面。
@Override<br /> public void onStart(Intent intent, int startId) {<br /> super.onStart(intent, startId);<br /> audioPath = intent.getExtras().getString("audioPath");<br /> bc_receiver = intent.getExtras().getString("bc_receiver");<br /> //1.現正播放<br /> //使其暫停播放,並通知介面將Button的值改為"播放"(如果現正播放,Button值是"暫停")<br /> if(mediaPlayer != null && mediaPlayer.isPlaying()){<br /> mediaPlayer.pause();<br /> sendBC4UpdateUI(1);//更新介面<br /> }<br /> //2.正在暫停<br /> else{<br /> if(mediaPlayer == null){<br /> mediaPlayer = new MediaPlayer();//如果被停止了,則為null<br /> try {<br /> mediaPlayer.setDataSource(audioPath);//設定播放的檔案的路徑<br /> mediaPlayer.prepare();<br /> } catch (IllegalArgumentException e) {<br /> e.printStackTrace();<br /> } catch (IllegalStateException e) {<br /> e.printStackTrace();<br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> }<br /> }</p><p> mediaPlayer.start();<br /> sendBC4UpdateUI(0);//更新介面</p><p> }</p><p> }
在onDestroy()方法中,要release掉mediaPlayer。
@Override<br /> public void onDestroy() {<br /> if(mediaPlayer !=null){<br /> mediaPlayer.release();//停止時要release<br /> sendBC4UpdateUI(2);//更新介面<br /> }<br /> super.onDestroy();<br /> }
而在sendBC4UpdateUI()方法裡,就是發送廣播了。
private void sendBC4UpdateUI(int flag) {<br /> intent2bc = new Intent(bc_receiver);//bc_receiver前面已有定義,是從Activity傳過來的<br /> //如果缺少下面這句,關掉再重新開啟播放器裡點“停止”並不能停掉<br /> intent2bc.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);<br /> bundle2bc = new Bundle();<br /> bundle2bc.putInt("backFlag", flag);//把flag傳回去<br /> intent2bc.putExtras(bundle2bc);<br /> sendBroadcast(intent2bc);//發送廣播<br /> //發送後,在Activity裡的updateUIReceiver的onReceiver()方法裡就能做相應的更新介面的工作了<br /> }
3.最後,manifest.xml註冊如下。
<?xml version="1.0" encoding="utf-8"?><br />....<br /> <application android:icon="@drawable/icon" android:label="@string/app_name"><br /> <service android:name="giuz.service.MyAudioService"></service><br /> <activity....<br /> </activity><br /> </application><br /> <uses-sdk android:minSdkVersion="8" /><br /></manifest>
以後可以通過改進做成一個mp3播放器。
轉自: http://www.cnblogs.com/giuz/archive/2010/10/31/1865470.html