天天看點

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中。