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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Service的思考(1)

發(fā)布時間:2025/7/14 Android 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Service的思考(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Android框架中,Service是比較難以理解的一部分,傻蛋查閱了相關(guān)資料和經(jīng)過一系列的代碼測試,準(zhǔn)備寫一個系列文章,嘗試著把Service由淺入深的梳理一遍,幫助大家更快的掌握Android Service。

首先我們先來看看怎么使用Service,然后再談Android Service的內(nèi)部機制。

在Android中Service的啟動方式有兩種,今天先發(fā)第一種。

?

Service的啟動方式一:

啟動:Context.startService(new Intent(context,xxx.class));

停止:Context.stopService() ;

我畫了一個Service啟動的流程圖,相信大家一看就懂。Activity通過Intent啟動Service,如果Service還沒有運行,則android先調(diào)用onCreate()然后調(diào)用onStart();如果Service已經(jīng)運行,則只調(diào)用onStart(),所以一個Service的onStart方法可能會重復(fù)調(diào)用多次。 調(diào)用stopService就會觸發(fā)Service的onDestroy()方法。 圖片點擊放大~

?

?

?

傻蛋做了一個示例程序是一個音樂播放器,界面如下,功能很簡單:播放、暫停、停止音樂、關(guān)閉Activity(這時Service仍然運行,繼續(xù)播放音樂)、退出程序(停止音樂退出Activity)。

?

由于要控制Service的動作,傻蛋寫了一個播放的通用類,這樣以后還能用上,代碼如下:

?

?[Copy to clipboard]Download?zuiniuwang.java
  • /** ?
  • ?*?MyMediaController.java ?
  • ?*?com.androidtest.service.mediaplayer ?
  • ?* ?
  • ?*?Function:?TODO ?
  • ?* ?
  • ?*???ver?????date???????????author ?
  • ?*?────────────────────────────────── ?
  • ?*???????????2011-5-16??????Leon ?
  • ?* ?
  • ?*?Copyright?(c)?2011,?TNT?All?Rights?Reserved. ?
  • ?*/ ?
  • ? ?
  • package?com.androidtest.service.mediaplayer; ?
  • ? ?
  • import?java.io.Serializable; ?
  • ? ?
  • import?android.media.MediaPlayer; ?
  • ? ?
  • /** ?
  • ?*?ClassName:MyMediaController ?
  • ?*?Function:?Mediaplayer?的一個控制類,控制播放器的播放?暫停?停止?等動作 ?
  • ?*?REASON ?
  • ?* ?
  • ?*?@author?Leon ?
  • ?*?@version ?
  • ?*?@since?Ver?1.1 ?
  • ?*?@Date?2011-5-16 ?
  • ?*/ ?
  • public?enum?MyMediaController?implements?Serializable?{ ?
  • ????play?{ ?
  • ????????@Override ?
  • ????????public?void?execute()?{ ?
  • ????????????if?(mediaPlayer?!=?null?&&?!mediaPlayer.isPlaying()) ?
  • ????????????????mediaPlayer.start(); ?
  • ????????????//?TODO?Auto-generated?method?stub ?
  • ????????} ?
  • ? ?
  • ????}, ?
  • ????pause?{ ?
  • ? ?
  • ????????@Override ?
  • ????????public?void?execute()?{ ?
  • ? ?
  • ????????????//?TODO?Auto-generated?method?stub ?
  • ????????????if?(mediaPlayer?!=?null?&&?mediaPlayer.isPlaying())?{ ?
  • ????????????????mediaPlayer.pause(); ?
  • ????????????} ?
  • ????????} ?
  • ? ?
  • ????}, ?
  • ????stop?{ ?
  • ????????@Override ?
  • ????????public?void?execute()?{ ?
  • ????????????//?TODO?Auto-generated?method?stub ?
  • ????????????if?(mediaPlayer?!=?null)?{ ?
  • ????????????????mediaPlayer.stop(); ?
  • ????????????????try?{ ?
  • ????????????????????//?在stop后如果要重新Start需要prepare一下 ?
  • ????????????????????mediaPlayer.prepare(); ?
  • ????????????????????//?從頭播放 ?
  • ????????????????????mediaPlayer.seekTo(0); ?
  • ? ?
  • ????????????????}?catch?(Exception?e)?{ ?
  • ? ?
  • ????????????????????//?TODO?Auto-generated?catch?block ?
  • ????????????????????e.printStackTrace(); ?
  • ? ?
  • ????????????????} ?
  • ????????????} ?
  • ????????} ?
  • ? ?
  • ????}; ?
  • ????public?static?MediaPlayer?mediaPlayer; ?
  • ? ?
  • ????public?abstract?void?execute(); ?
  • }?
  • 然后是控制播放的Activity

    ?[Copy to clipboard]Download?zuiniuwang.java
  • /** ?
  • ?*?MusicPlayer.java ?
  • ?*?com.androidtest.activity ?
  • ?* ?
  • ?*?Function:?TODO ?
  • ?* ?
  • ?*???ver?????date???????????author ?
  • ?*?────────────────────────────────── ?
  • ?*???????????2011-5-15??????Leon ?
  • ?* ?
  • ?*?Copyright?(c)?2011,?TNT?All?Rights?Reserved. ?
  • ?*/ ?
  • ? ?
  • package?com.androidtest.activity.musicplayer; ?
  • ? ?
  • import?android.app.Activity; ?
  • import?android.content.Intent; ?
  • import?android.os.Bundle; ?
  • import?android.util.Log; ?
  • import?android.view.View; ?
  • import?android.view.View.OnClickListener; ?
  • import?android.widget.Button; ?
  • ? ?
  • import?com.androidtest.MyImageButton; ?
  • import?com.androidtest.R; ?
  • import?com.androidtest.service.mediaplayer.MyMediaController; ?
  • import?com.androidtest.service.mediaplayer.NormalMusicService; ?
  • ? ?
  • /** ?
  • ?*?ClassName:MusicPlayer?Function:?TODO?ADD?FUNCTION?Reason:?TODO?ADD?REASON ?
  • ?* ?
  • ?*?@author?Leon ?
  • ?*?@version ?
  • ?*?@since?Ver?1.1 ?
  • ?*?@Date?2011-5-15 ?
  • ?*/ ?
  • public?class?NormalMusicPlayerActivity?extends?Activity?implements?OnClickListener?{ ?
  • ????private?static?final?String?TAG?=?NormalMusicPlayerActivity.class.getSimpleName(); ?
  • ????private?Intent?intent?; ?
  • ????@Override ?
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{ ?
  • ? ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????super.onCreate(savedInstanceState); ?
  • ????????this.setContentView(R.layout.music_player_layout); ?
  • ????????Button?playButton?=?(Button)?this.findViewById(R.id.play); ?
  • ????????playButton.setOnClickListener(this); ?
  • ????????Button?pauseButton?=(Button)?this.findViewById(R.id.pause); ?
  • ????????pauseButton.setOnClickListener(this); ?
  • ????????Button?stopButton?=(Button)this.findViewById(R.id.stop); ?
  • ????????stopButton.setOnClickListener(this); ?
  • ????????Button?closeActivityButton?=(Button)this.findViewById(R.id.close); ?
  • ????????closeActivityButton.setOnClickListener(this); ?
  • ????????Button?exitActivityButton?=(Button)this.findViewById(R.id.exit); ?
  • ????????exitActivityButton.setOnClickListener(this); ?
  • ? ?
  • ????????intent?=?new?Intent("com.androidtest.service.mediaplayer.NormalMusicService"); ?
  • ????} ?
  • ? ?
  • ????private?void?playAction(MyMediaController?playType)?{ ?
  • ? ?
  • ????????Bundle?bundle?=?new?Bundle(); ?
  • ????????bundle.putSerializable(NormalMusicService.INTENT_KEY,?playType); ?
  • ????????intent.putExtras(bundle); ?
  • ????????NormalMusicPlayerActivity.this.startService(intent); ?
  • ????} ?
  • ? ?
  • ????@Override ?
  • ????public?void?onClick(View?view)?{ ?
  • ? ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????switch?(view.getId())?{ ?
  • ????????case?R.id.play: ?
  • ????????????Log.d(TAG,?"play......."); ?
  • ????????????playAction(MyMediaController.play); ?
  • ????????????break; ?
  • ????????case?R.id.pause: ?
  • ????????????Log.d(TAG,?"pause......."); ?
  • ????????????playAction(MyMediaController.pause); ?
  • ????????????break; ?
  • ????????case?R.id.stop: ?
  • ????????????Log.d(TAG,?"stop......."); ?
  • ????????????playAction(MyMediaController.stop); ?
  • ????????????break; ?
  • ????????case?R.id.close: ?
  • ????????????Log.d(TAG,?"close......."); ?
  • ????????????this.finish(); ?
  • ????????????break; ?
  • ????????case?R.id.exit: ?
  • ????????????Log.d(TAG,?"exit......."); ?
  • ????????????stopService(intent); ?
  • ????????????this.finish(); ?
  • ? ?
  • ????????} ?
  • ? ?
  • ????} ?
  • ? ?
  • }?
  • 最后是Service類

    ?[Copy to clipboard]Download?zuiniuwang.java
  • /** ?
  • ?*?MusicService.java ?
  • ?*?com.androidtest.service ?
  • ?* ?
  • ?*?Function:?TODO ?
  • ?* ?
  • ?*???ver?????date???????????author ?
  • ?*?────────────────────────────────── ?
  • ?*???????????2011-5-15??????Leon ?
  • ?* ?
  • ?*?Copyright?(c)?2011,?TNT?All?Rights?Reserved. ?
  • */ ?
  • ? ?
  • package?com.androidtest.service.mediaplayer; ?
  • import?java.io.Serializable; ?
  • ? ?
  • import?android.app.Service; ?
  • import?android.content.Intent; ?
  • import?android.media.MediaPlayer; ?
  • import?android.os.IBinder; ?
  • import?android.util.Log; ?
  • ? ?
  • import?com.androidtest.R; ?
  • ? ?
  • /** ?
  • ?*?ClassName:MusicService ?
  • ?*?Function:?TODO?ADD?FUNCTION ?
  • ?*?Reason:???TODO?ADD?REASON ?
  • ?* ?
  • ?*?@author???Leon ?
  • ?*?@version ?
  • ?*?@since????Ver?1.1 ?
  • ?*?@Date?????2011-5-15 ?
  • ?*/ ?
  • public?class?NormalMusicService?extends?Service{ ?
  • ? ?
  • ????private??String??TAG?=?NormalMusicService.class.getSimpleName(); ?
  • ????private??MediaPlayer?myMediaPlayer?; ?
  • ????public???static?final??String?INTENT_KEY=?"action"?; ?
  • ????@Override ?
  • ????public?IBinder?onBind(Intent?arg0)?{? ?
  • ? ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????return?null; ?
  • ? ?
  • ????} ?
  • ? ?
  • ????@Override ?
  • ????public?void?onCreate()?{ ?
  • ? ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????Log.v(TAG?,?TAG+?"?onCreate()"); ?
  • ????????super.onCreate(); ?
  • ????????if(myMediaPlayer==null){ ?
  • ????????????myMediaPlayer=MediaPlayer.create(this,?R.raw.test)?; ?
  • ????????????myMediaPlayer.setLooping(false); ?
  • ????????} ?
  • ????} ?
  • ? ?
  • ????@Override ?
  • ????public?void?onStart(Intent?intent,?int?startId)?{ ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????Log.v(TAG?,?TAG?+?"?onStart()"); ?
  • ????????super.onStart(intent,?startId); ?
  • ????????if(intent!=null){ ?
  • ????????????MyMediaController?mediaControl?=(MyMediaController)intent.getSerializableExtra(NormalMusicService.INTENT_KEY); ?
  • ????????????mediaControl.mediaPlayer=myMediaPlayer; ?
  • ????????????mediaControl.execute(); ?
  • ????????} ?
  • ????} ?
  • ? ?
  • ????@Override ?
  • ????public?void?onDestroy()?{ ?
  • ? ?
  • ????????//?TODO?Auto-generated?method?stub ?
  • ????????super.onDestroy(); ?
  • ????????Log.v(TAG?,?"?onDestroy"); ?
  • ????????if(myMediaPlayer!=null){ ?
  • ????????????myMediaPlayer.stop(); ?
  • ????????????myMediaPlayer.release(); ?
  • ????????} ?
  • ? ?
  • ????} ?
  • ? ?
  • }?
  • ?


    本文轉(zhuǎn)自 最牛傻蛋 51CTO博客,原文鏈接:http://blog.51cto.com/zuiniuwang/718320,如需轉(zhuǎn)載請自行聯(lián)系原作者

    總結(jié)

    以上是生活随笔為你收集整理的Android Service的思考(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。