日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何用Service来启动背景音乐

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何用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來啟動背景音樂


《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的如何用Service来启动背景音乐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。