`
runfeel
  • 浏览: 936297 次
文章分类
社区版块
存档分类
最新评论

Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色

 
阅读更多

田海立@CSDN

2012-8-21

Launcher在Android的AppWidget整个体系中扮演AppWidgetHost的角色,本文分析Launcher对于AppWidget的处理,主要包括:选取AppWidgetProvider之后的处理;Launcher初始化过程中加载(包括第一次加载和之后正常的加载)AppWidget信息的处理,等。

由《Android中选取并绑定AppWidget》中知道,Launcher发起选取操作;Settings中的AppWidgetPickActivity获取所有已经安装的AppWidgetProvider,让用户选择,用户选择之后,回到启动它的Activity的onActivityResult()。

一、Launcher获取AppWidget之后的处理

先看Launcher中定义的用来处理AppWidget的相关的类:

Launcher AppWidgetHost Class Diagram

图一、Launcher中AppWidget的相关类

  • Launcher是一个Activity;
  • 继承AppWidgetHost的LauncherAppWidgetHost用来操作AppWidgetHost功能,overrideonCreateView()用于创建自己的AppWidgetHostView– LauncherAppWidgetHostView;
  • LauncherAppWidgetHostView用来改变点击操作行为习惯;
  • Launcher把UserFolder/ LiveFolder / AppWidget等做成一定的数据模型,用ItemInfo来抽象,对应AppWidget用LauncherAppWidgetInfo来表达。

图二的时序图描述了,从AppWidgetPickActivity返回之后,Launcher如何处理AppWidget的。

Launcher AddAppWidget Sequence Diagram

图二、Picked之后Launcher对AppWidget的处理

执行过程:

1.onActivityResult()中,从requestCode以及resultCode里知道,选取AppWidget成功,可以从返回的data:Intent中获得appWidgetId;[Seq#1]

2.通过AppWidgetId获得info: AppWidgetProviderInfo;[Seq#5~ #6]

3.创建LauncherAppWidgetInfo的实例,并加入到数据模型LauncherModel中;[Seq#7]

4.通过LauncherAppWidgetHost.createView()创建AppHostView;[Seq#8~ #15]

  • 由于override里onCreateView(),onCreateView()被执行。在onCreateView()中创建LauncherAppWidgetHostView;[Seq#8~ #10]
  • AppWidgetHost.createView()中,把AppWidgetProviderInfo设置到appWidgetHostView里;[Seq#11]
  • AppWidgetHost.createView()中,通过AppWidgetService获得AppWidgetProvider提供的RemoteViews【AppWidgetHost、AppWidgetProvider、AppWidgetService运行在不同的进程中,此时不能保证RemoteViews有内容,亦即不能保证AppWidgetProvider.onUpdate()已经被执行】;[Seq#12~ #13]
  • AppWidgetHost.createView()中,用RemoteViews更新appWidgetHostView;[Seq#14]
  • 返回已创建AppWidgetHostView的实例;[Seq#15]

5.向AppWidgetHostView里设置TAG – LauncherAppWidgetInfo的实例。[Seq#17]

最后,LauncherAppWidgetHostView被加入到当前屏,让相应的显示部分来完成显示。因为此时RemoteViews里可能还没有内容,这里只是用一定的占空在Workspace中先占一定的空间。

当AppWidgetProvider获得更新的广播,并执行onUpdate(),onUpdate()中创建了RemoteViews并通过AppWidgetManager.updateAppWidget()更新到AppWidgetService之后,AppWidgetService会通过注册的IAppWidgetHost的回调,执行AppWidgetHost的更新。

Launcher updateAppWidget Sequence Diagram

图三、AppWidgetHost被更新

Android中RemoteViews的实现》中的Section#3讲述了RemoteViews后续的处理。

Launcher在初始化过程中,还会根据配置在第一次创建Database时把AppWidget加载进来;不是第一次创建时,把数据库中的AppWidget的内容Load到数据模型中。


二、Launcher第一次创建Database时,处理AppWidget

Launcher的数据库操作的相关的类

Launcher LauncherProvider Class Diagram

图四、Launcher的数据库操作LauncherProvider

  • Launcher在LauncherProvider中操作数据库;AppWidget相关项是在TABLE_FAVORITIES表单中;LauncherProvider.AUTHORITY定义操作数据库的入口,组合了LauncherSettings.Favorites.CONTENT_URI这个Uri来具体操作。
  • 用SQLite具体存储,所有用SQLiteOpenHelper的子类LauncherProvider.DatabaseHelper来具体操作SQLite数据库。
  • 数据库TABLE_FAVORITIES中的具体FiledLauncherSettings.Favorites中定义。

Launcher第一次创建数据库时,LauncherProvider.DatabaseHelper.onCreate()会被执行,对AppWidget的处理如下:

Launcher LauncherProvider loadAppWidget Sequence Diagram

图五、Launcher第一次创建数据库时,对AppWidget的处理

执行过程:

1.移除掉Launcher作为AppWidgetHost相关的内容;[Seq#4]

2.解析default_workspace.xml中的内容,如果是appwidget相关的:

a)申请AppWidgetId;[Seq#8 ~ #9]

b)把解析出的内容插入TABLE_FAVORITES表单;[Seq#10]

c)把AppWidgetId与AppWidgetProvider绑定;[Seq#11]

其实这个过程就浓缩了用户选择AppWidgetProvider,然后再绑定等等一系列的过程。只是这里的要用哪个AppWidgetProvider,放在哪一屏的哪个位置都在配置里确定了,所以可以直接自动完成。

比如,下面是res/xml/default_workspace.xml中,关于“电量控制”这个AppWidget的配置:

<appwidget
       launcher:packageName="com.android.settings"
       launcher:className="com.android.settings.widget.SettingsAppWidgetProvider"
       launcher:screen="3"
       launcher:x="0"
       launcher:y="0"
       launcher:spanX="4"
       launcher:spanY="1" />

而要解析default_workspace.xml中AppWidget的哪些属性是由res/values/attrs.xml中的Favorite指定的:

   <!-- XML attributes used by default_workspace.xml -->
   <declare-styleable name="Favorite">
       <attr name="className" format="string" />
       <attr name="packageName" format="string" />
       <attr name="screen" format="string" />
       <attr name="x" format="string" />
       <attr name="y" format="string" />
       <attr name="spanX" format="string" />
       <attr name="spanY" format="string" />
       <attr name="icon" format="reference" /> 
       <attr name="title" format="reference" />
       <attr name="uri" format="string" />
   </declare-styleable>

三、Launcher正常启动加载数据库中的AppWidget

3.1 Launcher中的数据模型

Launcher LauncherModel Class Diagram

图六、Launcher中的简要数据模型

  • LauncherModel是一个BroadcastReceiver;用mCallbacks记录Model变化时,要通知的对象;mAppWidgets中记录加入的AppWidget的信息。
  • Launcher实现LauncherModel.Callbacks,注册进LauncherModel,当Model变化时,做相应的处理。

3.2 Launcher数据模型的初始化

Launcher LauncherModel constructor Sequence Diagram

图七、Launcher数据模型的初始化

执行顺序:

1.Launcher被创建时,Launcher.onCreate()被执行;

2.通过getApplication()获得LauncherApplication;LauncherApplication被创建(launcherApplication.onCreate())时:

a)实例化LauncherModel,并把LauncherApplication自身传进去;

b)为LauncherModel注册广播;

3.通过LauncherApplication的setLauncher()把Launcher自身传进去;

LauncherApplication. setLauncher()调用LauncherModel的initialize()把Launcher这个launcherModel.Callbacks的实例传进去;

4.实例化LauncherAppWidgetHost这个AppWidgetHost,并通过startListening(),把IAppWidgetHost注册进AppWidgetSerivce。

3.3 加载并绑定Workspace

在需要加载数据模型的时,LauncherModel的startLoader()会被执行。LauncherModel开启一个LoaderTask线程,具体执行load和bind的工作。

Launcher LauncherModel LoadWorkspace BindWorkspace Sequence Diagram

图八、LauncherModel加载并绑定Workspace

执行加载过程:

1.用LauncherSettings.Favorites.CONTENT_URI查询所有的数据;[Seq#1~ #3]

2.从LauncherSettings.Favorites.ITEM_TYPE字段获取当前记录的类型;[Seq#4~ #7]。

3.对于AppWidget类型(type为LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET),获得AppWidget关注的其他字段,并赋值给LauncherAppWidgetInfo;[Seq#8~ #9]

4.把LauncherAppWidgetInfo的实例加入mAppWidgets;[Seq#10]

执行绑定过程:

通过LauncherModel.Callbacks的实现,也就是Launcher,执行:

  • startBinding();
  • 对所有的mAppWidgets中的Widget,执行bindAppWidget()。

执行LauncherModel.Callbacks.bindAppWidget()在Launcher中执行。

3.4 Launcher绑定AppWidget

Launcher LauncherModel.Callbacks bindAppWidget Sequence Diagram

图九、Launcher bindAppwidget

这个过程同图二的执行,可参考研读。

总结

本文讲述了:

  • Launcher在选择了一个AppWidgetProvider之后,通过AppWidgetHost创建本地的AppWidgetHostView,用来呈现AppWidgetProvider通过RemoteViews提供的的提供内容。相应的LauncherAppWidgetInfo加入到LauncherModel的数据模型中。
  • Launcher(AppWidgetHost) / AppWidgetService /AppWidgetProvider由于运行于不同的进程中,执行的次序不确定使得RemoteViews的内容时效性不定,但是只要RemoteViews有更新,AppWidgetHost就会得到通知而更新。
  • 在系统第一次执行(刚烧机或恢复出厂设置之后)时,数据库第一次被初始化,会从default_workspace.xml中加载初始的AppWidget信息,并加入到LauncherModel的数据模型中。
  • 在正常开机过程(刚烧机或恢复出厂设置之后)中,AppWidget的信息被从数据库中读取出来,并加入到LauncherModel的数据模型中。

可进一步参考的文章

通过这一系列的其他文章,可获得与本文关联的信息:

Android AppWidget框架

AppWidget系统框架。

Android中选取并绑定AppWidget

Launcher发起选取过程,此文中描述选取并绑定的过程,可结合本文看完整的选取/绑定/加入显示系统的完整过程。

Android中AppWidget的分析与应用:AppWidgetProvider

本文所描述的信息,是此文所描述的AppWodgetProvider所提供的。

Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色

本文

Android中RemoteViews的实现

RemoteViews的内部如何实现,看如何具体用RemoteViewsupdate AppWidgetHostView。

分享到:
评论

相关推荐

    android Launcher添加widget源码

    通过分析JYCLauncher的源码,我们可以深入了解Android自定义Launcher中添加Widget的细节,以及如何实现动态添加功能。这不仅可以帮助开发者理解Android系统的内部工作原理,还能为开发具有独特特性的Launcher应用...

    android 桌面控件appwidget

    5. **添加AppWidget到主屏幕**:在应用中提供一个启动器(Launcher)Activity,让用户可以将AppWidget添加到主屏幕。这个Activity通常会启动一个Intent,让用户选择AppWidget的大小和位置。 6. **测试和发布**:...

    Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解.pdf

    在AppWidget中,RemoteViews代表了一个AppWidget视图,可以使用RemoteViews来指定布局和视图的更新。 #### 3. AppWidgetManager类 AppWidgetManager类负责在应用程序中维护所有AppWidget,并为每个AppWidget分配一...

    Android项目源码-安卓Launcher原生桌面源码

    3. **Widget管理**:Android小部件在Launcher上是如何添加、更新和删除的。这涉及到AppWidgetHost和AppWidgetManager的使用,以及BroadcastReceiver来监听小部件的更新请求。 4. **应用抽屉**:源码展示了如何实现...

    android安卓app开发之widget界面控件使用教程.zip

    了解了基本概念后,开发者可以通过阅读《Android 之桌面组件 App Widget 案例》、《Android Launcher开发之桌面小部件AppWidget详解》以及相关的博客文章来深入学习。这些资料提供了丰富的实例和代码解析,帮助理解...

    Android11 Launcher3

    - **安全机制**:Android 11中的Launcher3遵循最新的安全规范,防止恶意应用篡改桌面设置或窃取用户数据。 - **设备兼容性**:尽管Launcher3是Android 11的核心部分,但其设计考虑了向下兼容,可以在较旧版本的...

    Launcher3_android原生launcher_

    Android原生Launcher3是Android操作系统中的主屏幕应用程序,它为用户提供了一个界面来启动应用、管理桌面快捷方式和小部件。在Android 5.1版本中,Launcher3作为默认的启动器,具有简洁、高效的特性。下面我们将...

    Android 12.0 Launcher 客制化指导手册.pdf

    在Android 12.0中,Launcher3作为系统启动器经历了显著的变化,为开发者提供了更多客制化选项,以满足不同用户的需求和喜好。以下是关于Launcher3升级变化以及客制化的详细讲解: ### 1. **Launcher3 升级变化** #...

    android 定制 launcher 4.0源码

    在Android系统中,Launcher是用户与设备交互的入口,它负责展示桌面图标、应用抽屉以及各种快捷方式,使得用户可以启动不同的应用程序。定制Launcher意味着开发者可以根据自己的需求修改默认的界面布局、添加特色...

    android2.3 launcher分析二

    - `launcher:packageName`指定Widget提供者的包名。 #### 配置示例 ```xml launcher:className="com.example.app.MainActivity" launcher:packageName="com.example.app" launcher:screen="1" launcher:x="0...

    android2.3 launcher分析

    ### Android 2.3 Launcher分析 #### 架构概述 Android 2.3 版本中的Launcher采用的是经典的MVC(Model-View-Controller)架构模式。这种模式将应用程序分为三个核心部分:模型(Model)、视图(View)以及控制器...

    安卓Android源码——Android Launcher 源码修改可编译.zip

    1. **Android源码结构**:Android源码分为几个主要部分,如HAL(硬件抽象层)、系统服务、框架层、库和应用层。Launcher属于应用层,但与系统服务和框架层有密切关系。 2. **Launcher的工作原理**:Launcher负责...

    android Launcher2.2源码

    `com.android.launcher2.WallpaperSelector`处理壁纸选择,而`com.android.launcher2.AppWidgetHost`管理着小部件的实例。 7. **权限管理与安全** 由于Launcher涉及用户的应用启动,因此对权限的管理尤为重要。在...

    android手把手教你开发launcher.pdf

    Android Launcher 是 Android 操作系统中的桌面应用程序,负责管理桌面图标、widget 和其他桌面元素。下面我们将一步步指导您如何开发一个自己的 Launcher,並使其替代系统的默认 Launcher。 了解 Android ...

    android手把手教你开发launcher(AndroidStudio版)

    知识点一:Android桌面启动器(Launcher)开发基础 在Android系统中,桌面启动器(Launcher)是用户与Android设备交互的起点,负责展示应用图标、列表和各种小部件。Android允许开发者创建自己的Launcher应用,可以...

    Android 8.0 Launcher3 的源代码

    - 启动速度提升:Android 8.0 对系统进行了性能优化,使得Launcher3加载更快,减少了应用启动时的延迟。 - 背景服务限制:为了提高电池寿命,Oreo 引入了后台限制,这可能影响到一些启动器应用,因此需要在...

    android2.3 launcher分析三

    【Android 2.3 Launcher 分析】 Android 2.3 的 Launcher 是用户界面的核心部分,它作为设备的主要入口,提供用户访问应用程序、小部件和设置的界面。在深入分析之前,我们先了解一下 Launcher 的基本架构。 **...

    Android_Launcher应用开发_示例代码.zip

    - **Launcher的工作原理**:Android系统通过BroadcastReceiver监听到设备启动,然后启动预先设定的Launcher Activity。 2. **自定义Launcher开发** - **布局设计**:开发者需要创建XML布局文件,定义图标、标签、...

    Android5.0 Launcher3源码

    Android 5.0 的 Launcher3 源码分析 Launcher3 是 Android 系统中默认桌面启动器的主要实现,它负责展示应用图标、小部件、快捷方式等元素,并且是用户与系统交互的重要界面。在 Android 5.0 版本中,Launcher3 ...

    Android 8.0 Launcher开发指南

    这涉及到`AppWidgetHost`和`AppWidgetProviderInfo`的使用,以及处理`ACTION_APPWIDGET_PICK`广播,以便用户可以从选择器中选取小部件。 5. **快捷方式和动态图标** `ShortcutInfo`类是创建动态快捷方式的关键,...

Global site tag (gtag.js) - Google Analytics