您的位置:首页 > 移动开发 > Android开发

Android基础service简介

2015-03-05 11:19 393 查看
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.[b]service中方法的调用[/b]
开发者拿不到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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: