如何用Service来启动背景音乐
概述:
? ? 其實一開始我也不沒有認真想過當我們在我們的Android程序中添加背景音樂時,這項功能應該怎么實現。只是傻乎乎地在Activity中添加這項功能,并且并不認為自己這樣寫會有什么問題。
思路分析:
? ? 可是,我們是否想過這樣一個問題:如果我們添加的音樂播放器的這個Activity異常關閉或是我們人為關閉時,我們的音樂播放還是否能夠繼續呢?
? ? 答案肯定是不能的。我們的Activity都關閉了,那基于這個Activity的功能又怎么可能還能繼續呢?那你可能會問:那我們應該怎么去實現這個功能呢?有人可能會想到,那我就去重新new一個線程,不就好了嗎?我只能說這個想法很好,不過這個是行不通的。原因可能是你現在new的這個線程是作為UI線程一個子線程,當父線程都停止工作了,子線程又怎么還會茍活!
? ? 其實,我們不要忘了,Android的四大組件中,有一個Service。它的功能類似于Activity,只是Service是在后臺工作,不出現在用戶的視野中。當我們在前臺上進行一個人機交互操作,讓這個操作關聯到Service上,這樣,我們就能夠解決之前我們遇到的那個問題了。
? ? Service中也有一個onCreate()的回調方法,當我們的Service被創建時就會回調這個方法。我們可以在Service被創建時,啟動背景音樂。Service中也有一個onDestroy()的回調方法,當我們的Service被關閉之前會回調這個方法。這樣,我們就可以在onDestroy()這個方法里,寫關閉背景音樂的代碼。下面我給出這個程序的前臺和后臺的關鍵代碼。
前臺程序:
public class MusicActivity extends Activity {Button open, close, getTime;// 保持所啟動的Service的IBinder對象MusicService.MyBinder binder;// 定義一個ServiceConnection對象private ServiceConnection conn = new ServiceConnection(){// 當該Activity與Service連接成功時回調該方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service){System.out.println("--Service Connected--");// 獲取Service的onBind方法所返回的MyBinder對象binder = (MusicService.MyBinder) service;}// 當該Activity與Service斷開連接時回調該方法@Overridepublic void onServiceDisconnected(ComponentName name){System.out.println("--Service Disconnected--");}};@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 獲取程序界面中的start、stop、<span style="font-family: Arial, Helvetica, sans-serif;">getTime</span><span style="font-family: Arial, Helvetica, sans-serif;">按鈕</span>open = (Button) findViewById(R.id.bind);close = (Button) findViewById(R.id.unbind);getTime = (Button) findViewById(R.id.getServiceStatus);// 創建啟動Service的Intentfinal Intent intent = new Intent();// 為Intent設置Action屬性intent.setAction("com.music.service.BIND_SERVICE");open.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 綁定指定SerivcebindService(intent, conn, Service.BIND_AUTO_CREATE);}});close.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 解除綁定SerivceunbindService(conn);}});getTime.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 獲取、并顯示Service的count值Toast.makeText(MusicActivity.this,"Serivce的count值為:" + binder.getCount(),Toast.LENGTH_SHORT).show(); //②}});} }
后臺程序:
public class MusicService extends Service {private int count;private boolean close;MediaPlayer m_PlayMid = null;// 定義onBinder方法所返回的對象private MyBinder binder = new MyBinder();// 通過繼承Binder來實現IBinder類public class MyBinder extends Binder //①{public int getCount(){// 獲取Service的運行狀態:countreturn count;}}// 必須實現的方法,綁定該Service時回調該方法@Overridepublic IBinder onBind(Intent intent){System.out.println("Service is Binded");// 返回IBinder對象return binder;}// Service被創建時回調該方法。@Overridepublic void onCreate(){super.onCreate();System.out.println("Service is Created");m_PlayMid = MediaPlayer.create(this, R.raw.just_the_way_you_are);m_PlayMid.setLooping(true);// 啟動一條線程、動態地修改count狀態值new Thread(){@Overridepublic void run(){while (!close){try{Thread.sleep(1000);}catch (InterruptedException e){}count++;m_PlayMid.start();}}}.start();}// Service被斷開連接時回調該方法@Overridepublic boolean onUnbind(Intent intent){System.out.println("Service is Unbinded");return true;}// Service被關閉之前回調該方法。@Overridepublic void onDestroy(){super.onDestroy();this.close = true;m_PlayMid.stop();System.out.println("Service is Destroyed");} }
源代碼分享:
下面是我的Demo源碼地址:用Service來啟動背景音樂
總結
以上是生活随笔為你收集整理的如何用Service来启动背景音乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android文件操作中的openFil
- 下一篇: Android中的Fragment使用