田海立@CSDN

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

 

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


 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的内部具体实现。

 

更多相关文章

  1. Android(安卓)TextView背景色、圆角、内部填充设置
  2. android tab上显示数字(转)
  3. Android新增一个音频类型及双音频输出的实现
  4. 利用一个singleInstance的activity实现音乐播放器锁屏
  5. android EditText设置不可写
  6. Android(安卓)自动化测试框架Instrumentation
  7. Android手机震动抖动效果的实现
  8. Android(安卓)Tethering can't been open(QCOM平台)
  9. Android(安卓)文件存储的简单实现

随机推荐

  1. android studio 导入jar包和删除jar包解
  2. Android服务器——使用TomCat实现软件的
  3. [Android分享] Android 得到已安装的应用
  4. Android的数据存储方式(三)
  5. Android Studio模块化编程实践之aar
  6. Android文档 webview翻译
  7. android API Guides---Device Compatibil
  8. Android 最快速获取通讯录所有手机号、对
  9. 眼镜向手表低头:谷歌遭遇同门之争
  10. android webview软键盘监听删除键、回车