Android之Widget 343人阅读 评论(0) 收藏 举报

目录(?)[+]

  1. Android widget
  2. AppWidgetFramework
  3. AppWidgetHost
  4. AppWidgetHostView
  5. AppWidgetProvider
  6. RemoteViews

http://our2848884.blog.163.com/blog/static/14685483420115345933319/


简介

1 Android widget

Android widget 也称为桌面插件,其是android系统应用开发层面的一部分,但是又有特殊用途,而且会成为整个android系统的亮点。Android中的AppWidget与google widget和中移动的widget并不是一个概念,这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。

2 AppWidgetFramework

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 AppWidgetFramework的大致流程 1. 编写一个widget(先不考虑后台服务以及用户管理界面等)
实际是写一个事件监听类即一个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内容的更新和其他操作。

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的实例。

4AppWidgetHostView

AppWidgetHostView是真正的View,但它只是一个容器,用来容纳实际的AppWidget的View。这个AppWidget的View是根据RemoteViews的描述来创建。

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)

这几个函数用来响应AppWidgetService发出的相应的广播消息。

AppWidgetProvider的实现者

作为AppWidgetProvider的实现者,一定要实现onUpdate函数,因为这个函数决定widget的显示方式,如果没有这个函数widget根本没办法出现。 1 void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) onUpdate的实现基本上遵循下面的流程: o 创建RemoteViews
o 调用AppWidgetManager的updateAppWidget去更新widget.

6 RemoteViews

RemoteViews并不是一个真正的View,它没有实现View的接口,而只是一个用于描述View的实体。比如:创建View需要的资源ID和各个控件的事件响应方法。RemoteViews会通过进程间通信机制传递给AppWidgetHost。 现在我们可以看出,Android中的AppWidget与google widget和中移动的widget并不是一个概念, 这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。View在另 外一个进程里显示,但事件的处理方法还是在原来的进程里。这有点像 X Window中的嵌入式窗口

更多相关文章

  1. android获取屏幕长宽的方法
  2. android 进程自杀再重启的方法
  3. Android监听HOME键的最简单的方法
  4. android EditText 不自动弹出键盘的方法
  5. [Android Pro] Android的5个进程等级
  6. Android Studio ADB响应失败解决方法
  7. android framework 输入事件分析
  8. android hover监控鼠标移动事件

随机推荐

  1. android引用外部工程或jar包
  2. Android(安卓)原生项目集成 Flutter
  3. Android样式和主题(style&theme)
  4. 获取 + 查看 Android(安卓)源码的 方法
  5. Android(安卓)5.0 默认水波纹背景属性,可
  6. android颜色代码
  7. 【Android】:跳转系统界面汇总
  8. Android(安卓)控件GridView使用案例讲解
  9. 【Android】自定义权限
  10. Android(安卓)SDK Emulator: Compile Cya