概述
在我经历的所有的面试当中几乎都会遇到这样一道面试题:Activity与Service之间是如何交互的。这个问题看上去很简单,实际上它确实也简单(神转折)。主要是因为面试官问的多了,简单归简单,但我觉得挺重要的。特意写一篇文章记录一下。
交互方式
Acticity与Service传递参数方式有很多种,例如:
- 把变量声明为静态的,通过类名获取参数。
- 利用Intent传递
- 利用广播的方式传递。
- 还有通过存储方式(Shareperferrence,File、sqlie等)来传递。
- 重写ServiceConnetion。(重点)
我想面试官问你这个问题的主要目的就是看你会不会第五个方法。前面四个虽说能传递参数,但其实都不可取。只有第五个才是我们项目中经常使用的方法。
现在假设一个场景:在Service中下载文件,下载的进度要回调给Activity。
我们先新建一个接口:
再新建一个Service:
在Activity中:
这里需要注意开启Service只能用binService进行绑定,不能用startService。因为调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法。
这里再顺带说一下利用广播发送消息,其优势稍稍弱于ServiceConnection。
首先要在Activity中注册广播,在定义广播接收器
在Service中,每当下载进度改变时都要发送广播,让Acticty接受,Action要对应Activity中的Action
利用广播适合用于向多个Activity发送相同的消息,单个Activity的话还是用ServiceConnetion更好一些。