【Android】簡易音樂播放器(介紹使用Service和Broadcast播放音樂檔案)

來源:互聯網
上載者:User

使用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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.