1.引入RemoteViews
1.1 android.widget.RemoteViews
android.widget.RemoteViews为一个View结构,实现了Parcelable接口,运行在系统进程SystemServer中,所以第三方应用是以跨进程通信的方式来更新RemoteViews. (简单理解,第三方应用将RemoteViews通过Intent传递给系统进程,系统进程去加载并更新其界面。)
public class RemoteViews implements Parcelable, Filter {
...
}
1.2 应用场景主要有两个
1)Notification - NotificationManager
自定义通知需要用的RemoteViews来加载布局文件
2)Widget - AppWidgetManager
桌面小部件由AppWidgetProvider来实现,其本质为BroadcastReceiver,有4个步骤
a.定义小部件界面
b.定义小部件配置信息
c.定义小部件实现类
d.AndroidManifest中声明
1.3 Intent与PendingIntent区别
Intent是立刻发生的意图;
PendingIntent是将来某个不确定的时刻发生的意图,典型应用是RemoteViews的点击事件,PendingIntent支持3种待定意图。
2.内部机制
2.1 仅支持4种Layout以及若干View
FrameLayout / GridLayout / LinearLayout / RelativeLayout
* <p>{@code RemoteViews} is limited to support for the following layouts:</p>
* <ul>
* <li>{@link android.widget.AdapterViewFlipper}</li>
* <li>{@link android.widget.FrameLayout}</li>
* <li>{@link android.widget.GridLayout}</li>
* <li>{@link android.widget.GridView}</li>
* <li>{@link android.widget.LinearLayout}</li>
* <li>{@link android.widget.ListView}</li>
* <li>{@link android.widget.RelativeLayout}</li>
* <li>{@link android.widget.StackView}</li>
* <li>{@link android.widget.ViewFlipper}</li>
* </ul>
* <p>And the following widgets:</p>
* <ul>
* <li>{@link android.widget.AnalogClock}</li>
* <li>{@link android.widget.Button}</li>
* <li>{@link android.widget.Chronometer}</li>
* <li>{@link android.widget.ImageButton}</li>
* <li>{@link android.widget.ImageView}</li>
* <li>{@link android.widget.ProgressBar}</li>
* <li>{@link android.widget.TextClock}</li>
* <li>{@link android.widget.TextView}</li>
* </ul>
* <p>Descendants of these classes are not supported.</p>
2.2 RemoteViews如何更新界面
RemoteViews通过Binder传递到SystemServer进程,更新界面是将view操作封装为Action传输到远程进程,在远程进程种执行Action对象的方法。