1.service的两种生命周期
1.1startservice
特点: 把服务启动起来后, 就不管服务的事了,即activity和服务没有关系
startService, 生命周期执行的过程:onCreate -> onStart/onStartCommand 服务正在运行中
stopService, 生命周期执行的过程:onDestory 服务销毁了
若Service已经运行,则再次开启时仅重新调用onStart/onStartCommand
使用startService方式开启的服务, 只能用stopService关闭服务
1.2 bindservice
特点: 当绑定服务的activity被销毁时,服务也随之销毁
bindService, 生命周期执行的过程:onCreate -> onBind
unbindService, 生命周期执行的过程:onUnbind -> onDestory
onRebind 方法:只有在onUnbind方法返回true的情况下, 才会被调用
2.service中方法的调用
开发者拿不到service的实例对象,所以无法通过service对象调用服务里面的方法。需要通过其他方法调用。
2.1本地服务调用(以播放器为例)
2.1.1定义一个服务,继承service,重写oncreate方法,在oncreate方法中,创建MediaPlayer对象
2.1.2在自定义的服务类中,添加播放、暂停、重播等方法
2.1.3在服务中,定义一个内部类MediaController,在该类中提供两个方法,通过这两个方法间接调用服务中的方法。该类相当于中间人。
2.1.4在服务的onBind方法中,返回MediaController对象。
2.1.5在activity中,创建一个用来连接服务的对象,Myconnection,该连接对象,用来接收中间人,即MediaController
2.1.6在bindservice的方法调用的时候,将Myconnection对象到服务中去。服务绑定时,会回调Myconnection对象中的onServiceConnect方法,返回中间人MediaController对象。之后通过MediaController对象,可以间接调用服务中的方法了。
service类:
public class MediaPlayerService extends Service {
private MediaPlayer mediaPlayer;
@Override
public void onCreate() {
mediaPlayer = new MediaPlayer();
}
@Override
public IBinder onBind(Intent intent) {
return new MediaController();
}
public void play() {
mediaPlayer.start();
}
public void pause() {
mediaPlayer.pause();
}
public class MediaController extends Binder {
public void forwardPlay() {
play();
}
public void forwardPause() {
pause();
}
}
}
activity类:
class MyConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MediaPlayerService.MediaController mediaController = (MediaPlayerService.MediaController) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
public void bind() {
Intent intent = new Intent(this, MediaPlayerService.class);
bindService(intent, new MyConnection(), Context.BIND_AUTO_CREATE);
}
2.2远程服务调用(aidl)
2.2.1定义一个接口文件
声明一个方法,把修饰词去掉,将该接口文件的后缀名修改为.aidl
2.2.2在服务中定义一个内部类
继承Stub,并且把接口文件中的抽象方法实现
2.2.3在service的onBind方法中,将2.2.2中定义的内部类返回
2.2.4在另一个工程的activity中,将服务中的aidl文件,拷贝到自己的工程中。文件目录格式一致
2.2.5 定义并创建连接桥对象
2.2.6使用隐式的方式绑定服务,并且将连接桥对象传递过去
注意:使用隐式方式跳转服务,需要在服务所在工程的清单文件中配置intentfilter