Android基础系列之Service(二)


上一篇漏讲了一点东西,这里补充一下。如果我们手动调用Service里的方法,除了绑定方式开启服务外还有一个小技巧,就是调用startService这个方法,因为在服务类中,onCreate方法只会在服务第一次开启的时候调用,如果此时我们又不断地去startService,onCreate是不会再被调用的,但onStartCommand却不一样,每次都会被调用,

因此我们可以利用这点,在onStartCommand方法里面调用自己想调用的服务里面的方法就行,而且注意到,这个方法有一个Intent对象参数,这个对象就是开启服务那里传递过来的,也就是说我们可以根据传过来的数据在服务里面执行不同的操作了。


下面说说如何在一个进程中开启另外一个进程的服务,这需要用到一种叫aidl(Android接口定义语言)的东西。使用步骤:

第一步:需要创建待会要开启的服务,方法跟绑定方式开启服务时创建服务的方法一样,不过一些地方需要改改,首先,在清单文件里配置服务时,需要加一个意图过滤器,然后指定一个Action,这样别人就可以通过隐式意图来开启你的服务了,因为一般人是不知道你的包名的(或者说比较麻烦)。android提供了aidl实现在不同进程中使用同一个接口类型,所以需要把我们定义的IService接口文件的后缀又java改为aidl(可以再工程目录里改),改完在Eclipse里刷新一下,后缀名就变为aidl了,不过这是报错了,因为aidl定义的接口是不能用访问权限修饰符修饰的,因此把定义IService接口的public和所有方法前面的public去掉就行了。这是你会发现在gen目录下会自动生成一个内部类Stud,这个类待会会用到,注意它已经继承了Binder实现了IService接口。最后,在服务类里我们不是定义了一个内部类MyBinder吗?现在我们就可以让它直接继续IService.Stub类就行了。这样远程服务类就写好了。

第二步:写客户端,用于以绑定方式开启刚才创建的远程服务。我们需要在新建一个工程,然后使用bindService方法开启服务,当然需要的Intent对象要setAction,以隐式意图开启,第二个参数还是我们创建的内部类对象,不过此时就需要改一点东西了,先思考一下,我们现在这个工程是新建的,并没有刚才在服务类工厂里面的IService接口,也就是无法把onServiceConnected里面的IBinder参数转换为那个接口类型,这时我们要新建一个包(注意包名要和刚才服务类工程里IService所在的包名一致),然后把刚才那个IService.aidl文件复制过来,同样在gen目录下也会自动生成一个内部类Stud,这时我们就可以使用这个接口类型了,不过早进行强制转换的时候有点不同了,我们利用的是Stud类的asInterface方法进行强制转换,具体代码:myBinder = IService.Stub.asInterface(service);,然后我们就可以在不同的地方调myBinder里面的方法了。顺便说一下,在调用的时候可能会产生RemoteException异常,所以需要捕获或者抛出。


Android中还有许多系统服务,如电话服务,短信服务等,这些都可以通过getSystemService()方法得到对应的管理器,然后就可以进行一些操作了。


Android服务生命周期:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值