今天进行一个Android AppWidget的开发,参考 android SDK 文档中关于App Widgets 开发的部分,可以很容易的完
成整个过程的搭建,文档中的 ExampleAppWidgetProvider.java 和 ExampleAppWidgetConfigure.java 中都拿到了一
个很重要的参数,分别是:appWidgetId 和 mAppWidgetId ,可是,对于这个参数是怎么来的,文档中却没有介绍。
这个问题涉及到 android 和 android AppWidget 的启动过程,下面是我使用 Powerpoint 画的一个 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由两部分组成:一个是运行在后台服务中的App Widget Provider,负责处理Widget的更新和用户与Widget的交互;另一个是RemoteViews对象,它定义了Widget在主屏幕上的布局和显示内容。当...
Android App Widgets是Android系统中的轻量级组件,可以在不启动应用程序的情况下在主屏幕上提供功能或信息。它们通过AppWidgetProvider类与系统交互,并通过布局文件(XML)定义其外观。 2. **AppWidgetProvider*...
在本文中,我们将深入探讨如何在Android应用中实现视频播放,特别是在涉及到AppWidget(桌面小部件)时可能遇到的问题以及解决方案。 首先,我们要关注的核心组件是`VideoView`。`VideoView`是Android SDK提供的一...
1. 启动优化:分析陌陌APP启动流程,可以学习如何减少启动时间,如使用SplashScreen、预加载资源等方法。 2. 内存优化:查看源码中如何处理内存泄漏和过度绘制问题,学习使用工具如Memory Profiler进行内存分析。 ...
6. **启动动画**:理解Android系统启动时的动画效果是如何实现的,可能涉及到Transition动画和自定义ViewGroup的动画实现。 7. **权限管理**:由于Launcher作为系统级别的应用,需要处理权限问题。源码中会包含如何...
在Android开发中,使用摄像头拍照是一项常见的功能,通常有两主要方法:调用系统相机(System Camera)和自定义相机界面。本篇笔记将重点讨论如何调用系统相机进行拍照。 首先,为了能够访问和保存拍摄的照片,我们...
在Android操作系统中,Launcher,即启动器,扮演着用户界面的核心角色,它是用户与设备交互的首要入口。本文将深入剖析Android 4.0版本的Launcher,理解其背后的运行机制和设计原理。 首先,我们需要了解Android...
这是应用程序的主要入口点,包含了启动时加载的第一个活动(Activity)。在这里,我们可以处理用户交互逻辑和其他高级功能。 **代码示例**: ```java package com.example.helloandroid; import android.app....
- 用户启动Launcher时,系统会加载数据库中的布局信息,并根据此信息绘制桌面。每个图标和小部件都是一个View对象,由ViewGroup(如GridView或LinearLayout)组织在一起。 - 当用户触摸屏幕时,触摸事件会沿着View...
LiveFolder作为Android 2.3系统中的一个重要组成部分,它的主要功能是在用户的桌面上创建一个动态组件,这个组件能够提供对特定应用程序数据的快速访问。为了实现这一功能,LiveFolder依赖于应用程序提供的...
`app_name`和`hello_world`是两个字符串资源的ID,它们在代码中可以通过`R.string.app_name`和`R.string.hello_world`来引用。 接下来,我们关注界面的构建。在Android中,界面通常由XML布局文件描述。在`res/...
Decor是Android开发中的一款开源库,其主要目的是简化布局文件中的自定义视图处理,通过在XML布局中注入自定义属性,实现对视图的装饰,从而避免因为自定义视图而频繁创建新类,导致的类爆炸问题。类爆炸问题在大型...
- **Zygote和Dalvik**:Zygote是所有Android应用进程的父进程,它预先加载Dalvik虚拟机,提高启动效率。 - **Android API Level**:定义了系统功能的兼容性,不同的API级别对应不同版本的Android系统。 - **编译流程...
启动黑屏问题通常发生在Activity的初始化阶段,因为系统正在加载布局和数据。为了解决这个问题,可以创建一个临时启动主题,该主题包含一个简单的加载屏幕,如上述示例中的`Theme.AppStartLoad`。这个Theme可以快速...
**Android Launcher3详解** ...总之,`Android Launcher3`是一个深入了解Android操作系统核心组件的绝佳平台,通过在`Android Studio`中的实践,开发者可以提升自己的定制化能力和对Android系统的理解。
这里,`onCreate()`方法是Activity启动时调用的,`setContentView()`加载布局文件,`findViewById()`找到布局中的TextView,然后设置其文本。 5. **布局文件**:在`res/layout`目录下,`activity_main.xml`是定义...
在Android.mk或CMakeLists.txt文件中,需要配置编译规则,指定源文件、目标库名等信息,然后通过NDK的构建系统(如ndk-build或cmake)来编译生成.so文件。最后,将.so文件放入项目的jniLibs目录,Eclipse会自动将其...
shell.js启动Gaia system app,并将后续的系统管理交给它。 2. 输入消息处理流程: - Android处理流程:输入事件首先由驱动层上报至内核,然后通过EventHub.cpp进行设备扫描和类型识别。InputReader.cpp读取原始...
- 在`MainActivity.java`中,你需要通过`setContentView(R.layout.activity_main)`来加载刚才创建的布局。然后,可以使用`findViewById()`方法获取到布局中的`TextView`,并设置或获取其内容。 ```java import ...
- **桌面小程序AppWidget**:开发AppWidget的具体步骤和技巧。 - **代码中运行二进制程序或脚本**:在应用中执行本地脚本或二进制程序的方法。 - **MD5校验**:使用Android内置的MD5算法进行数据完整性验证。 - **...