RemoteViews

远程视图,可以在其他进程中运行。主要使用场景:

  • 通知栏通知
  • 桌面小部件

RemoteViews内部机制

  • 以通知栏和小部件说明。在本地进程它们分别是由NotificationManagerAppWidgetManager来管理的,而它们最终运行的进程是SystemServer,在这里它们是由NotificationManageServicerAppWidgetManagerService管理和加载起来的。本地进程和SystemServer则是通过Binder进行通信的。
  • 而RemoteViews能传递过去是因为它实现了Parcelable接口,从而可以传递过去。
  • 当需要更新RemoteViews时,则是在调用一系列的set方法后,通过NotificationManagerAppWidgetManager提交更新任务,最终的更新操作是在SystemServer上完成的。set方法其实是在本地进程中的view操作封装成Action对象,在提交时一起传递过去,在远端进程中去解析这个Action,并绘制view。

RemoteViews机制描述

  1. RemoteViews本质上是一个view,只是它运行在了系统的进程上,在view支持上也有自己的限制(具体查百度)。
  2. RemoteViews不支持普通findViewById()方法来查找或更新view,只能通过它自己提供的一系列set方法来操作,set其实是通过反射来做的。
  3. 更新的时机不是在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去做的。它是管理集合视图的实施者。

results matching ""

    No results matching ""