关于Android中的Service(服务)和activity的几点联系(还有跨进程通信)

活动和服务可以说是Android应用程序中最重要的两个组件了(虽然一共就4种),应用程序中的大多数功能还是通过它们来实现的。今天总结一下activity和service的联系和操作

Activity(活动)是应用程序的门面,是用户操作的主体。它是”看得见,摸得着“的,然而并不是所有的任务都适合在活动中完成,原因之一就是活动中的操作都是”即时性“的、可以快速反馈的。没人会喜欢有延时的操作,但有时任务是不能”一蹴而就的“,所以合理的设计就是让用户在界面上下达指令,任务直接在后台完成。服务的作用是来完成一些后台任务,比如下载、播放音乐还有通信。在编写程序时,服务有两种开启方式:startService和bindService。关于这两个方法的基础知识就不赘述了。重点说说如何在活动中调用服务里方法

要想从activity调用service的方法,不可以直接创建service对象。只能通过bindService绑定服务后调用

使用bindservice的方法:

  1. 现在service中创建方法
  2. Service中的onBind方法返回的是Binder对象,这个“纽带”对象可以关联service里的 方法,相当于在service这一端伸出钩子
  3. 在activity中的onCreate方法里使用bindService(service, conn, flags)方法,对应一下三步
  4. flags一般等于BIND_AUTO_CREATE--绑定的时候服务不一定存在,没有的话就走Create(但不会走start)
  5. service其实是一个intent,跳转
  6. Conn像是activity端的一个钩子,可以监视服务的状态,implements ServiceConnection

内部有两个要复写的方法:onServiceConnected()和onServiceConnected()

     7.神操作出现了:在onServiceConnected方法里得到Binder对象(全局),使其成为可以 在activity中使用的对象!

     (这样的操作在实践的过程中出现了一个问题,请务必看一下java.lang.IllegalArgumentException: connection is null 绑定服务失败 Android_DuTel的博客-CSDN博客

    还有不要忘记在onDestory()里添加unBindService() 防止报leak错误

混合方式开启服务:

StartService 一旦开启,长期运行

BindService 获得binder对象 调用服务方法

UnBindService 解除绑定,但服务仍在运行

(StopService)

这样操作既能在activity中调用服务中的方法,也能在activity关闭后让服务长期运行,继续服务中的其他任务。

如果需要在其他位置(如活动)中调用的服务内部的方法,也可以将这些方法的调用方法提取出来,变成一个接口,来暴露这些方法。在使用时令自己的binder实现这个接口即可。

这样做还可以方便进程间通信。

跨进程通信

为了实现在一个应用程序(进程)中访问另一个程序中服务的binder对象,就需要把集合了需要被暴露的方法的接口转为aidl格式(去掉public),然后刷新工程目录。此时在gen目录下出现了一个java文件,与原来的接口文件同名,但内容不同。

这个文件里存在一个继承了Binder类并实现了上述接口的stub类,接下来的操作都是通过这个类来执行(因为我们自己的binder同样继承了Binder类并实现了上述接口)

因为原有的接口被更改,所以我们自己创建的binder类也改为继承stub类。到这里,在service中的部署就算完成了。

因为要在activity中使用binder对象(所拥有的、暴露的方法),而此时的binder里的方法又来源于stub,即来源于接口改成的aidl文件,所以需要在activity中同样要存在这样的文件。方法:把aidl文件连包(要同名)带文件一起复制到另一个程序中。另一个程序中的gen目录下也就自动生成了对应的.java文件(stub类)

最后一步,把通过stub类里的asInterface()方法,生成Ibinder对象。ServiceConnection类里的onConnected方法里会传递一个Ibinder参数,但是由于我们的传递方式产生了变化,不能直接获得ibinder对象,必须同过asInterface()转为需要的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值