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系统框架图
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的内部具体实现。
- Android AppWidget系统框架
- Android AppWidget系统框架
- Android AppWidget系统框架
- Android AppWidget系统框架
- Android AppWidget系统框架
- Android AppWidget系统框架
- Android AppWidget系统框架
- android AppWidget
- android appwidget
- Android AppWidget
- Android-AppWidget
- Android AppWidget
- Android AppWidget框架妄析: Android中的借尸还魂
- Android中的AppWidget(上)
- Android中的AppWidget(上)
- Android:AppWidget放到桌面上
- 什么是android appwidget?
- android ---appWidget--broadcast
- android操作Bitmap的一个小问题
- Android 官方推荐 : DialogFragment 创建对话框
- 深入Java核心 Java内存分配原理
- rhel7.0破root密码
- libjson C++库以及boost
- Android AppWidget系统框架
- 停课的沉淀反思(二)——习惯
- Could not initialize class com.android.xml.AndroidXPathFactory解决办法
- 两个排序数组第k大的数
- 图像处理与计算机视觉:基础,经典以及最近发展
- 15北京网络赛 E题
- C++派生类构造函数调用顺序
- java关键字——this
- JAVA取整以及四舍五入