<<艺术探索读书笔记>>
第五章,理解RemoteViews
RemoteViews的应用
RemoteViews的内部机制
RemoteViews的意义
应用
RemoteViews
字面意思是一个远程View
,可以在其他进程中显示.使用场景是 通知栏和桌面小部件
.
- 通过
应用的包名和布局文件的资源id
即可创建RemoteViews
对象, - 通知栏通过
NotificationManager.notify
实现,小部件通过APPWidgetProvider
(广播)实现. RemoteViews
运行在系统的SystemServer
进程,需要通过RemoteViews
提供的一系列方法来更新View.PendingIntent
表示一种待触发意图.- 桌面小部件需要在清单文件中配置
APPWIDGET_UPDATE
. onReceive
会根据Action
来分发广播/PendingIntent
是一种待定意图,包含三种类型:Activity,Service,BroadCast
相关参考:PendingIntent
内部机制
RemoteViews
只支持一些常见的View
,不支持自定义View
,否则会抛出异常.RemoteViews
提供的一系列set方法都是通过反射
来调用的- 通知栏和桌面小部件的布局文件是通过
NotificationManagerService
和APPWidgetService
中被加载的,通过Binder
进行通信. - 系统会将对
View的操作
封装到Action(实现了Parcelable接口)
中,每调用一次set就会添加一个对应的Action
, - 通过
notify
或者updateAppWidget
才更新界面,调用RemoteViews
的apply
或reApply
方法来更新View apply
: 加载布局并更新界面,reApply
之更新界面.(方法内部反射调用更新方法)- 除了
ReflectiinAction
外,还有其他Action
,如TextViewSizeAction
setOnClickPendingIntent
只能给普通View设置click事件,对ListView
和StackView
中的item设置click事件则必须将setPendingIntentTemplate
和setOnClickFillInIntent
组合使用.
RemoteViews意义
- 实际场景: 一个应用更新另一个应用中的某个界面
- 通过
资源id
可能是无效的,只能约定好资源名称
, Android之通过资源名称获取资源Id