RemoteViews的原理

  • 时间:
  • 浏览:1

2、获取Inflater布局加载服务

底下代码将setTextViewText转加上俩个ReflectionAction,蕴含了textview_id、setText妙招、value值。当调用appWidgetManager.updateAppWidget的之后 就将remoteViews提交给远程程序运行,之后 远程程序运行会执行RemoteViews的apply妙招,如下所示:

在调用setTextViewText的之后 ,RemoteViews的妙招如下:

3、根据RemoteViews中的layoutId,加载布局

1、获取RemoteViews对象

RemoteViews用法

RemoteViews支持在一点程序运行显示和更新View,将会RemoteViews没有findViewById的妙招,将会它是远程的View,即使有findViewById当我们 也我沒有乎 远程app的资源文件id  统统将会我想要更新View的内容 就要使用RemoteViews提供的一系列set妙招:

RemoteViews妙招

RemoteViews每调用用俩个set妙招时需加上俩个Action到Action列表中,Action也是序列化的,也还可不能能 通过Binder传到远程。当执行Notification的notify妙招后,就会调用RemoteView的apply妙招,该妙招会遍历每个Action,执行Action的 apply函数,apply函数会通过反射的妙招调用RemoteViews的子子view的method,并进行设置,从而完成布局更新。

setTextViewText

程序运行的通信一般基于Binder机制,在使用RemoteViews的之后 将RemoteViews传给远程程序运行,统统RemoteViews是还可不能能 序列化的,系统会根据RemoteViews的包名,去创建Inflater类,并根据layoutId创建出view,有之后 应用apply妙招来更新布局的内容。理论上Binder还可不能能 支持View的所有操作,有之后 太麻烦,时需提供更多的IPC操作,降低IPC的传输数率。统统Android系统在实现界面更新的之后 没有每调用一次set操作就进行一次IPC操作,统统 在调用诸如NotificationManager的notify的之后 ,进行批量更新。累似 ,如下代码创建俩个RemoteViews并设置TextView。

参数root也统统 RemoteViews的layoutId对应的父view,viewId也统统 要查找的子view,这里统统 id为text_1的TextView,Action的apply妙招首先find出TextView,有之后 反射调用他的setText妙招,进行value设置。

执行RemoteViews的performApply,执行Action列表的所有apply操作,进行View更新

RemoteViews的apply妙招分为以下几步:

RemoteViews的apply和reapply的区别,apply多了俩个创建布局的步骤,即创建Inflater后再inflate布局,之后 加上载内容;而replay只会更新布局,不用创建新的布局。

RemoteViews.apply

performApply