10 Service

10.1 Service简介

Service组件也是可执行的程序,它也有自己的生命周期。创建,配置Service与创建,配置Activity的过程基本相似,下面详细介绍Android Service的开发。

>>10.1.1创建,配置Service

就像开发Activity需要两个步骤:1.开发Activity子类;2.在AndroidManifest.xml文件中配置Activity。开发Service也需要两个步骤。

1.定义一个继承Service的子类。

2.在AndroidManifest.xml文件中配置该Service。

Service与Activity还有一点相似之处,他们都是从Context派生出来的,因此他们都可调用Context里定义的getResources(),getContentResolver()等方法。

与Activity相似的是,Service中也定义了一系列生命周期取得方法,如下所示。

>IBinder onBind(Intent intent):该方法时Service子类必须实现的方法,该方法返回一个IBinder对象,应用程序可通过该对象与Service组件通信。

>void onCreate():在该Service第一次被创建后将立即回调该方法

>void onDestory():在该Service被关闭前将会回调该方法。

>void onStartCommand(Intent intent,int flags,int startId):该方法的早期版本时void onStart(Intent intent,int startId),每次客户端调用startService(Intent)方法启动该Service时都会回调该方法。

>boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该方法。

当该Service开发完成后,接下来就可以在程序中运行该Service了。在Android系统中运行Service有如下两种方式。

>通过Context的startService()方法:通过该方法启动Service,访问者与Service之间没有关联,即使访问者推出了,Service也仍然运行。

>通过Context的bindService()方法:使用该方法启动Service,访问者与Service绑定在一起,访问者一旦退出,Service也就终止了。

绑定本地Service并与之通信

当程序通过startService()和stopService启动,关闭Service时,Service与访问者之间基本不存在太多关联,因此Service和访问者之间也无法进行通信,交换数据。

如果Service和访问者直接需要进行方法调用或者交换数据,则应该使用bindService()和unbindService()方法启动,关闭Service。

Context的bindService()方法的完整方法签名为:bindService(Intent Service,ServiceConnection,int flags),该方法的三个参数解释如下。

>service:该参数通过Intent指定要启动的Service。

>conn:该参数时一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时,将回调该ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法;当Service所在的宿主进程由于异常中止或其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。

当调用者主动通过unBindService方法断开与Service的连接时,ServiceConnection对象大的onServiceDisconnection(ComponentName name)方法并不会被调用。

>flags:指定绑定时是否自动创建Service(如果Service还未创建)。该参数可指定为0(不自动创建)或BIND_AUTO_CREATE(自动创建)。

注意到ServiceConnection对象的onServiceConnected()方法中有一个IBinder对象,该对象即可实现与被绑定Service之间的通信。

当开发Service类时,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection里的onServiceConnected(ComponentName name,IBinder service)方法的service参数,这样访问者就可通过该IBinder对象与Service进行通信了。 

*IBinder对象相当于Service组件的内部钩子,该钩子关联到绑定的Service组件,当其他程序组件绑定该Service时,Service将会把IBinder对象返回给其他程序组件,其他程序组件通过该IBinder对象即可与Service组件进行实时通信。

实际开发时通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值