实验八Service实验【实验类型】验证性【实验要求】必做【实验目的】1.了解Service的常用方法。2.了解创建和使用Service的方法。3.掌握Service的生命周期。一、Service简介Service是Android的四大基础组件之一,它和Activity一样都是Context的子类,只不过没有UI界面,是在后台运行的组件。它是不能与用户交互的,不能自己启动,运行在后台的程序,如退出应用时,Service进程并没有结束,它仍然在后台运行,例如打开一个音乐播放器来听音乐,在听音乐的同时也想下其它的事情,比如上网聊Q、或者上网浏览新闻之类的事情,就需要用到Service服务。二、Service的生命周期继承了onCreate(),onStart(),onDestory()三个方法。当第一次启动Service服务时,调用onCreate()--onStart()两个方法,当停止Service服务时,调用onDestory()方法。如果Service已经启动了,第二次再启动同一个服务时,就只是调用onStart()这个方法了。【实验内容】下面是音乐播放器Demo的程序结构图:AndroidService的使用:[1]参照上面的程序结构图,我们可以创建一个Android程序,在src目录下创建一个Activity,一个继承自Service类的服务类;同时在资源文件夹res目录下创建一个raw的文件夹存放音频文件,如把music.mp3音乐文件放在该目录下。该程序的主界面如下:参照上面的程序结构图,我们可以创建一个Android程序,在src目录下创建一个Activity,一个继承自Service类的服务类;同时在资源文件夹res目录下创建一个raw的文件夹存放音频文件,如把music.mp3音乐文件放在该目录下。该程序的主界面如下:[2]layout目录下的main.xml文件的源码:?xmlversion=1.0encoding=utf-8?LinearLayoutxmlns:android=:orientation=verticalandroid:layout_width=fill_parentandroid:layout_height=fill_parentTextViewandroid:layout_width=fill_parentandroid:layout_height=wrap_contentandroid:text=WelcometoAndy'sblog!android:textSize=16sp/TextViewandroid:layout_width=fill_parentandroid:layout_height=wrap_contentandroid:text=音乐播放服务/Buttonandroid:id=@+id/startMusicandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=开启音乐播放服务/Buttonandroid:id=@+id/stopMusicandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=停止音乐播放服务/Buttonandroid:id=@+id/bindMusicandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=绑定音乐播放服务/Buttonandroid:id=@+id/unbindMusicandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=解除——绑定音乐播放服务//LinearLayout[3]src目录下MusicService.java源码:packagecom.andyidea.service;importandroid.app.Service;importandroid.content.Intent;importandroid.media.MediaPlayer;importandroid.os.IBinder;importandroid.util.Log;importandroid.widget.Toast;publicclassMusicServiceextendsService{//为日志工具设置标签privatestaticStringTAG=MusicService;//定义音乐播放器变量privateMediaPlayermPlayer;//该服务不存在需要被创建时被调用,不管startService()还是bindService()都会启动时调用该方法@OverridepublicvoidonCreate(){Toast.makeText(this,MusicSeviceonCreate(),Toast.LENGTH_SHORT).show();Log.e(TAG,MusicSericeonCreate());mPlayer=MediaPlayer.create(getApplicationContext(),R.raw.music);//设置可以重复播放mPlayer.setLooping(true);super.onCreate();}@OverridepublicvoidonStart(Intentintent,intstartId){Toast.makeText(this,MusicSeviceonStart()Toast.LENGTH_SHORT).show();Log.e(TAG,MusicSericeonStart());mPlayer.start();super.onStart(intent,startId);}@OverridepublicvoidonDestroy(){Toast.makeText(this,MusicSeviceonDestroy(),Toast.LENGTH_SHORT).show();Log.e(TAG,MusicSericeonDestroy());mPlayer.stop();super.onDestroy();}//其他对象通过bindService方法通知该Service时该方法被调用@OverridepublicIBinderonBind(Intentintent){Toast.makeText(this,MusicSeviceonBind(),Toast.LENGTH_SHORT).show();Log.e(TAG,MusicSericeonBind());mPlayer.start();returnnull;}//其它对象通过unbindService方法通知该Service时该方法被调用@OverridepublicbooleanonUnbind(Intentintent){Toast.makeText(this,MusicSeviceonUnbind(),Toast.LENGTH_SHORT).show();Log.e(TAG,MusicSericeonUnbind());mPlayer.stop();returnsuper.onUnbind(intent);}}[3]在res目录中建立一个raw目录,并把一个音乐文件music.mp3拷贝进来。[4]src目录下MusicServiceActivity源码:packagecom.andyidea.service;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.os.Bundle;importandroid.os.IBinder;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;publicclassMusicServiceActivityextendsActivity{//为日志工具设置标签privatestaticStringTAG=MusicService;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//输出Toast消息和日志记录Toast.makeText(this,MusicServiceActivity,Toast.LENGTH_SHORT).show();Log.e(TAG,MusicServiceActivity);initlizeViews();}privatevoidinitlizeViews(){ButtonbtnStart=(Button)findViewById(R.id.startMusic);ButtonbtnStop=(Button)findViewById(R.id.stopMusic);ButtonbtnBind=(Button)findViewById(R.id.bindMusic);ButtonbtnUnbind=(Button)findViewById(R.id.unbindMusic);//定义点击监听器OnClickListenerocl=newOnClickListener(){@OverridepublicvoidonClick(Viewv){//显示指定intent所指的对象是个serviceIntentintent=newIntent(MusicServiceActivity.this,MusicService.class);switch(v.getId()){caseR.id.startMusic://开始服务startService(intent);break;caseR.id.stopMusic://停止服务stopService(intent);break;caseR.id.bindMusic://绑定服务bindService(intent,conn,Context.BIND_AUTO_CREATE);break;caseR.id.unbindMusic://解绑服务unbindService(conn);break;}}};//绑定点击监听btnStart.setOnClickListener(ocl);btnStop.setOnClickListener(ocl);btnBind.setOnClickListener(ocl);btnUnbind.setOnClickListener(ocl);}//定义服务链接对象finalServiceConnectionconn=newServiceConnection(){@OverridepublicvoidonServiceDisconnected(ComponentNamename){Toast.makeText(MusicServic