转自 http://www.apkbus.com/android-43450-1-1.html

Android系统启动时AppWidget加载流程


1.  Android系统启动,SystemServer创建AppWidgetService,并调用systemReady()方法,在systemReady()方法中做以下三项准备工作:

    (1)通过PackageManager从Android系统中查找所有已经被安装的AppWidget(包含"android.appwidget.action.APPWIDGET_UPDATE"


            的Action和meta-data标签),解析AppWidget的配置信息,封闭成对象,保存到List集合。

    (2)从/data/system/appwidgets.xml文件读取已经被添加到Launcher的AppWidget信息,封闭成对象,保存到List集合中。

    (3)注册四个广播接收器:第一. Android系统启动完成,第二. Android配置信息改变,第三. 添加删除应用,第四. sdcard的安装与缷载。

2.  Android系统启动Launcher应用程序,会做以下准备工作:

    (1)从Launcher应用的数据库查找已经被添加到Launcher的AppWidget信息。

    (2)根据查找到的appWidgetId值(整型值)创建LauncherAppWidgetHostView布局对象。

    (3)根据查找到的appWidgetId值(整型值)从AppWidgetService中获取RemoteViews对象(因为是第一次启动所以RemoteViews对象为


            空)。

    (4)将获取到的RemoteViews对象的布局解析并设置到第(2)步中创建的LauncherAppWidgetHostView布局对象中。

    (5)将LauncherAppWidgetHostView布局对象添加到Launcher的WorkSpace中(因为RemoteViews对象为空,所以只在Launcher的


            WorkSpace中占了一个位置)。

3.  Android系统启动完成,发出BOOT_COMPLETED广播,AppWidgetService接收到广播后,会做以下事情:

    (1)获取已经添加到Launcher的AppWidget列表(在第1步的第(2)小步中提到),依次向这个Widget发出APPWIDGET_ENABLED和


            APPWIDGET_UPDATE更新广播,根据配置的更新间隔定时发出更新广播。

    (2)每个AppWidget接收到广播后都会调用onEnabled()方法和onUpdate()方法,在onEnabled()方法中进行一些初始化操作,在onUpdate()


           方法中创建RemoteViews布局对象并通过AppWidgetManager的updateAppWidget(int appWidgetId, RemoteViews remoteViews)


           方法通知AppWidgetService对象用RemoteViews对象更新appWidgetId所对应的AppWidget.

    (3)AppWidgetService接收到了appWidgetId和RemoteViews后,通过appWidgetId查找已经被添加到Launcher的


            LauncherAppWidgetHostView布局对象,并将RemoteViews中的布局更新到LauncherAppWidgetHostView布局对象中。AppWidget


            显示在Launcher中。


·························

1. 用户长按Launcher弹出添快捷组件的Dialog,选择添加AppWidget,这时会打开一个Activity(AppWidgetPickActivity)显示系统中全部      AppWidget,单击某一个AppWidget后会做以下操作:

     (1) 通过AppWidgetService获取一个最新的appWidgetId值。

     (2) 根据获取的appWidgetId值,向单击的AppWidget组件发出APPWIDGET_ENABLED和APPWIDGET_UPDATE更新广播。并向            /data/system/appwidgets.xml中添加此AppWidget的基本信息。

2. 启动AppWidgetPickActivity(第1步中提到)时使用的是startActivityForResult()方法,所以在向所单击的AppWidget组件发出      APPWIDGET_ENABLED和APPWIDGET_UPDATE更新广播后会执行onActivityResult()方法,做以下准备工作:

     (1) 将需要被添加到Launcher的AppWidget基本信息保存到数据库中。

     (2) 根据查找到的appWidgetId值(整型值)创建LauncherAppWidgetHostView布局对象。

     (3) 根据查找到的appWidgetId值(整型值)从AppWidgetService中获取RemoteViews对象(因为是第一次启动所以RemoteViews对象            为空)。

     (4) 将获取到的RemoteViews对象的布局解析并设置到第(2)步中创建的LauncherAppWidgetHostView布局对象中。

     (5) 将LauncherAppWidgetHostView布局对象添加到Launcher的WorkSpace中(因为RemoteViews对象为空,所以只在Launcher的            WorkSpace中占了一个位置)。

3. 在第1步中已经向需要添加到Launcher中的AppWidget发出了更新消息(注意:第一步和第二步是异步执行的),继续做以下事情:

     (1) 每个AppWidget接收到广播后都会调用onEnabled()方法和onUpdate()方法,在onEnabled()方法中进行一些初始化操作,在            onUpdate()方法中创建RemoteViews布局对象并通过AppWidgetManager的updateAppWidget(int appWidgetId, RemoteViews            remoteViews)方法通知AppWidgetService对象用RemoteViews对象更新appWidgetId所对应的AppWidget.

     (2) AppWidgetService接收到了appWidgetId和RemoteViews后,通过appWidgetId查找已经被添加到Launcher的            LauncherAppWidgetHostView布局对象,并将RemoteViews中的布局更新到LauncherAppWidgetHostView布局对象中。            AppWidget显示在Launcher中。


更多相关文章

  1. 关于AndroidManifest.xml中的android:debuggable
  2. 2010.05.15学习日志
  3. Android(java)学习笔记78:设计模式之单例模式
  4. Android中解析XML的方法
  5. Android7.0 禁止锁屏状态的下拉状态栏
  6. Parcelable接口的使用(跨进程,Intent传输)
  7. Android(安卓)View 绘制流程之四:绘制流程触发机制
  8. Android(安卓)SDK 更新时连接出现“https://dl-ssl.google.com r
  9. Android(安卓)aidl学习笔记-服务端

随机推荐

  1. android 9.0 app 开发问题总结
  2. 【Android】adb shell 命令探索
  3. Android 无线接口层(Radio Layer Interfac
  4. 强烈推荐:Android史上最强大的自定义任务
  5. Android Studio编译报Default interface
  6. 蓝牙最简单的例子,最难得的简单
  7. 为android编译ffmpeg+x264+faac
  8. Android Scroller、VelocityTracker
  9. Android 属性动画(Property Animation)介
  10. Android 获得图片并解码成缩略图以减少内