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] Downloadzuiniuwang.java /** *MyMediaController.java *com.androidtest.service.mediaplayer * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-16Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; importjava.io.Serializable; importandroid.media.MediaPlayer; /** *ClassName:MyMediaController *Function:Mediaplayer的一个控制类,控制播放器的播放暂停停止等动作 *REASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-16 */ publicenumMyMediaControllerimplementsSerializable{ play{ @Override publicvoidexecute(){ if(mediaPlayer!=null&&!mediaPlayer.isPlaying()) mediaPlayer.start(); //TODOAuto-generatedmethodstub } }, pause{ @Override publicvoidexecute(){ //TODOAuto-generatedmethodstub if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ mediaPlayer.pause(); } } }, stop{ @Override publicvoidexecute(){ //TODOAuto-generatedmethodstub if(mediaPlayer!=null){ mediaPlayer.stop(); try{ //在stop后如果要重新Start需要prepare一下 mediaPlayer.prepare(); //从头播放 mediaPlayer.seekTo(0); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } }; publicstaticMediaPlayermediaPlayer; publicabstractvoidexecute(); } 然后是控制播放的Activity ?[Copy to clipboard] Downloadzuiniuwang.java /** *MusicPlayer.java *com.androidtest.activity * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-15Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.activity.musicplayer; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importcom.androidtest.MyImageButton; importcom.androidtest.R; importcom.androidtest.service.mediaplayer.MyMediaController; importcom.androidtest.service.mediaplayer.NormalMusicService; /** *ClassName:MusicPlayerFunction:TODOADDFUNCTIONReason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-15 */ publicclassNormalMusicPlayerActivityextendsActivityimplementsOnClickListener{ privatestaticfinalStringTAG=NormalMusicPlayerActivity.class.getSimpleName(); privateIntentintent; @Override protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); this.setContentView(R.layout.music_player_layout); ButtonplayButton=(Button)this.findViewById(R.id.play); playButton.setOnClickListener(this); ButtonpauseButton=(Button)this.findViewById(R.id.pause); pauseButton.setOnClickListener(this); ButtonstopButton=(Button)this.findViewById(R.id.stop); stopButton.setOnClickListener(this); ButtoncloseActivityButton=(Button)this.findViewById(R.id.close); closeActivityButton.setOnClickListener(this); ButtonexitActivityButton=(Button)this.findViewById(R.id.exit); exitActivityButton.setOnClickListener(this); intent=newIntent("com.androidtest.service.mediaplayer.NormalMusicService"); } privatevoidplayAction(MyMediaControllerplayType){ Bundlebundle=newBundle(); bundle.putSerializable(NormalMusicService.INTENT_KEY,playType); intent.putExtras(bundle); NormalMusicPlayerActivity.this.startService(intent); } @Override publicvoidonClick(Viewview){ //TODOAuto-generatedmethodstub switch(view.getId()){ caseR.id.play: Log.d(TAG,"play......."); playAction(MyMediaController.play); break; caseR.id.pause: Log.d(TAG,"pause......."); playAction(MyMediaController.pause); break; caseR.id.stop: Log.d(TAG,"stop......."); playAction(MyMediaController.stop); break; caseR.id.close: Log.d(TAG,"close......."); this.finish(); break; caseR.id.exit: Log.d(TAG,"exit......."); stopService(intent); this.finish(); } } } 最后是Service类 ?[Copy to clipboard] Downloadzuiniuwang.java /** *MusicService.java *com.androidtest.service * *Function:TODO * *verdateauthor *────────────────────────────────── *2011-5-15Leon * *Copyright(c)2011,TNTAllRightsReserved. */ packagecom.androidtest.service.mediaplayer; importjava.io.Serializable; importandroid.app.Service; importandroid.content.Intent; importandroid.media.MediaPlayer; importandroid.os.IBinder; importandroid.util.Log; importcom.androidtest.R; /** *ClassName:MusicService *Function:TODOADDFUNCTION *Reason:TODOADDREASON * *@authorLeon *@version *@sinceVer1.1 *@Date2011-5-15 */ publicclassNormalMusicServiceextendsService{ privateStringTAG=NormalMusicService.class.getSimpleName(); privateMediaPlayermyMediaPlayer; publicstaticfinalStringINTENT_KEY="action"; @Override publicIBinderonBind(Intentarg0){ //TODOAuto-generatedmethodstub returnnull; } @Override publicvoidonCreate(){ //TODOAuto-generatedmethodstub Log.v(TAG,TAG+"onCreate()"); super.onCreate(); if(myMediaPlayer==null){ myMediaPlayer=MediaPlayer.create(this,R.raw.test); myMediaPlayer.setLooping(false); } } @Override publicvoidonStart(Intentintent,intstartId){ //TODOAuto-generatedmethodstub Log.v(TAG,TAG+"onStart()"); super.onStart(intent,startId); if(intent!=null){ MyMediaControllermediaControl=(MyMediaController)intent.getSerializableExtra(NormalMusicService.INTENT_KEY); mediaControl.mediaPlayer=myMediaPlayer; mediaControl.execute(); } } @Override publicvoidonDestroy(){ //TODOAuto-generatedmethodstub super.onDestroy(); Log.v(TAG,"onDestroy"); if(myMediaPlayer!=null){ myMediaPlayer.stop(); myMediaPlayer.release(); } } } 本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718320,如需转载请自行联系原作者