`
liuyun025
  • 浏览: 123725 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android 中AppWidget在系统启动时的加载流程

阅读更多

    今天进行一个Android AppWidget的开发,参考 android SDK 文档中关于App Widgets 开发的部分,可以很容易的完

 

成整个过程的搭建,文档中的 ExampleAppWidgetProvider.java 和 ExampleAppWidgetConfigure.java 中都拿到了一

 

个很重要的参数,分别是:appWidgetId 和 mAppWidgetId ,可是,对于这个参数是怎么来的,文档中却没有介绍。

 

     这个问题涉及到 android 和 android AppWidget 的启动过程,下面是我使用 Powerpoint 画的一个 android

 

AppWidget的加载流程:

Android AppWidget 的加载流程图

 

 

    从这个图中可以很容易的看到这个参数的来源和走向,我在这里做一个简略的解释:

 

    1. Android系统启动,SystemServer创建AppWidgetService,并调用systemReady()方法,在该方法中:

 

      (1)通过 PackageManager 从 AndroidManifest.xml 中查找所有的 AppWidget ,即:找到包含

 

              android.appwidget.action.APPWIDGET_UPDATE 和 meta-data 的标签信息,如:

 

<receiver android:name="MyWidgetProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
            </intent-filter>
            <meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</receiver>

 

  解析其中的AppWidget的配置信息,即:android:resource="@xml/widget_property",将其封装成对象 

 

  保存到本地数据成员中。

 

    (2)从/data/system/appwidgets.xml文件读取已经被添加到Launcher的AppWidget信息,封闭成对象,所有已

 

            安装到桌面的widget的信息都保存在这个文件里。读出来,保存到本地数据成员里。

 

    (3)注册了四个消息:ACTION_BOOT_COMPLETED(系统启动到桌面就会发送此消息),

 

           ACTION_PACKAGE_ADDED(有新APK包安装到系统),ACTION_PACKAGE_REMOVED(有APK包被删除)

 

           和 sdcard的安装与缷载。当系统启动到桌面后,AppWidgetService接收到了ACTION_BOOT_COMPLETED消

 

           息,它会去检查本地数据成员,如果有已经安装到桌面的widget,它会上发ACTION_APPWIDGET_ENABLED和

 

           ACTION_APPWIDGET_UPDATE消息。如果有widget设置了updatePeriodMillis的属性,它就会开始计时(这个是

 

           通过AlarmManager来实现的),到时间时,就会再次上发ACTION_APPWIDGET_UPDATE消息。
   

   2. Android 系统启动 Launcher 应用程序,从 Launcher 中查找 AppWidget 信息,取得 appWidgetId ,根据这个

 

      appWidgetId 值,创建 LauncherAppWidgetHostView 布局对象,同时也是根据这个 appWidgetId 值从

 

      AppWidgetService中获取RemoteViews对象 。

 

   3. Android系统启动完成后,会发出 BOOT_COMPLETED 广播,AppWidgetService 会接收到这个广播,然后

 

       AppWidgetService 会做如下处理:

 

      (1)获取已经添加到 Launcher 的 AppWidget 列表,在这里也得到了参数 appWidgetId ,依次向其中的 Widget

 

             发出 APPWIDGET_ENABLED 和 APPWIDGET_UPDATE 更新广播。

 

      (2)每个 AppWidget 都会接收到广播,同时也会得到参数 appWidgetId , 然后每个 AppWidget 都会调用其

 

             onEnabled()方法和onUpdate()方法。

 

      (3)AppWidgetService 接收到了 appWidgetId 和 RemoteViews 后,将 RemoteViews 中的布局更新到

 

             LauncherAppWidgetHostView 布局对象中。

   

 

 

 

 

 

  • 大小: 17.4 KB
分享到:
评论

相关推荐

    基于Android平台的App Widget设计与实现.pdf

    在Android系统中,App Widget由两部分组成:一个是运行在后台服务中的App Widget Provider,负责处理Widget的更新和用户与Widget的交互;另一个是RemoteViews对象,它定义了Widget在主屏幕上的布局和显示内容。当...

    Android应用源码之 电量显示Widgets插件实现.zip

    Android App Widgets是Android系统中的轻量级组件,可以在不启动应用程序的情况下在主屏幕上提供功能或信息。它们通过AppWidgetProvider类与系统交互,并通过布局文件(XML)定义其外观。 2. **AppWidgetProvider*...

    android视频播放

    在本文中,我们将深入探讨如何在Android应用中实现视频播放,特别是在涉及到AppWidget(桌面小部件)时可能遇到的问题以及解决方案。 首先,我们要关注的核心组件是`VideoView`。`VideoView`是Android SDK提供的一...

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

    6. **启动动画**:理解Android系统启动时的动画效果是如何实现的,可能涉及到Transition动画和自定义ViewGroup的动画实现。 7. **权限管理**:由于Launcher作为系统级别的应用,需要处理权限问题。源码中会包含如何...

    Android高仿陌陌APP源码.zip

    1. 启动优化:分析陌陌APP启动流程,可以学习如何减少启动时间,如使用SplashScreen、预加载资源等方法。 2. 内存优化:查看源码中如何处理内存泄漏和过度绘制问题,学习使用工具如Memory Profiler进行内存分析。 ...

    Android 开发随手笔记之使用摄像头拍照

    在Android开发中,使用摄像头拍照是一项常见的功能,通常有两主要方法:调用系统相机(System Camera)和自定义相机界面。本篇笔记将重点讨论如何调用系统相机进行拍照。 首先,为了能够访问和保存拍摄的照片,我们...

    android 4.0 launcher分析

    在Android操作系统中,Launcher,即启动器,扮演着用户界面的核心角色,它是用户与设备交互的首要入口。本文将深入剖析Android 4.0版本的Launcher,理解其背后的运行机制和设计原理。 首先,我们需要了解Android...

    移动应用开发:Android APP开发简单的代码展示

    这是应用程序的主要入口点,包含了启动时加载的第一个活动(Activity)。在这里,我们可以处理用户交互逻辑和其他高级功能。 **代码示例**: ```java package com.example.helloandroid; import android.app....

    Launcher 2源码修改学习总结

    - 用户启动Launcher时,系统会加载数据库中的布局信息,并根据此信息绘制桌面。每个图标和小部件都是一个View对象,由ViewGroup(如GridView或LinearLayout)组织在一起。 - 当用户触摸屏幕时,触摸事件会沿着View...

    android helloword入门级教程

    `app_name`和`hello_world`是两个字符串资源的ID,它们在代码中可以通过`R.string.app_name`和`R.string.hello_world`来引用。 接下来,我们关注界面的构建。在Android中,界面通常由XML布局文件描述。在`res/...

    Decor,android布局装饰器:在布局文件中注入自定义属性,使用装饰器消除带有自定义视图的不必要的类爆炸。.zip

    Decor是Android开发中的一款开源库,其主要目的是简化布局文件中的自定义视图处理,通过在XML布局中注入自定义属性,实现对视图的装饰,从而避免因为自定义视图而频繁创建新类,导致的类爆炸问题。类爆炸问题在大型...

    android整合资源开发讲义

    - **Zygote和Dalvik**:Zygote是所有Android应用进程的父进程,它预先加载Dalvik虚拟机,提高启动效率。 - **Android API Level**:定义了系统功能的兼容性,不同的API级别对应不同版本的Android系统。 - **编译流程...

    Android Launcher3

    **Android Launcher3详解** ...总之,`Android Launcher3`是一个深入了解Android操作系统核心组件的绝佳平台,通过在`Android Studio`中的实践,开发者可以提升自己的定制化能力和对Android系统的理解。

    android 写的hello world 源码

    这里,`onCreate()`方法是Activity启动时调用的,`setContentView()`加载布局文件,`findViewById()`找到布局中的TextView,然后设置其文本。 5. **布局文件**:在`res/layout`目录下,`activity_main.xml`是定义...

    Android-NDK开发.pdf

    在Android.mk或CMakeLists.txt文件中,需要配置编译规则,指定源文件、目标库名等信息,然后通过NDK的构建系统(如ndk-build或cmake)来编译生成.so文件。最后,将.so文件放入项目的jniLibs目录,Eclipse会自动将其...

    Firefox OS输入系统分析1

    shell.js启动Gaia system app,并将后续的系统管理交给它。 2. 输入消息处理流程: - Android处理流程:输入事件首先由驱动层上报至内核,然后通过EventHub.cpp进行设备扫描和类型识别。InputReader.cpp读取原始...

    Android入门程序

    - 在`MainActivity.java`中,你需要通过`setContentView(R.layout.activity_main)`来加载刚才创建的布局。然后,可以使用`findViewById()`方法获取到布局中的`TextView`,并设置或获取其内容。 ```java import ...

    android基础到进阶

    3. Android架构:了解Android系统的组件模型,如Activity、Service、BroadcastReceiver、ContentProvider等,以及它们在应用中的作用。 二、UI设计与布局 1. XML布局:掌握XML文件用于创建用户界面的方法,理解各种...

Global site tag (gtag.js) - Google Analytics