用在通知栏和桌面小部件。跨进程显示界面。
RemoteViews中真正操作View的方法apply和reapply,前者会加载布局并更新界面,后者则只更新界面。
通知栏:
如果使用自定义Notification的话,需要用到RemoteViews来加载布局文件改变通知样式。
remoteView更新View的方式:
因为远程进程汇总显示无法直接findViewById,所以采用了一系列set方法来完成。
remoteViews.setTextViewText(R.id.msg,"chapter_5");
给里面的控件加单击事件,要使用PendingIntent并通过setOnClickPendingIntent方法来实现。
桌面小部件:
用于实现桌面小部件的类AppWidgetProvider,继承自BroadcastReceiver。
配置步骤:定义小部件的界面res/layout/widget.xml;
res/xml新建xml定义配置信息,initialLayout就是小工具使用的初始化布局;
定义小部件的实现类,需继承AppWidgetProvider,并复写重要方法;
在manifest.xml声明小部件,本质上是一个广播组件;
重要回调:onEnable,窗口第一次添加到桌面;
onUpdate,小部件被添加时或更新调用;
onDeleted,每删除一次部件调用;
onDisabled,最后一个该类型的桌面小部件删除时调用;
onReceive,根据不同的Action来调用上述方法;
PendingIntent:
PendingIntent是将来某个时刻要发生的Intent,Intent是立刻发生。
支持:启动Activity、Service、BroadcastReciver;
getAvtivity(Context context,int requestCode,Intent intent,int flags);
getService(Context context,int requestCode,Intent intent,int flags);
getBroadcast(Context context,int requestCode,Intent intent,int flags);
相当于startActivty,startService,sendBroadcast。
PendingIntent的匹配规则:内部Intent相同且requestCode相同;
Intent匹配规则:两个Intent的ComponentName和intent-filter相同;
Flag:
FLAG_NO_CREATE,基本不使用;
FLAG_ONE_SHOT,以第一个为准,后续的会全部和第一条保持一致,任意一条被触发,其他的都cancel;
FLAG_CANCEL_CURRENT,前面的相同的PendingIntent都会被cancel,只有最新的可用;
FLAG_UDPATE_CURRENT,前面的PendingIntent都会被更新(它们Intent中的extras都会被更新)