活动和服务可以说是Android应用程序中最重要的两个组件了(虽然一共就4种),应用程序中的大多数功能还是通过它们来实现的。今天总结一下activity和service的联系和操作
Activity(活动)是应用程序的门面,是用户操作的主体。它是”看得见,摸得着“的,然而并不是所有的任务都适合在活动中完成,原因之一就是活动中的操作都是”即时性“的、可以快速反馈的。没人会喜欢有延时的操作,但有时任务是不能”一蹴而就的“,所以合理的设计就是让用户在界面上下达指令,任务直接在后台完成。服务的作用是来完成一些后台任务,比如下载、播放音乐还有通信。在编写程序时,服务有两种开启方式:startService和bindService。关于这两个方法的基础知识就不赘述了。重点说说如何<u>在活动中调用服务里方法</u>:
要想从activity调用service的方法,不可以直接创建service对象。只能通过bindService绑定服务后调用
使用bindservice的方法:
- 现在service中创建方法
- Service中的onBind方法返回的是Binder对象,这个“纽带”对象可以关联service里的 方法,相当于在service这一端伸出钩子
- 在activity中的onCreate方法里使用bindService(service, conn, flags)方法,对应一下三步
- flags一般等于BIND_AUTO_CREATE--绑定的时候服务不一定存在,没有的话就走Create(但不会走start)
- service其实是一个intent,跳转
- Conn像是activity端的一个钩子,可以监视服务的状态,implements ServiceConnection
内部有两个要复写的方法:onServiceConnected()和onServiceConnected()
7.神操作出现了:在onServiceConnected方法里得到Binder对象(全局),使其成为可以 在activity中使用的对象!
***<u>(这样的操作在实践的过程中出现了一个问题,请务必看一下[https://blog.csdn.net/baidu_41750439/article/details/84900452](https://blog.csdn.net/baidu_41750439/article/details/84900452))</u>***
还有不要忘记在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()转为需要的对象。
暂时就是这样,喵~
欢迎各位大佬补充