RemoteView:远程View

QuibblerQuibbler 2020-04-10 约 5 分钟 2162 次阅读

RemoteView:远程View

RemoteViews,顾名思义,就是远程的View,也就是可以运行在其他进程中的View。RemoteViews常用在Notification和桌面小组件AppWidgetProvider中。

Google官方文档:RemoteViews

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实现原理。

相关推荐

WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175