這是安卓系統(tǒng)移植開發(fā)--Launcher3在桌面上添加默認(rèn)的appWidget
為什么有這篇文章
Launcher3相對于Launcher2改變了很多犁柜,網(wǎng)上大部分的資料也是說的4.4版本以前的Launcher2蔑鹦,按照以前Launcher2的修改方式對Launcher3是無效的船万,比如本文要講述的在桌面添加appWidget.
上正題
Launcher3桌面的加載過程
Launcher3在首次安裝的時(shí)候假消,會檢查是否存在相對應(yīng)的數(shù)據(jù)庫launcher.db怠堪,如果不存在乌昔,就會從布局文件default_workspace_xxx.xml加載。如果數(shù)據(jù)庫存在尾组,就不會再加載xml文件了忙芒。
下面以default_workspace_4x4.xml為例,如下:
<!-- Hotseat -->
<include launcher:workspace="@xml/dw_phone_hotseat"/>
<!--添加widget-->
<resolve
launcher:screen="0"
launcher:x="0"
launcher:y="0"
launcher:spanX="2"
launcher:spanY="2">
<appwidget
launcher:packageName="com.android.alarmclock"
launcher:className="com.android.alarmclock.AnalogAppWidgetProvider" /> />
</resolve>
HotSeat是可以生效的演怎,但是appWidget不顯示,嘗試了很多種方式避乏,都不行爷耀。
解決思路
- 前面說了,Launcher3在啟動時(shí)會把數(shù)據(jù)加載到數(shù)據(jù)庫中拍皮,既然在xml配置文件中不起作用歹叮,那么很可能是沒有加載到數(shù)據(jù)庫,我導(dǎo)出了數(shù)據(jù)庫铆帽,一看咆耿,果然沒有。
- 既然不能自動加載爹橱,那么我們是不是可以手動插入一條數(shù)據(jù)呢萨螺?嘗試了一下,是行得通的愧驱。
方案代碼
步驟一
workspace的展示需要兩個(gè)重要的過程慰技,loadWorkspace()和bindWorkspace(),顧名思義分別是加載workspace需要的數(shù)據(jù)和數(shù)據(jù)與workspace的位置綁定的兩個(gè)方法组砚。這兩個(gè)過程在LauncherModel.java文件中吻商。我們需要在loadWorkspace()方法中把數(shù)據(jù)添加進(jìn)去。具體在哪個(gè)位置呢糟红?在loadWorkspace()方法有一行
LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();
的后面艾帐。
代碼:
LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();
//在這里進(jìn)行添加--bianjb
//在這里添加一條數(shù)據(jù)乌叶,應(yīng)該可以的--bianjbLauncherProvider.DatabaseHelper helper = new LauncherProvider.DatabaseHelper (context);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("_id", 5);//id號
values.put("container", -100);//窗口,workspace是-100
values.put("cellX", 0);//x坐標(biāo)
values.put("cellY", 0);//y坐標(biāo)
values.put("spanX", 4);//x擴(kuò)展
values.put("spanY", 4);//y擴(kuò)展
values.put("itemType", 4);//類型為4,根據(jù)你要添加的進(jìn)行調(diào)整
//appWidgetProvider也是需要要添加哪個(gè)widget進(jìn)行調(diào)整
values.put("appWidgetProvider", "com.android.deskclock/com.android.alarmclock" + ".DigitalAppWidgetProvider");
values.put("modified", 0);//上一次修改時(shí)間柒爸,可以不寫
values.put("restored", 0);
values.put("profileId", 0);
values.put("rank", 0);
values.put("options", 0);
long insert = db.insert(LauncherProvider.TABLE_FAVORITES, null, values);
db.close();
Log.e("LauncherModel", insert > 0 ? "插入成功" : "插入失敗");
步驟二
注意了准浴,這里我們使用了DataBaseHelper來創(chuàng)建數(shù)據(jù)庫,這個(gè)類是LaucherProvider的內(nèi)部類揍鸟,源代碼中是private兄裂,所以我們還需要修改該類為public
步驟三
因?yàn)槲覀兪謩犹砑拥綌?shù)據(jù)庫,在加載過程中會檢查是否有對應(yīng)的screenId阳藻,而此時(shí)保存screenId的集合是空的晰奖。這部分檢查代碼是由LauncherModel的checkItemPlacement()方法來完成的,仔細(xì)閱讀代碼就會發(fā)現(xiàn)腥泥,真正保存screenId的集合是由一個(gè)變量叫做sBgWorkspaceScreens的變量保存匾南,我們只需要在checkItemPlacement方法調(diào)用前為它手動添加一個(gè)長整形0L,就可以了蛔外。
第一次寫的文章蛆楞,寫得不太好,有什么問題夹厌,歡迎留言交流豹爹!