日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 进lanucher的广播,(转)Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色...

發(fā)布時間:2025/4/16 Android 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 进lanucher的广播,(转)Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖二的時序圖描述了,從AppWidgetPickActivity返回之后,Launcher如何處理AppWidget的。

圖二、Picked之后Launcher對AppWidget的處理

執(zhí)行過程:

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

2.?通過AppWidgetId獲得info:

AppWidgetProviderInfo;[Seq#5~ #6]

3.?創(chuàng)建LauncherAppWidgetInfo的實例,并加入到數(shù)據(jù)模型LauncherModel中;[Seq#7]

4.?通過LauncherAppWidgetHost.createView()創(chuàng)建AppHostView;[Seq#8~

#15]

由于override里onCreateView(),onCreateView()被執(zhí)行。在onCreateView()中創(chuàng)建LauncherAppWidgetHostView;[Seq#8~

#10]

AppWidgetHost.createView()中,把AppWidgetProviderInfo設(shè)置到appWidgetHostView里;[Seq#11]

AppWidgetHost.createView()中,通過AppWidgetService獲得AppWidgetProvider提供的RemoteViews【AppWidgetHost、AppWidgetProvider、AppWidgetService運行在不同的進(jìn)程中,此時不能保證RemoteViews有內(nèi)容,亦即不能保證AppWidgetProvider.onUpdate()已經(jīng)被執(zhí)行】;[Seq#12~

#13]

AppWidgetHost.createView()中,用RemoteViews更新appWidgetHostView;[Seq#14]

返回已創(chuàng)建AppWidgetHostView的實例;[Seq#15]

5.?向AppWidgetHostView里設(shè)置TAG

– LauncherAppWidgetInfo的實例。[Seq#17]

最后,LauncherAppWidgetHostView被加入到當(dāng)前屏,讓相應(yīng)的顯示部分來完成顯示。因為此時RemoteViews里可能還沒有內(nèi)容,這里只是用一定的占空在Workspace中先占一定的空間。

當(dāng)AppWidgetProvider獲得更新的廣播,并執(zhí)行onUpdate(),onUpdate()中創(chuàng)建了RemoteViews并通過AppWidgetManager.updateAppWidget()更新到AppWidgetService之后,AppWidgetService會通過注冊的IAppWidgetHost的回調(diào),執(zhí)行AppWidgetHost的更新。

圖三、AppWidgetHost被更新

《Android中RemoteViews的實現(xiàn)》中的Section#3講述了RemoteViews后續(xù)的處理。

Launcher在初始化過程中,還會根據(jù)配置在第一次創(chuàng)建Database時把AppWidget加載進(jìn)來;不是第一次創(chuàng)建時,把數(shù)據(jù)庫中的AppWidget的內(nèi)容Load到數(shù)據(jù)模型中。

二、Launcher第一次創(chuàng)建Database時,處理AppWidget

Launcher的數(shù)據(jù)庫操作的相關(guān)的類

圖四、Launcher的數(shù)據(jù)庫操作LauncherProvider

Launcher在LauncherProvider中操作數(shù)據(jù)庫;AppWidget相關(guān)項是在TABLE_FAVORITIES表單中;LauncherProvider.AUTHORITY定義操作數(shù)據(jù)庫的入口,組合了LauncherSettings.Favorites.CONTENT_URI這個Uri來具體操作。

用SQLite具體存儲,所有用SQLiteOpenHelper的子類LauncherProvider.DatabaseHelper來具體操作SQLite數(shù)據(jù)庫。

數(shù)據(jù)庫TABLE_FAVORITIES中的具體Filed在LauncherSettings.Favorites中定義。

Launcher第一次創(chuàng)建數(shù)據(jù)庫時,LauncherProvider.DatabaseHelper.onCreate()會被執(zhí)行,對AppWidget的處理如下:

圖五、Launcher第一次創(chuàng)建數(shù)據(jù)庫時,對AppWidget的處理

執(zhí)行過程:

1.?移除掉Launcher作為AppWidgetHost相關(guān)的內(nèi)容;[Seq#4]

2.?解析default_workspace.xml中的內(nèi)容,如果是appwidget相關(guān)的:

a)?申請AppWidgetId;[Seq#8

~ #9]

b)?把解析出的內(nèi)容插入TABLE_FAVORITES表單;[Seq#10]

c)?把AppWidgetId與AppWidgetProvider綁定;[Seq#11]

其實這個過程就濃縮了用戶選擇AppWidgetProvider,然后再綁定等等一系列的過程。只是這里的要用哪個AppWidgetProvider,放在哪一屏的哪個位置都在配置里確定了,所以可以直接自動完成。

比如,下面是res/xml/default_workspace.xml中,關(guān)于“電量控制”這個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指定的:

三、Launcher正常啟動加載數(shù)據(jù)庫中的AppWidget

3.1 Launcher中的數(shù)據(jù)模型

圖六、Launcher中的簡要數(shù)據(jù)模型

LauncherModel是一個BroadcastReceiver;用mCallbacks記錄Model變化時,要通知的對象;mAppWidgets中記錄加入的AppWidget的信息。

Launcher實現(xiàn)LauncherModel.Callbacks,注冊進(jìn)LauncherModel,當(dāng)Model變化時,做相應(yīng)的處理。

3.2 Launcher數(shù)據(jù)模型的初始化

圖七、Launcher數(shù)據(jù)模型的初始化

執(zhí)行順序:

1.?Launcher被創(chuàng)建時,Launcher.onCreate()被執(zhí)行;

2.?通過getApplication()獲得LauncherApplication;LauncherApplication被創(chuàng)建(launcherApplication.onCreate())時:

a)?實例化LauncherModel,并把LauncherApplication自身傳進(jìn)去;

b)?為LauncherModel注冊廣播;

3.?通過LauncherApplication的setLauncher()把Launcher自身傳進(jìn)去;

LauncherApplication.

setLauncher()調(diào)用LauncherModel的initialize()把Launcher這個launcherModel.Callbacks的實例傳進(jìn)去;

4.?實例化LauncherAppWidgetHost這個AppWidgetHost,并通過startListening(),把IAppWidgetHost注冊進(jìn)AppWidgetSerivce。

3.3 加載并綁定Workspace

在需要加載數(shù)據(jù)模型的時,LauncherModel的startLoader()會被執(zhí)行。LauncherModel開啟一個LoaderTask線程,具體執(zhí)行l(wèi)oad和bind的工作。

圖八、LauncherModel加載并綁定Workspace

執(zhí)行加載過程:

1.?用LauncherSettings.Favorites.CONTENT_URI查詢所有的數(shù)據(jù);[Seq#1~

#3]

2.?從LauncherSettings.Favorites.ITEM_TYPE字段獲取當(dāng)前記錄的類型;[Seq#4~

#7]。

3.?對于AppWidget類型(type為LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET),獲得AppWidget關(guān)注的其他字段,并賦值給LauncherAppWidgetInfo;[Seq#8~

#9]

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

執(zhí)行綁定過程:

通過LauncherModel.Callbacks的實現(xiàn),也就是Launcher,執(zhí)行:

startBinding();

對所有的mAppWidgets中的Widget,執(zhí)行bindAppWidget()。

執(zhí)行LauncherModel.Callbacks.bindAppWidget()在Launcher中執(zhí)行。

3.4 Launcher綁定AppWidget

圖九、Launcher bindAppwidget

這個過程同圖二的執(zhí)行,可參考研讀。

總結(jié)

本文講述了:

Launcher在選擇了一個AppWidgetProvider之后,通過AppWidgetHost創(chuàng)建本地的AppWidgetHostView,用來呈現(xiàn)AppWidgetProvider通過RemoteViews提供的的提供內(nèi)容。相應(yīng)的LauncherAppWidgetInfo加入到LauncherModel的數(shù)據(jù)模型中。

Launcher(AppWidgetHost) / AppWidgetService

/AppWidgetProvider由于運行于不同的進(jìn)程中,執(zhí)行的次序不確定使得RemoteViews的內(nèi)容時效性不定,但是只要RemoteViews有更新,AppWidgetHost就會得到通知而更新。

在系統(tǒng)第一次執(zhí)行(剛燒機(jī)或恢復(fù)出廠設(shè)置之后)時,數(shù)據(jù)庫第一次被初始化,會從default_workspace.xml中加載初始的AppWidget信息,并加入到LauncherModel的數(shù)據(jù)模型中。

在正常開機(jī)過程(非剛燒機(jī)或恢復(fù)出廠設(shè)置之后)中,AppWidget的信息被從數(shù)據(jù)庫中讀取出來,并加入到LauncherModel的數(shù)據(jù)模型中。

可進(jìn)一步參考的文章

通過這一系列的其他文章,可獲得與本文關(guān)聯(lián)的信息:

AppWidget系統(tǒng)框架。

Launcher發(fā)起選取過程,此文中描述選取并綁定的過程,可結(jié)合本文看完整的選取/綁定/加入顯示系統(tǒng)的完整過程。

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

本文

RemoteViews的內(nèi)部如何實現(xiàn),看如何具體用RemoteViewsupdate AppWidgetHostView。

總結(jié)

以上是生活随笔為你收集整理的android 进lanucher的广播,(转)Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。