目录
一、服务的定义
服务:在后台运行的,没有界面的组件。
二、服务的应用
应用:
- 一些不需要界面的操作,如:音乐播放的一系列逻辑。
- 需要界面时,可以设置前台服务。
三、服务的生命周期
startService 启动服务, stopService/stopSelf停止服务
- onCreate 服务创建时执行
- onStartCommand 开始服务时执行
- onDestroy 停止服务时执行
bindService 绑定服务, unbindService 解绑服务
- onCreate 绑定服务时执行
- onBind 绑定服务时执行
- onDestroy 解绑服务时执行
注意事项
- 如果服务创建了,之后再创建只会回调 onStartCommand。
- 第一次创建服务,会先调 onCreate 且只会执行一次。
- 如果开启服务和绑定服务的方法一起使用,必须停止和解绑一起使用才能销毁服务。
四、服务的创建
代码中
public class MyService extends Service { // Service 的实现类
@Nullable
@Override
public IBinder onBind(Intent intent) { // 返回 IBinder 对象,用来和调用服务的组件通信
return null;
}
}
清单文件中
<service android:name=".MyService" // 指定服务的路径
android:enabled="true" // 是否允许本程序以外的程序使用该服务
android:exported="true"/> // 是否启用该服务
五、服务的开启与停止
打开服务
Intent object = new Intent(MainActivity.this,MyService.class);//指定需要打开的服务类
startService(object);//打开服务
关闭服务
方法一
Intent object = new Intent(MainActivity.this,MyService.class);//指定需要关闭的服务类
stopService(object);//停止服务
注意事项:服务只会创建一次,创建一个,之后都是打开。也就是 onCreate 只回调一次,之后如果再次打开都是回调 onStartCommand。
方法二
stopSelf() //服务内部调用
绑定服务
/**
*bindService 参数讲解
* 第一个参数为指定需要解绑的服务意图
* 第二个参数为ServiceConnection
* 第三个参数为BIND_AUTO_CREATE,表示如果没有创建服务自动创建服务
*/
Intent object = new Intent(MainActivity.this,MyService.class);//指定需要绑定的服务类
bindService(object,myServiceConnection,BIND_AUTO_CREATE);//绑定服务
解绑服务
unbindService(myServiceConnection);//解绑服务
ServiceConnection 的两种处理方式
第一种 使用内部类的方式
特点:只能创建一次不能重复创建
private ServiceConnection myServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //在服务执行 onBind 方法后回调
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//在服务与组件解绑后回调
}
};
第二种 采取实现类的方式
特点:可以多次重复创建
private MyServiceConnection myServiceConnection = new MyServiceConnection();
private class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
六、服务和组件通信
服务中
一、创建 Binder的实现类
public class MyBinder extends Binder{
}
二、创建Binder对象
private MyBinder mBinder = new MyBinder();
三、返回Binder对象
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
四、接收Binder对象
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;//向下转型后才能使用实现类中的方法
}
五、Binder类方法的写法
public class MyService extends Service {
private MyBinder mBinder = new MyBinder();
private MyService myService = new MyService();
public class MyBinder extends Binder{
//使用MyService中的方法
public void invokeServiceMethod(){
myServiceMethod();
}
//利用MyBinder中的方法
public void invokeMyBinderMethod(){
}
//返回服务对象
public MyService getMyService(){
return myService;
}
}
private void myServiceMethod(){
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
六、Binder 对象的使用
/**
* 获取myBinder和myService对象,使用其中的方法
*/
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
myBinder.invokeServiceMethod();
myBinder.invokeMyBinderMethod();
MyService myService = myBinder.getMyService();
myService.myServiceMethod();
}