RemoteViews
远程视图,可以在其他进程中运行。主要使用场景:
- 通知栏通知
- 桌面小部件
RemoteViews内部机制
- 以通知栏和小部件说明。在本地进程它们分别是由
NotificationManager
和AppWidgetManager
来管理的,而它们最终运行的进程是SystemServer,在这里它们是由NotificationManageServicer
和AppWidgetManagerService
管理和加载起来的。本地进程和SystemServer则是通过Binder进行通信的。 - 而RemoteViews能传递过去是因为它实现了Parcelable接口,从而可以传递过去。
- 当需要更新RemoteViews时,则是在调用一系列的set方法后,通过
NotificationManager
和AppWidgetManager
提交更新任务,最终的更新操作是在SystemServer上完成的。set方法其实是在本地进程中的view操作封装成Action对象,在提交时一起传递过去,在远端进程中去解析这个Action,并绘制view。
- RemoteViews本质上是一个view,只是它运行在了系统的进程上,在view支持上也有自己的限制(具体查百度)。
- RemoteViews不支持普通
findViewById()
方法来查找或更新view,只能通过它自己提供的一系列set方法来操作,set其实是通过反射来做的。 - 更新的时机不是在set时马上操作,而是在调用NotificationManager的notify和AppWidgetManager的updateAppWidget时触发。
SetPendingIntentTemplate、SetOnClickPendingIntent、SetOnClickFillInIntent SetOnClickPendingIntent是普通View的点击事件设置; SetPendingIntentTemplate和SetOnClickFillInIntent是集合View的点击事件。
RemoteViews的意义
它的主要意义在于界面的更新,在跨进程和非跨进程上都有使用意义。由于实现了Parcelable接口,使得它的传输很方便。同时也解决了通过AIDL的方式更新界面效率低下的问题。
它的局限性在于支持的View有线。
RemoteViews相关类或者是桌面小部件相关类
- RemoteViews:界面类
- RemoteViewsService:管理RemoteViews的服务。一般情况下不需要使用,但是当涉及到了集合视图时,就需要使用RemoteViewsService来进行更新、管理。
- RemoteViewsFactory:RemoteViewsService的具体管理是由Factory去做的。它是管理集合视图的实施者。