Android AppWidget系统框架

来源:互联网 发布:网络雨晴引导员 编辑:程序博客网 时间:2024/05/08 18:56

本文简要描述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 Hierarchy

图一、AppWidget系统框架图

 

AppWidget实现Remote端提供UI元素;Local端具体显示。AppWidgetHost在AppWidget系统中是Local端;AppWidgetProvider端是Remote端。AppWidgetHost和AppWidgetProvider直接或通过IAppWidgetService或间接的通过AppWidgetManager,与AppWidgetService实现交互。AppWidgetService是所有元素的总管,负责协调其他各个部分。

 

二、AppWidget中各个角色职能的简要分析

 

2.1 AppWidgetHost


 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

 

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中各个部分的细节:


 Android AppWidget框架

    简要描述AppWidget系统框架,并对这里的组成元素做简要的阐述。

Android中选取并绑定AppWidget

    描述由Launcher作为AppWidgetHost发起,Settings中AppWidgetPickActivity实现的选取并绑定AppWidgetProvider的过程。

Android中AppWidget的分析与应用:AppWidgetProvider

    以SettingsAppWidgetProvider为例,通过对AppWidgetProvider内部实现机制的描述,使读者深刻理解开发AppWidgetProvider所要注意的地方。

Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色

    描述Launcher作为AppWidgetHost角色所参与AppWidget实现过程,包括添加/选取AppWidgetPrvoider之后的处理;Launcher的AppWidget的数据模型是数据库存储;初始化过程(第一次加载和正常启动)中对AppWidget的加载过程。

Android中RemoteViews的实现

    本文结合AppWidget的应用场景,分析Android中RemoteViews的内部具体实现。

0 0