上一节讲到了Gallery画廊,本节主要讲解Android组件Service,主要内容包括:Service的概念、生命周期及其应用实例。
一、Service简介
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。
二、Service的生命周期
Service对象不能自己启动,需要通过某个Activity、Service或者其他Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不同的,具体如下所示。
Context.startService方式的生命周期:
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()
Context.bindService方式的生命周期:
绑定时,bindService -> onCreate() –> onBind()
解绑定时,unbindService –>onUnbind() –> onDestory()
三、Service应用实例:控制音乐播放的Service
下面我们用一个可以控制在后台播放音乐的例子来演示刚才所学知识,同学们可以通过该例子可以明显看到通过绑定方式运行的Service在绑定对象被销毁后也被销毁了。
下面是编写该实例的步骤:
1、建立一个新项目名字叫Lesson14_HelloService,Activity起名叫MainHelloService.java。
2、res/layout/main.xml中代码如下:
XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>
3、在res目录中建立一个raw目录,并把一个音乐文件babayetu.mp3拷贝进来。
4、在Activity的同目录新建一个service文件MusicService.java。
Java代码packageandroid.basic.lesson14;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.media.MediaPlayer;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassMusicServiceextendsService {
//为日志工具设置标签
String tag ="MusicService";
//定义音乐播放器变量
MediaPlayer mPlayer;
//其他对象通过bindService方法通知该Service时该方法会被调用
@Override
publicIBinder onBind(Intent intent) {
Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show();
Log.i(tag,"MusicService onBind()");
mPlayer.start();
returnnull;
}
//其他对象通过unbindService方法通知该Service时该方法会被调用
@Override
publicbooleanonUnbind(Intent intent){
Toast.makeText(this,"MusicService onUnbind()", Toast.LENGTH_SHORT).show();
Log.i(tag,"MusicService onUnbind()");
mPlayer.stop();
returnfalse;
}
//该服务不存在需要被创建时被调用,不管startService()还是bindService()都会在启动时调用该方法
@Override
publicvoidonCreate(){
Toast.makeText(this,"MusicService onCreate()", Toast.LENGTH_SHORT).show();
//创建一个音乐播放器对象
mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
//设置可以重复播放
mPlayer.setLooping(true);
Log.i(tag,"MusicService onCreate()");
}
//用startService方法调用该服务时,在onCreate()方法调用之后,会调用改方法
@Override
publicvoidonStart(Intent intent,intstartid){
Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show();
Log.i(tag,"MusicService onStart()");
mPlayer.start();
}
//该服务被销毁时调用该方法
@Override
publicvoidonDestroy(){
Toast.makeText(this,"MusicService onDestroy()", Toast.LENGTH_SHORT).show();
mPlayer.stop();
Log.i(tag,"MusicService onDestroy()");
}
}
5、MainHelloService.java中的代码:
Java代码packageandroid.basic.lesson14;
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;
publicclassMainHelloServiceextendsActivity {
//为日志工具设置标签
String tag ="MusicService";
/** Called when the activity is first created. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//输出Toast消息和日志记录
Toast.makeText(MainHelloService.this,"MainHelloService onCreate", Toast.LENGTH_SHORT).show();
Log.i(tag,"MainHelloService onCreate");
//定义组件对象
Button b1= (Button)findViewById(R.id.Button01);
Button b2= (Button)findViewById(R.id.Button02);
Button b3= (Button)findViewById(R.id.Button03);
Button b4= (Button)findViewById(R.id.Button04);
//定义服务链接对象
finalServiceConnection conn =newServiceConnection(){
@Override
publicvoidonServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MainHelloService.this,"ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show();
Log.i(tag,"ServiceConnection onServiceConnected");
}
@Override
publicvoidonServiceDisconnected(ComponentName name) {
Toast.makeText(MainHelloService.this,"ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show();
Log.i(tag,"ServiceConnection onServiceDisconnected");
}};
//定义点击监听器
OnClickListener ocl=newOnClickListener(){
@Override
publicvoidonClick(View v) {
//显示指定intent所指的对象是个Service
Intent intent =newIntent(MainHelloService.this,android.basic.lesson14.MusicService.class);
switch(v.getId()){
caseR.id.Button01:
//开始服务
startService(intent);
break;
caseR.id.Button02:
//停止服务
stopService(intent);
break;
caseR.id.Button03:
//绑定服务
bindService(intent,conn,Context.BIND_AUTO_CREATE);
break;
caseR.id.Button04:
//解除绑定
unbindService(conn);
break;
}
}
};
//绑定点击监听器
b1.setOnClickListener(ocl);
b2.setOnClickListener(ocl);
b3.setOnClickListener(ocl);
b4.setOnClickListener(ocl);
}
@Override
publicvoidonDestroy(){
super.onDestroy();
Toast.makeText(MainHelloService.this,"MainHelloService onDestroy", Toast.LENGTH_SHORT).show();
Log.i(tag,"MainHelloService onDestroy");
}
}
了解了Service的概念、生命周期,又跟着做了一个实例,相信大家现在对Service的使用已经有了一个基本的掌握了。
2012年7月14日