RemoteView:远程View
RemoteViews,顾名思义,就是远程的View,也就是可以运行在其他进程中的View。RemoteViews常用在Notification和桌面小组件AppWidgetProvider中。
1、支持的组件
RemoteViews不支持所有的View类型,也不支持自定义View。
ViewGroup:
FrameLayout LinearLayout RelativeLayout GridLayout
View:
AnalogClock button Chronometer ImageButton ImageView ProgressBar
TextView ViewFlipper ListView GridView StackVie AdapterViewFlipper ViewStub
如果在RemoteViews加载的布局中加入了不支持的View会显示异常,但是现在框架已经屏蔽倒不至于出现奔溃。

2、RemoteView方法
访问RemoteViews的view元素,通过一系列set方法完成。详细方法参考Google文档。
| 方法名 | 作用 |
|---|---|
| setTextViewText(int viewId,CharSequence text) | 设置TextView的文本内容 第一个参数是TextView的id 第二个参数是设置的内容。 |
| setTextViewTextSize(int viewId, int units, float size) | 设置TextView的字体大小 第二个参数是字体的单位。 |
| setTextColor(int viewId, int color) | 设置TextView字体颜色。 |
| setImageViewResource(int viewId, int srcId) | 设置ImageView的图片 |
| setInt(int viewId,String methodName, int value) | 反射调用View对象的参数类型为Int的方法 比如上述的setImageViewResource的方法内部就是这个方法实现 因为srcId为int型参数。 |
| setLong setBoolean | 类似于setInt。 |
| setOnClickPendingIntent(int viewId,PendingIntent pendingIntent) | 添加点击事件的方法 |
3、RemoteView点击
对于点击事件 ,RemoteViews中只支持PendingIntent,不支持onClicklistener。
绝大多数情况下都是对单个的View设置点击操作。通过setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)方法设置点击事件对应的PendingIntent。关于PendingIntent这里不再多说,参考PendingIntent初识。
remoteViews.setOnClickPendingIntent(R.id.text, pendingIntent);注意上面的setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)方法不能个ListView、StackView等view集合中的item设置点击事件,因为开销太大系统禁止了(从RemoteViews的实现也可以看出这样的实现不高效)。
如果要给ListView、StackView中的item添加点击事件,必须使用setPendingIntentTemplate()和setOnClickFillInIntent()方法的组合。
4、RemoteView用途
RemoteView只在两个场景用到:Notification和桌面小组件AppWidgetProvider中。具体用法参考另外那两篇博客。
5、RemoteView原理
参考AOSP源码阅读专题:RemoteViews实现原理。

