上一篇是对Dev Guide中关于SDK的翻译,这篇文章的目的就是对AppWidget有一个深入的介绍。
一、首先介绍一下在开机过程中系统对AppWidget做了什么
当SystemServer.java运行到init2()的时候,通过SystemManager.addService(Context.AppWidget_Service,appWidget)将AppWidgetService服务加到服务队列里面,当所有服务加载完毕后会调用appWidgetF.systemReady(safeMode)进入到AppWidgetService.java,在这个方法中做了三件事:
1、遍历所有的安装包,找到符合条件的ACTION:ACTION_APPWIDGET_UPDATE和<meta-data android:name="android.appwidget.provider"/>的receiver,解析相关信息,保存到本地数据成员中。
2、读取本地文件数据:/data/system/appwidgets.xml,所有已安装到桌面的widget的信息都保存在这个文件里。读出来,也保存到本地数据成员里。
3、注册了三个消息:ACTION_BOOT_COMPLETED(系统启动到桌面就会发送此消息),ACTION_PACKAGE_ADDED(有新 APK包安装到系统),ACTION_PACKAGE_REMOVED(有APK包被删除)。当系统启动到桌面后,AppWidgetService接收 到了ACTION_BOOT_COMPLETED消息,它会去检查本地数据成员,如果有已经安装到桌面的widget,它会上发 ACTION_APPWIDGET_ENABLED和ACTION_APPWIDGET_UPDATE消息。如果有widget设置了updatePeriodMillis的属性,它就会开始计时(这个是通过AlarmManager来实现的),到时间时,就会再次发送ACTION_APPWIDGET_UPDATE消息。
二、与AppWidget相关的类有:
RemoteViews.java
* A class that describes a view hierarchy that can be displayed in
* another process. The hierarchy is inflated from a layout resource
* file, and this class provides some basic operations for modifying
* the content of the inflated hierarchy
上面是Google给的关于RemoteViews的解释,大家不要被它的名字给欺骗了,说白了它就是作为一个描述view信息的载体,通过它可以在进程间传递,在另一个进程中由AppWidgetHostView去获取RemoteViews所承载的信息并且显示出来。
AppWidgetProvider.java
这个类继承BroadcastReceiver,并且重写了它里面的方法,里面通常使用的是onUpdate()方法对AppWidget更新
AppWidgetManager.java
* Updates AppWidget state; gets information about installed AppWidget providers and other
* AppWidget related state.
AppWidgetHost.java
* AppWidgetHost provides the interaction with the AppWidget service for apps,
* like the home screen, that want to embed AppWidgets in their UI.
AppWidgetHostView.java
* Provides the glue to show AppWidget views. This class offers automatic animation
* between updates, and will try recycling old views for each incoming
* {@link RemoteViews}.
AppWidgetService.java
具体实现AppWidgetHost和AppWidgetManager中的方法。
对上图的一个解释:
当我们把一个AppWidget放在桌面的时候其实这个AppWidget是停靠在Launcher的一个View上面,被停靠的这个Activity我理解为“宿主”,而AppWidget是运行在一个独立的进程中,所以AppWidget要与这个“宿主”通信的话就需要IPC。
当RemoteViews把AppWidget的View信息传递“宿主”的时候,通过AppWidgetHost获得AppWidgetHostView的实例,这样 按照RemoteViews中的信息将AppWidget的View绘制到“宿主”中来。至此,我们的Widget就显示在“宿主”上了。
下图是对AppWidgetManager和AppWidgetHost做的解释,作为管理类,各自完成不同的管理任务。
在网上看到这么一段关于AppWidget的比喻,贴来大家看看
Android AppWidget框架妄析: Android中的借尸还魂
Android, AppWidget, 借尸还魂
由于初识Android不久,所以一切分析皆可有误,故而只能为之妄析。 题目起的比较恐怖,然非我本意。 只是实在找不到更加贴切的,可以对AppWidget框架一针而见血的比喻了。 闲话少说,且看如何个借尸还魂。
首看魂者何来。 大家都知道Widget的宗旨,就是要在同一屏幕(界面上)运行多个具有独立功能的小插件,从而丰富功能的同时简化操作。那么,在Android的4大组件中,何人可以充当该角色,抑或需要再独立设计一个组件? Activity? 非也!! Activity是UI呈现和用户交互的一个组件,具有独特的Task管理机制,同一时刻,框架只允许一个Activity与用户交互并呈现。 而Widget的特点是,多实例的并发交互性。 所以,Activity不能满足,不能满足同时多个Widget的并发交互和呈现。 既然不能前台,那么只能在后台Running, Service or BroadCastReceiver? 由于Widget需要处理众多的事件交互,所以,BroadCastReceiver更加合适。 既然找到了合适的,那么也就没有必要再创造新的。 够用就可以,不是越多越好,这也是软件设计的准则。 OK, AppWidget的魂已经找到,BroadCastReceive也, 所以,Android中的AppWidget其本质就是一个BroadCastReceive组件。
再看尸者何来。 尸者,阳间之物也。 虽已死(本身无用),却能见光(呈现)也。 任何一个期望在其之上运行Widget的前台的应用(Activity),其实就是一个Widget宿主。 其本身而言,无任何Widget功能,但却可以和用户交互并呈现,从此点而言,可谓尸也。 Android中的AppHost即为尸也。
最后我们看如何还魂。 AppWidget为魂,功能强大,为所欲为,但却始终位于阴间(后台运行),无法见日,故而众人不可观之。 AppHost为尸,虽见天日,却已无所可为。 我们何不将此二者互补那?? 但是,阴阳两隔,必须使用特殊的方式, 此即为还魂术。 通过还魂术,可使得魂寄于尸而见天日。 还魂术就是阴间通往阳间的大道。 Android中的还魂术即为RemoteView。 在Android中,由于进程边界的存在,使得AppWidget与AppHost也阴阳两隔,默认是无法直接沟通的。 采用RemoteView,让AppWidget将一切需要呈现的描述构建到RemoteView中,AppHost中再基于该描述,重新创建于属于自己进程中的View进而显示。
- 大小: 18.6 KB
- 大小: 29.8 KB
分享到:
相关推荐
本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`appWidget`的基本构成。一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许...
在深入探讨Android AppWidget之前,我们首先需要理解AppWidget在Android生态中的角色和价值。AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可...
首先,我们需要理解AppWidget的基础结构。一个AppWidget由两部分组成:AppWidget提供者(AppWidgetProvider)和布局文件。AppWidget提供者是Android的BroadcastReceiver子类,它负责处理AppWidget的生命周期事件,如...
2. **AppWidgetInfo**: 这是Android系统用来存储关于AppWidget的元数据,包括其大小、名称和指向AppWidget提供者类的引用。开发者在XML布局文件中定义AppWidgetInfo。 3. **布局文件**: AppWidget的界面由XML布局...
本文将深入探讨Android AppWidget的第四部分,主要关注如何更新AppWidget中的控件,以及相关的源码和工具。 **一、AppWidget更新机制** 1. **AppWidgetProvider**: 这是所有AppWidget的核心组件,它是一个...
在Android开发中,AppWidget是桌面小部件,它允许开发者将应用程序的功能直接集成到用户的主屏幕上,无需打开应用。在本案例中,我们探讨...通过源码学习,可以深入理解这些组件的协同工作方式,提升Android开发技能。
本教程将深入探讨如何通过实例来验证一个Android AppWidget的创建和使用。 首先,我们来看`AndroidManifest.xml`文件,它是Android应用的核心配置文件,包含应用的基本信息以及所有组件(如Activity、Service、...
这个压缩包“Android -- AppWidget源码.zip”很可能是包含了Android AppWidget的相关源代码,帮助开发者深入理解其工作原理和实现机制。 AppWidget主要由以下几个关键组件组成: 1. **AppWidgetProvider**: 这是...
在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...
本篇将深入探讨如何使用AppWidget来创建桌面组件。 首先,理解AppWidget的基本结构至关重要。一个AppWidget通常包含以下组成部分: 1. **AppWidget提供者(AppWidget Provider)**:这是定义AppWidget行为的组件,...
本文将深入探讨AppWidget的相关知识点,并通过一个实际的AppWidgetProviderDemo4.28来展示其工作原理和实现方法。 首先,我们要了解AppWidget的基本结构。一个AppWidget由以下几个主要部分组成: 1. **...
在本篇博文中,我们将深入探讨如何在AppWidget中启动一个新的Activity,这通常是为了提供更丰富的用户体验或者执行更复杂的任务。 首先,让我们了解AppWidget的基本结构。一个AppWidget由一个或多个`RemoteViews`...
在本文中,我们将深入探讨AppWidget的基本概念、工作原理以及如何创建一个简单的AppWidget。 1. **AppWidget的基本概念** - AppWidget并非独立的应用程序,而是主应用的一部分,通过`AppWidgetProvider`类与宿主...
通过分析这个源码示例,开发者可以深入了解AppWidget的工作原理和实际应用,从而提高自己在Android开发中的技能,尤其是对于那些希望创建具有个性化和实用性的桌面小部件的开发者来说,这将是一个非常有价值的参考...
本教程将深入探讨如何创建和实现一个基本的Android AppWidget。 首先,我们需要了解AppWidget的构成。一个AppWidget通常由以下几个部分组成: 1. **布局文件**:这是定义AppWidget外观的XML文件,类似于Activity的...
通过研究这个源码压缩包,开发者可以深入了解AppWidget的工作原理,学习如何设计和实现具有交互功能的桌面小部件,从而丰富自己的Android应用。同时,理解并掌握这些知识点对于提升Android应用的用户体验和创新性至...
Android AppWidget是Android系统提供的一种桌面小部件功能,允许开发者创建可以放置在用户主屏幕上的小型应用程序。...因此,深入理解和实践"android appwidget 经典完整代码"对于Android开发者来说是非常有价值的。
本文将深入探讨AppWidget的基本概念、工作原理及其创建过程。 ### 1. AppWidget概述 AppWidget是Android系统桌面环境的一部分,它们是可定制的、轻量级的UI元素,可以直接在主屏幕上显示。用户可以自由地添加、...
本文将深入探讨如何在AppWidget中自定义Action广播,以便更好地控制和扩展小部件的行为。 首先,让我们了解什么是BroadcastReceiver。在Android系统中,BroadcastReceiver是一种组件,它监听系统或应用发出的广播...
AppWidget是Android系统提供的一种可以在桌面展示的小部件,它允许用户在主屏幕上放置应用程序的快捷方式或者小型交互式UI,...通过深入研究和扩展这个示例,你可以掌握更多的技巧,打造出更加丰富的AppWidget应用。