Android基础service简介
2015-03-05 11:19
393 查看
1.service的两种生命周期
![](http://img.blog.csdn.net/20150305112012164?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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类:
2.2远程服务调用(aidl)
2.2.1定义一个接口文件
声明一个方法,把修饰词去掉,将该接口文件的后缀名修改为.aidl
![](http://img.blog.csdn.net/20150305125916279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150305125932601?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.2.2在服务中定义一个内部类
继承Stub,并且把接口文件中的抽象方法实现
![](http://img.blog.csdn.net/20150305131349639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.2.3在service的onBind方法中,将2.2.2中定义的内部类返回
2.2.4在另一个工程的activity中,将服务中的aidl文件,拷贝到自己的工程中。文件目录格式一致
![](http://img.blog.csdn.net/20150305130437006?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.2.5 定义并创建连接桥对象
![](http://img.blog.csdn.net/20150305131520148?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.2.6使用隐式的方式绑定服务,并且将连接桥对象传递过去
![](http://img.blog.csdn.net/20150305131554718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意:使用隐式方式跳转服务,需要在服务所在工程的清单文件中配置intentfilter
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
相关文章推荐
- Android基础 : Android Service[转]
- Android基础 : Android Service
- Android (一) Service基础
- Android Service基础
- Android bound service 详解一:基础
- Android基础 : Android Service[转]
- 如何快速学会android的四大基础----Service篇
- android--service和broadcastReceiver基础
- Android基础(十) Service 服务
- Android基础 : Android Service[转]
- Android开发学习笔记(2):Service的简介和启动方式
- Android开发学习笔记:Service的简介和启动方式
- Android零基础开发专题五:Activity、BroadcastReceiver、Service、Content Provider
- Android基础之Service
- Android基础 : Android Service
- Android开发学习笔记-9 Service基础
- android service简介 .
- Android基础之Service
- Android组件通讯之Service的基础绑定