Android Launcher构建之AppWidget初步
来源:互联网 发布:数据分析挖掘与r语言 编辑:程序博客网 时间:2024/04/29 13:39
1 Android widget
Android widget 也称为桌面插件,其是android系统应用开发层面的一部分,但是又有特殊用途,而且会成为整个android系统的亮点。Android中的AppWidget与google widget和中移动的widget并不是一个概念,这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。
2 AppWidget Framework
2.1 定义
Android系统增加了AppWidget 框架,用以支持widget类型应用的开发。AppWidget 框架主要由两个部件来组成:
(1)AppWidgetService是框架的的核心类,是系统 service之一,它负责widgets的管理工作。加载,删除,定时事件等都需要AppWidgetService的处理。开机自启动的。
AppWidgetService存在的目的主要是解开AppWidgetProvider和AppWidgetHost之间的耦合。如果 AppWidgetProvider和AppWidgetHost的关系固定死了,AppWidget就无法在任意进程里显示了。而有了 AppWidgetService,AppWidgetProvider根本不需要知道自己的AppWidget在哪里显示了。
(2)AppWidgetManager 负责widget视图的实际更新以及相关管理。
2.2 AppWidget Framework的大致流程
1. 编写一个widget(先不考虑后台服务以及用户管理界面等)
实际是写一个事件监听类即一个BroadcastReceiver子类,当然框架已经提供了一个辅助类AppWidgetProvider,实现的类只要实现其方法即可,其中必须实现的方法是onUpdate ,其实就是一个定时事件,widget监听此事件
另外就是规划好视图(layout),将此widget打包安装。
2. 当android系统启动时,AppWidgetService 就将负责检查所有的安装包,将检查
AndroidManifest.xml(不要告诉我不知道,如果不知道可要看看基本开发知识了)
文件中有<metadata android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
信息的程序包记录下来
实际是写一个事件监听类即一个BroadcastReceiver子类,当然框架已经提供了一个辅助类AppWidgetProvider,实现的类只要实现其方法即可,其中必须实现的方法是onUpdate ,其实就是一个定时事件,widget监听此事件
另外就是规划好视图(layout),将此widget打包安装。
2. 当android系统启动时,AppWidgetService 就将负责检查所有的安装包,将检查
AndroidManifest.xml(不要告诉我不知道,如果不知道可要看看基本开发知识了)
文件中有<metadata android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
信息的程序包记录下来
3. 从用户菜单将已经安装的widget添加到桌面,也就是将widget在桌面上显示出来,这个应该是由AppWidgetService和AppWidgetManager完成的,其中AppWidgetManager 将负责将视图发送到桌面显示出来,并将此widget记录到系统文件中
4. AppWidgetService将根据widget配置中的updatePeriodMillis属性来定时发送ACTION_APPWIDGET_UPDATE事件,此事件将激活widget的事件监听方法onUpdate,此方法将通过AppWidgetManager完成widget内容的更新和其他操作。
4. AppWidgetService将根据widget配置中的updatePeriodMillis属性来定时发送ACTION_APPWIDGET_UPDATE事件,此事件将激活widget的事件监听方法onUpdate,此方法将通过AppWidgetManager完成widget内容的更新和其他操作。
3 AppWidgetHost
AppWidgetHost 是实际控制widget的地方,大家注意,widget不是一个单独的用户界面程序,他必须寄生在某个程序(activity)中,这样如果程序要支持widget寄生就要实现AppWidgetHost,桌面程序(Launcher)就实现了这个接口。
它的主要功能有两个:
o 监听来自AppWidgetService的事件。
o 另外一个功能就是创建AppWidgetHostView。
前面我们说过RemoteViews不是真正的View,只是View的描述,而 AppWidgetHostView才是真正的View。这里先创建AppWidgetHostView,然后通过AppWidgetService查询 appWidgetId对应的RemoteViews,最后把RemoteViews传递给AppWidgetHostView去updateAppWidget。
Host的实现者
AppWidgetHost和AppWidgetHostView是在框架中定义的两个基类。应用程序可以利用这两个类来实现自己的Host。Launcher是缺省的桌面,它是一个Host的实现者。
LauncherAppWidgetHostView扩展了AppWidgetHostView,实现了对长按事件的处理。
LauncherAppWidgetHost扩展了AppWidgetHost,这里只是重载了onCreateView,创建LauncherAppWidgetHostView的实例。
4 AppWidgetHostView
AppWidgetHostView是真正的View,但它只是一个容器,用来容纳实际的AppWidget的View。这个AppWidget的View是根据RemoteViews的描述来创建。
5 AppWidgetProvider
AppWidgetProvider是AppWidget提供者需要实现的接口,它实际上是一个BroadcastReceiver。只不过子类要实现的不再是onReceive,而是转换成了几个新的函数:
1 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
2 public void onDeleted(Context context, int[] appWidgetIds)
3 public void onEnabled(Context context)
4 public void onDisabled(Context context)
2 public void onDeleted(Context context, int[] appWidgetIds)
3 public void onEnabled(Context context)
4 public void onDisabled(Context context)
这几个函数用来响应AppWidgetService发出的相应的广播消息。
AppWidgetProvider的实现者
作为AppWidgetProvider的实现者,一定要实现onUpdate函数,因为这个函数决定widget的显示方式,如果没有这个函数widget根本没办法出现。
1 void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
onUpdate的实现基本上遵循下面的流程:
o 创建RemoteViews
o 调用AppWidgetManager的updateAppWidget去更新widget.
o 调用AppWidgetManager的updateAppWidget去更新widget.
6 RemoteViews
RemoteViews并不是一个真正的View,它没有实现View的接口,而只是一个用于描述View的实体。比如:创建View需要的资源ID和各个控件的事件响应方法。RemoteViews会通过进程间通信机制传递给AppWidgetHost。
现在我们可以看出,Android中的AppWidget与google widget和中移动的widget并不是一个概念,这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。View在另 外一个进程里显示,但事件的处理方法还是在原来的进程里。这有点像 X Window中的嵌入式窗口。
- Android Launcher构建之AppWidget初步
- Android Launcher构建之拖拽初步
- Android Launcher构建之系统框架模型
- Android -- Launcher 和 AppWidget, shortcut, LiveFloder,
- Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
- Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
- Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
- Android之旅---AppWidget
- Android之初学Appwidget
- Android之旅---AppWidget
- Android之旅---AppWidget
- Android之旅---AppWidget
- Android之旅---AppWidget
- Android Launcher构建之模型(LauncherModel.java)实现
- Android Launcher开发(二)AppWidget(桌面小部件)解析
- Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色
- android launcher桌面数字时钟及appwidget更新问题
- Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色
- hdu1873 看病要排队
- 最小移动数
- 数字的字符串处理
- UVA 11039 模拟
- Mysql 双向复制
- Android Launcher构建之AppWidget初步
- php openssl rsa 加密解密应用
- c++ urlencode简单实现
- 什么是文件头
- poj 1872 A Dicey Problem (bfs+WordFinal题)
- iOS - nonatomic & atomic
- 几道容易出错的JavaScript题目(转)
- 单链表的遍历与长度计算(单链表)
- Linux shell实现阳历转农历