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


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. 浅谈Java中Collections.sort对List排序的两种方法
  2. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
  3. python list.sort()根据多个关键字排序的方法实现
  4. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  5. TensorFlow集成Android工程的框架
  6. 他山之石——Android仿新浪微博底栏(FragmentTabHost的使用)
  7. Android(安卓)实现滚动数字的TextView
  8. android 关于listview scrollview 底部 控件无法显示的两个解决
  9. android中使用SQLite进行CRUD操作的实例

随机推荐

  1. Android 4.0中去掉标题栏和状态栏的方法
  2. 第二届 Android(安卓)应用开发中国大学生
  3. Android 使用Picasso加载网络图片等比例
  4. android 设备调试
  5. Android设备获取扫码枪扫描内容
  6. Android 开发流程(Android前端工作)
  7. 理解android中Activity和Task的关系
  8. 关于Android(安卓)开发优化的建议
  9. Android(安卓)NoSql数据库框架-SnappyDB
  10. Android学习之广播事件处理