RemoteView

Posted by ooftf on April 12, 2021

RemoteView

RemoteViews 并不是一个真正的 View 而是将一些常用的 View 操作通过跨进程封装,实现了远程控制 View。

RemoteViews 并不是真的将一个进程的 View 传递给另一个进程。而是在“远端”进程创建 View,本地进程通过 RemoteViews 控制“远端” View。

用途

1
2
3
4
5
6
7
8
9
10
11
在其它进程中显示并更新View
主要用在通知栏和桌面小部件的开发过程中 ##  支持的View 1. Layout    * FrameLayout    * LinearLayout    * RelativeLayout    * GridLayout 2. View    * AnalogClock    * Button    * Chronometer    * ImageButton    * ImageView    * ProgressBar    * TextView    * ViewFlipper    * ListView    * GridView    * StackView    * AdapterViewFlipper    * ViewStub --- RemoteViews不支持他们的子类以及其他View类型,也就是说RemoteViews中无法使用除了上述列表中以外的View,也无法使用自定义View 如果我们在RemoteViews中使用EditText那么就会抛出如下异常 ```
    E/StatusBar(765): android.view.InflateException: Binary XML file line #25:
    Error inflating class android.widget.EditText
    E/StatusBar(765): Caused by: android.view.InflateException: Binary XML file
    line #25: Class not allowed to be inflated android.widget.EditText
    E/StatusBar(765):      at android.view.LayoutInflater.failNotAllowed
    (LayoutInflater.java:695)
    E/StatusBar(765):      at android.view.LayoutInflater.createView
    (LayoutInflater.java:628)
    E/StatusBar(765):      ... 21 more ``` ----- 系统并没有通过Binder去直接支持View的跨进程,而是提供了一个Action的概念, Action代表一个View的操作,Action同样实现了Parcelable接口。 系统首先将View操作封装到Action对象并将这些对象跨进程传输到远程, 接着在远程进程中通过反射执行Action对象中的具体操作