Android开发艺术探索读书笔记(第5章 RemoteView)

来源:互联网 发布:ios 耗电量优化 编辑:程序博客网 时间:2024/06/05 10:31

原理

RemoteView的作用是在其他进程中显示并更新view界面。
这里写图片描述

大量的IPC操作会影响效率,为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Action的概念,Action代表一个view的操作。系统首先将view操作封装成Action对象并将这些对象跨进成传输到远程进程。接着在远程进程执行Action的具体操作。在我们的应用中每调用一次set方法,RemoteView中就会添加对应的Action对象,当我们通过NotificationManager和AppWidgetManager提交我们的更新时,这些Action对象就会传输到远程进程并在远程进程执行。

远程进程通过RemoteView的apply方法来进行view的更新操作。RemoteView的apply方法内部则会去遍历所有的Action对象并调用它们的apply方法,具体的View更新操作是由Action对象的apply方法来完成的。这样的好处是不用定义大量的Binder接口,其次通过在远程进程中批量执行RemoteView的修改操作从而避免了大量的IPC操作,这样就提高了程序的性能。

实际应用

两个应用,一个需要更新另外一个的界面,这时候可以使用AIDL,但是如果对界面的更新比较频繁,这时候会有效率问题,同时AIDL接口可能变得比较复杂,这时候采用RemoteView就没有这个问题了。但是RemoteView的缺点是仅支持一些常见的View。不支持自定义View.

RemoteView有两个方法,apply和reapply,两个方法的区别在于apply会加载布局并更新界面,而reapply置灰更新界面。

如果打算用RemoteView来实现两个应用之间的界面更新,那么还有一个问题,就是布局文件的加载问题。一个应用的资源id传递到另一个应用中很可能是无效的,因为两个应用中布局文件的资源id可能不完全一样,解决办法如下:
既然资源id不一样,我们就通过布局文件名称来加载布局文件,首先两个应用要提前约定好RemoteView中资源文件名称,然后在A中根据名称查找对应的布局文件并加载,接着再调用RemoteView的reapply方法即可将B中对View所做的一系列更新操作全部作用于A中加载的View上面。

0 0
原创粉丝点击