Launcher3添加桌面appWidget

這是安卓系統(tǒng)移植開發(fā)--Launcher3在桌面上添加默認(rèn)的appWidget

為什么有這篇文章

Launcher3相對(duì)于Launcher2改變了很多,網(wǎng)上大部分的資料也是說的4.4版本以前的Launcher2,按照以前Launcher2的修改方式對(duì)Launcher3是無效的,比如本文要講述的在桌面添加appWidget.
上正題

Launcher3桌面的加載過程

Launcher3在首次安裝的時(shí)候,會(huì)檢查是否存在相對(duì)應(yīng)的數(shù)據(jù)庫launcher.db,如果不存在,就會(huì)從布局文件default_workspace_xxx.xml加載。如果數(shù)據(jù)庫存在,就不會(huì)再加載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不顯示,嘗試了很多種方式,都不行。

解決思路

  1. 前面說了,Launcher3在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到數(shù)據(jù)庫中,既然在xml配置文件中不起作用,那么很可能是沒有加載到數(shù)據(jù)庫,我導(dǎo)出了數(shù)據(jù)庫,一看,果然沒有。
  2. 既然不能自動(dòng)加載,那么我們是不是可以手動(dòng)插入一條數(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號(hào)
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)槲覀兪謩?dòng)添加到數(shù)據(jù)庫,在加載過程中會(huì)檢查是否有對(duì)應(yīng)的screenId,而此時(shí)保存screenId的集合是空的。這部分檢查代碼是由LauncherModel的checkItemPlacement()方法來完成的,仔細(xì)閱讀代碼就會(huì)發(fā)現(xiàn),真正保存screenId的集合是由一個(gè)變量叫做sBgWorkspaceScreens的變量保存,我們只需要在checkItemPlacement方法調(diào)用前為它手動(dòng)添加一個(gè)長整形0L,就可以了。

第一次寫的文章,寫得不太好,有什么問題,歡迎留言交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 蝴蝶結(jié)大包成品尺寸: 37cm*46cm,底寬12cm,包帶單長74cm,寬12cm 所需材料:素色棉麻布適量(因...
    葉樣悠閱讀 2,892評(píng)論 8 7
  • 我的夢(mèng)想 岢嵐三中60班 李慧 我從小就有個(gè)夢(mèng)想,像種子一樣根植在我心里,那就是當(dāng)一名醫(yī)生。但是在我家人的眼里,醫(yī)...
    嵐漪情韻閱讀 668評(píng)論 0 0
  • 感恩今天一大早的好天氣。我可以繼續(xù)步行去上班了。 感恩昨天客戶給我提的建議我可以再次改進(jìn)。更加進(jìn)步。感恩我的老板給...
    悅心慧兒閱讀 183評(píng)論 0 0

友情鏈接更多精彩內(nèi)容