一、概念
RemoteViews的作用是在其他进程中显示并更新View界面,常用构造方法如下:
public RemoteViews(String packageName, int layoutId)
//第一个参数是当前应用的包名,第二个参数是待加载的布局文件Id
支持的View类型:
Layout:FrameLayout、LinearLayout、RelativeLayout、GridLayout
View:AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub
RemoteViews只支持以上View类型,不支持它们的子类以及其它View类型。
部分set方法:
public void setTextViewText(int viewId, CharSequence text)
public void setTextViewTextSize(int viewId, int units, float size)
public void setTextColor(int viewId, @ColorInt int color)
public void setImageViewResource(int viewId, int srcId)
public void setImageViewBitmap(int viewId, Bitmap bitmap)
public void setInt(int viewId, String methodName, int value)
public void setLong(int viewId, String methodName, long value)
public void setBoolean(int viewId, String methodName, boolean value)
public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
二、工作原理
通知栏和桌面小部件分别由NotificationManager和AppWidgetManager管理,而NotificationManager和AppWidgetManager通过Binder分别和SystemServer进程中的NotificationManagerService以及AppWidgetService进行通信,通知栏和桌面小部件中的布局文件实际上是在NotificationManagerService以及AppWidgetService中被加载的。
由于RemoteViews实现了Parcelable接口,因此它可以跨进程传输,系统会根据RemoteViews中的包名和布局文件Id,通过LayoutInflater加载布局文件,在SystemServer进程中加载后的布局文件是一个普通的View,只不过相对于我们的进程它是一个远程View而已。接着系统会对View执行一系列界面更新任务,这些任务就是之前我们通过set方法来提交的,这些set方法对View所做的更新并不是立刻执行的,在RemoteViews内部会记录所有的更新操作,具体的执行时机要等到RemoteViews被加载以后才能执行,执行时会使用到反射机制,这样RemoteViews就可以在SystemServer进程中显示了,这就是我们所看到的通知栏消息或者桌面小部件。