一、RemoteViews的应用
1、在通知栏上的应用
1)通过构造方法RemoteViews(当前包名,布局文件ID),新建一个RemoteViews对象。2)通过一系列set方法,更新布局。
3)通过notification.contentView = remoteViews,完成通知栏布局的设定。
2、在桌面小部件上的应用
1)定义Widget的布局:在res/layout文件下定义2)定义Widget的配置信息:在res/xml文件下定义,而且根元素为appwidget-provider
3)定义Widget的实现类:这个类需要继承AppWidgetProvider,
4)在Manifest.xml文件中声明Widget,根元素为receiver,其中:
meta-data要设置属性 android:name="android.appwidget.provider" android:resource="@xml/widget_provider_info">,
intent-filter要设置属性 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
AppWidgetProvider中的主要方法:
- 1)onEnable:当窗口小部件第一次添加到桌面时会调用。
- 2)onUpdate:小部件被添加时或者每次小部件更新时会调用。
- 3)onDeleted:每删除一次桌面小部件jiuhuidiaoy。
- 4)onDisabled:当最后一个桌面小部件被删除时会调用。
- 5)onReceive:广播的内置方法。
3、PendingIntent介绍
1)概念
PendingIntent是在将来某个不确定时刻发生,一般用来给RemoteViews添加点击事件,而Intent是立刻发生。2)支持的Intent:
- -getActivity(Context context,int requestCode,Intent intent,int flags):跳转到Activity
- -getService(Context context,int requestCode,Intent intent,int flags):跳转到Service
- -getBroadcast(Context context,int requestCode,Intent intent,int flags):跳转到Broadcast
3)flags参数:
- -FLAG_ONE_SHOT:PendingIntent只能被使用一次,然后就被自动取消
- -FLAG_NO_CREATE:PendingIntent不会主动创建,如果当前PendingIntent不存在,获取PendingIntent失败
- -FLAG_CANCEL_CURRENT:PendingIntent如果已经存在,那么它会被取消,然后被新来的替代。
- -FLAG_UPDATE_CURRENT:PendingIntent如果已经存在,那么它们会被更新。
4)PendingIntent的匹配规则:
- Intent相同,requestCode相同,两个PendingIntent就是匹配的。
- Intent匹配规则:ComponentNme和intent-filter相同。
注意:
- 1)如果manager.notify(id,notification)的id一直不变,那么不管PendingIntent是否匹配,新通知都会替换前面的通知。
- 2)如果manager.notify(id,notification)的id每次都不同
- -当PendingIntent不匹配时,不论使用哪种标记位,这些通知都不会互相影响。
- -当PendingIntent匹配时,根据标记位产生不同影响。
二、RemoteViews的内部机制
1、RemoteViews支持的View类型
1)Layout:FrameLayout、LinearLayout、RelativeLayout、GridLayout2)View;AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView等
2、内部机制
在本地进程中进行RemoteViews的操作,这些操作被转换成一个个Action对象,然后添加到Action集合中,这个集合附在RemoteViews中,当通过NotificationManager和AppWidgetManager来提交更新任务时,RemoteViews会通过Binder传递到远程进程SystemServer,在远程进程中,RemoteViews的apply方法进行更新操作,内部调用Action的apply方法进行实际的更新。注意:
1)关于点击事件,RemoteViews中只支持发起PendingIntent,不支持onClickListener那种模式。
2)setOnClickPendingIntent用于给普通View设置单击事件,要给ListView和StackView中的item添加点击事件,则必须将setPendingIntentTemplate和setOnClickFillIntent组合使用。