2012-8-17
本文简要描述AppWidget系统框架,并对AppWidget系统里的AppWidgetHost(IAppWidgetHost) / AppWidgetProvider / AppWidgetService(IAppWidgetService) / AppWidgetManager等组件做简要的阐述。
Android中的AppWidget也就是“窗口小部件”,实现了桌面(Launcher)上显示控件的机制,并能响应用户的点击操作。而实际上,提供显示的UI元素和对点击事件的响应是由Remote端的AppWidgetProvider实现;具体显示是Local的AppWidgetHost通过AppWidgetHostView实现。AppWidgetHost、AppWidgetProvider与AppWidgetService和AppWidgetManager按照特有的机制组合在一起,才能完整的实现AppWidget机制。本文简要描述AppWidget系统框架,并对这里的组成元素做简要的阐述。后续的文章会结合关键典型场景,对其中的具体角色着重描述。
一、AppWidget系统框架
下图描述了AppWidget系统框架图。
图一、AppWidget系统框架图
AppWidget实现Remote端提供UI元素;Local端具体显示。AppWidgetHost在AppWidget系统中是Local端;AppWidgetProvider端是Remote端。AppWidgetHost和AppWidgetProvider直接或通过IAppWidgetService或间接的通过AppWidgetManager,与AppWidgetService实现交互。AppWidgetService是所有元素的总管,负责协调其他各个部分。
二、AppWidget中各个角色职能的简要分析
2.1 AppWidgetHost
图二、AppWidgetHost
AppWidgetHost通过IAppWidgetService利用Binder机制实现与系统进程中的AppWidgetService通信;
AppWidgetHost有IAppWidgetHost(通过Callbacks)的实现,并在AppWidgetHost.startListening()中注册到AppWidgetService中,实现当Remote端的数据有更新时,通过IAppWidgetHost.updateAppWidget()通知AppWidgetHost更新本地的显示;或者当Remote端的Provider改变时通知AppWidgetHost。
AppWidgetHost创建本地AppWidgetHostView时,会以AppWidgetId和AppWidgetHostView加入mViews: HashMap<Interger,AppWidgetHostView>
AppWidgetHost的典型应用是Launcher,可在《Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色》中看AppWidgetHost的实现。
2.2 AppWidgetProvider
图三、AppWidgetProvider
AppWidgetProvider是AppWidget的Remote端内容提供方,并能注册响应其所提供内容的某个View被点击时,响应的Intent。
AppWidgetProvider是一个抽象类,实现类需要实现抽象方法onUpdate() / onDeleted()/ onEnabled()和onDisabled()。这是AppWidgetProvider的一个模板模式实现,要求AppWidgetProvider的实现者:
- 在AndroidManefest.xml中声明这个AppWidgetProvider是"android.appwidget.action.APPWIDGET_UPDATE"的Receiver,这样AppWidgetProvider作为一个BroardcastReceiver才能接收到AppWidgetService发出的消息。而AppWidgetService查询系统中已经安装了哪些AppWidgetProvider也是通过查询这个接收者的Intent来的实现。所以如果没有这个Receiver,安装的Provider里就没有这个Provider,亦即,未加入到AppWidget系统中。
- 另外,这个Receiver的meta-data的name指定为“android.appwidget.provider”;resource中用xml定义appwidget-provider内的各种属性。这些属性按包被安装时,检索出来赋给AppWidgetProviderInfo。
通常,对于应用开发来说不太注重AppWidget其他的部分,只是写AppWidgetProvider,但一般也都称AppWidgetProvider为AppWidget开发。
AppWidgetProvider的典型应用是Settings里的电量控制,可在《Android中AppWidget的分析与应用:AppWidgetProvider》中看AppWidgetProvider的实现。
2.3 AppWidgetService
图四、AppWidgetService
AppWidgetService通过IAppWidgetService提供方法给AppWidgetHost、AppWidgetProvider使用。
在mInstalledProviders:AppWidgetService.Provider中保存AppWidgetProvider的信息;在mHost:AppWidgetService.Host中保存AppWidgetHost的信息;并用mAppWidgetIds:AppWidgetService.AppWidgetId保存AppWidgetHost与AppWidgetProvider的绑定关系。
三、AppWidget各个角色的部署
AppWidgetService运行于三个各自不同的进程空间:
- AppWidgetService运行于system_process进程;
- AppWidgetHost运行于自己的进程空间,典型的桌面上的AppWidgetHost运行于Launcher中;
- AppWidgetProvider也是运行于自己的进程空间,典型的如“电量控制”这个AppWidgetProvider运行于Settings中。
AppWidgetHost和AppWidgetProvider要用到AppWidgetService的服务时,用Binder机制通过IAppWidgetService实现。AppWidgetService通过IAppWidgetHost通知AppWidgetHost;AppWidgetService通过发Broadcast通知AppWidgetProvider。
四、相关文章
后面会用一系列的文章,来具体阐述AppWidget中各个部分的细节:
简要描述AppWidget系统框架,并对这里的组成元素做简要的阐述。
描述由Launcher作为AppWidgetHost发起,Settings中AppWidgetPickActivity实现的选取并绑定AppWidgetProvider的过程。
Android中AppWidget的分析与应用:AppWidgetProvider
以SettingsAppWidgetProvider为例,通过对AppWidgetProvider内部实现机制的描述,使读者深刻理解开发AppWidgetProvider所要注意的地方。
Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色
描述Launcher作为AppWidgetHost角色所参与AppWidget实现过程,包括添加/选取AppWidgetPrvoider之后的处理;Launcher的AppWidget的数据模型是数据库存储;初始化过程(第一次加载和正常启动)中对AppWidget的加载过程。
本文结合AppWidget的应用场景,分析Android中RemoteViews的内部具体实现。