笔记(十四)——RemoteViews远程View

——》个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主精华、书籍
1、定义:RemoteViews是一种远程View,和远程Service类似,RemoteViews表示的是一个View结构,它可以在其他进程中显示,RemoteViews提供了一组基础的操作用于跨进程更新它的界面。RemoteViews不是当前进程的View,是属于SystemServer进程。

特性:
RemoteViews只是一个实现了Parcelable和Filter接口的类,而并非继承自View。
RemoteViews用来描述可运行在其他进程中的视图结构,但RemoteViews本身不是视图,只是一个描述类。
RemoteViews描述的远程视图需要通过layout资源文件定义。
RemoteViews类提供了一系列修改远程视图的方法。

应用:一般用于顶部通知栏和桌面小部件的开发。
1.通知栏主要是通过NotificationManager的notify方法来实现的,它除了默认效果外,还可以另外定义布局。
2.桌面小部件则是通过AppWidgetProvider来实现的,AppWidgetProvider本质上是一个广播。
3.通知栏和桌面小部件的开发过程中都会用到RemoteViews,它们在更新界面时无法像在Activity里面那样去直接更新View,这是因为二者的界面都运行在其他进程中,确切来说是系统的SystemServer进程。为了跨进程更新界面,RemoteViews提供了一系列set方法去实现基础操作(如设置内容text,背景图片,点击事件等),并且这些方法只是View全部方法的子集。
4.并非所有View都可以作为远程视图,只有声明了RemoteView注解(@RemoteView)的View才可以。例如系统提供的控件中EditText就不可以。

2、RemoteViews所支持的View类型如下,且它们的子类也是不支持的:详情请点击

LinearLayout、RelativeLayout、FrameLayout、GridLayout、AbsoluteLayout(已弃用)
TextView、Button、ImageView、ImageButton、Chronometer、ProgressBar、ListView、GridView、StackView、ViewFlipper、AdapterViewFlipper、ViewStub、AnalogClock(已弃用)

3、实际上在AppWidgetManager.updateAppWidget()和NotificationManager.notify()内部实现中,它们是通过RemoteViews的apply以及reapply方法来加载或者更新界面的。apply加载布局文件并执行更新操作,用于通知栏和桌面小部件的初始化操作;而reapply只会更新界面,适用于远程视图的更新操作。

4、在RemoteViews提供的基础操作set方法中(如:setTextViewText),每set一个操作就会在RemoteViews内添加一个Action,而RemoteViews的跨进程更新界面就是将View操作通过封装在Action中的。再在远程进程中解析接收到的Action,得到对View的操作从而更新远程进程界面布局。具体操作由基础操作set方法内部的addAction()方法参数ReflectionAction对象运用内部的反射操作,实现对远程View的具体操作指令。——详情参看《Android开发艺术探索》

你可能感兴趣的:(笔记(十四)——RemoteViews远程View)