Android开发艺术探索 第五章
理解RemoteViews
远程界面,其实开发过原生界面应该会接触比较多,就是通知栏和桌面上的小部件,下面简单介绍一下。
5.1 RemoteViews的应用
5.1.1 通知栏上的应用
RemoteViews在通知栏上有默认和自定义两种方式,具体实现不在做笔记,建议使用到的时候网上搜索最新版本的代码,需要留意的是无法直接设置界面的参数,需要通过对应的API去更新控件,包括点击事件也是使用PendingIntent.
5.1.2 桌面小部件上的应用
AppWidgetProvider是提供用于实现桌面小部件的类,本质上就是一个广播,然后刷新界面。
实现步骤:
1.实现布局XML文件
2.定义小部件配置信息
3.定义小部件实现类,继承AppWidgetProvider。
可以稍微留意一下相关的方法,包括更新,销毁这些。具体流程可以参考源码当中的流程
onEnable 首次添加到桌面
onUpdate 小部件更新的时候
onDeleted 每次删除的时候
onDIsabled 最后一个被删除的时候
onReceive 广播内置方法,用于分发事件
5.1.3 PendingIntent概述
主要表示一个等待发生的意图,表示将来可以执行的事件。
支持三种待定意图,启动活动、服务和发送广播。
每个参数建议使用的时候查看最新API解释,这里也不再做笔记,需要留意每个参数的匹配。
5.2 RemoteViews的内部机制
RemoteViews的作用就是在其他进程中显示并更新界面。
首先看一下构造方法,需要两个参数,包名和布局文件,需要留意不能支持所有的View类型,具体可以留意最新API说明。比如输入框就不支持,会导致抛出异常。
留意一下本身提供的大部分设置界面的方法都需要通过调用对象的set相关设置,实际是通过反射实现的。小部件主要有系统实现,管理类会通过Binder分别和系统管理的通知服务和小部件服务进行同学,主要设计思想是轻量级的跨进程更新小部件,具体可以参考源码流程。
RemoteViews的实现流程也很有趣,它会保留所有的设置到集合里面,等匹配到控件在尽显每一条动作,所以它其实没有直接改变界面的方法也是可以理解的。
那么它的更新是通过apply和reapply方法来加载或者更新界面的,看源码实现基本都是通过反射获取到界面控件在进行改变,具体可以参考源码。
5.3 RemoteViews的意义
其实理论上我们通过广播也可以建立这样的两个APP去实现类似的功能,不过系统提供RemoteViews这样的控件就是更加方便我们去使用它,在通知类或者桌面小部件这种轻量级的界面刷新数据,很是方便,包括以前经常做音乐的小部件去控制音乐,其实是非常方便用户的。
这里作者也说明了一下自己实现,包括AIDL的一些优缺点,实际上只有最适合的方式,没有最好的答案,对于不同的场景使用合适的方式就可以了。