生活随笔
收集整理的這篇文章主要介紹了
Android Service的思考(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Android框架中,Service是比較難以理解的一部分,傻蛋查閱了相關資料和經過一系列的代碼測試,準備寫一個系列文章,嘗試著把Service由淺入深的梳理一遍,幫助大家更快的掌握Android Service。
首先我們先來看看怎么使用Service,然后再談Android Service的內部機制。
在Android中Service的啟動方式有兩種,今天先發第一種。
?
Service的啟動方式一:
啟動:Context.startService(new Intent(context,xxx.class));
停止:Context.stopService() ;
我畫了一個Service啟動的流程圖,相信大家一看就懂。Activity通過Intent啟動Service,如果Service還沒有運行,則android先調用onCreate()然后調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重復調用多次。 調用stopService就會觸發Service的onDestroy()方法。 圖片點擊放大~
?
?
?
傻蛋做了一個示例程序是一個音樂播放器,界面如下,功能很簡單:播放、暫停、停止音樂、關閉Activity(這時Service仍然運行,繼續播放音樂)、退出程序(停止音樂退出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(); ?????????} ?? ?????} ?? ?}??
本文轉自 最牛傻蛋 51CTO博客,原文鏈接:http://blog.51cto.com/zuiniuwang/718320,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Android Service的思考(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。