文章分類:移動開發
好麼,2.0的原始碼沒看幾天,2.1的出了。
學習記錄一下, 主要是launcher啟動時從資料庫讀取各種桌面物件資訊到最後顯示到螢幕桌面上的流程。
之前看2.0的時候,大概能分出來下面四個層次,2。1裡面基本一樣:
db--mlistinmodel--mlistinlauncher--viewchildincelllayout
i ii iii iv
掃了下**,launcher裡面對這些東西有改動的重要是下面幾個函式
1. workspace add view. -->iv,add
workspace.requestlayout.
2. mdesktopitems add item. -->iii,add
funb: bindfolders(hashmap folders)
1. clear . mfolder. -->iii,clear
2. mfolder. add -->iii,add all
func: binditems(arraylist shortcuts,int start,itn end)
1. mdesktopitems. add . -->iii,add
add in workspace.screen -->iv,add
workspace.requestlayout.
1. find place ,
2. workspace.dropexternal -->i, fix or add.
2. if didnt find slot : delete it -->iii,del
else add to db. --->i, add
3. mdesktopitems add -->iii,add
4. workspace add -->iv,add
funf: completeaddlivefodler(intent,cellinfo)
1.add to db -->i
2.workspace add view -->iv
fung: completeaddshortcut(intent,cellinfo)
1.add to db -->i
2.workspace add view -->iv
funh: finishbindingitems()
1. every folder . add to workspace screen . -->iv,add
2. requestlayout.
3. requesetfocus for that opend
funl: startbinding()
1. workspace.everycelllayout.removeallviewsinlayout -->iv.clear
涉及到content的流程:
1 oncreate ,開機 或者重啟
setupview初始化成員變數,然後由startloader(islaunching==true) 函式進行裝載。
startloader這個函式,多數情況下這個boolean引數都是true,也就是說完全重新裝載。只有在changefoldername,也就是改變使用者更改folder名字的時候,呼叫引數是false的狀況。
你一定覺得false的時候,系統會很聰明的去做最小的修改吧?嘿嘿,尼采錯了。
這個布林引數只是用來調節後文會提到的那個thread的許可權的,用途是使用者開機的時候及早顯示免得使用者對著黑屏無聊- -b
兩種情況做的事情還是一樣的:完全的重讀重繪,從i->ii->iii->iv完全走一遍。
他做的事情對應上面層次結構裡的i->ii->iii->iv,
先把內容從contentprovider讀出到自己的成遠變數, 然後傳遞給launcher,最後傳給workspace的celllayout的每個cellinfo的view,也就是畫到螢幕上。
具體來說,分以下幾步:
1)建立乙個loaderthread,然後mloaderthread.start來啟動run函式
3)run函式第二步:bindworkspace
這個函式可以通過callback這個神氣的東西找到launcher,然後向他的workspace發射剛才讀出來的兩個陣列。即包含了所有的資料庫中記錄的launcher上的物件。
主要的,他通過callback呼叫三個launcher的函式:
launcher.startbinding (即前面的funl,把workspace的當前所有的view清空),
launcher.bindfolders(funb,邦好folder相關)
最後,呼叫launcher.finishbindingitems() ,上面提到的funh, 把所有的folder裝載上,該顯示的folder用4*4個cell顯示起來。
細心的看官可能發現,三個bind函式,唯獨bindfolders是只在iii層操作,不和iv層相關,即不修改workspace的view的,原來是藏在finishbindingitems這個函式來作了。
到這裡launcher的oncreate就差不多了,機器介面上該顯示的也都顯示上了。
2 新增
其實點來點去,最後都是到了additems()這個函式,他彈出乙個視窗,讓你選想要新增的物件。
這些東西基本會呼叫乙個startactivityforresult
而這些返回的result回到launcher的時候,會得到相應的處理
具體的處理在onactivityresult函式裡面。
3 刪除
刪除 沒啥好說的
分清楚i,ii,iii,iv有點用。 想在哪個層次上作修改,對照著來還蠻快。
獲取當前android系統的launcher包名
由於定製的原因,不同手機的launcher包名不一樣 比如 miui com.miui.home huawei com.huawei.android.launcher moto and htc com.android.launcher 但是android手機型別數量太多,不同手機的launcher都...
修改Android預設啟動項launcher
方案一 根據操作流程分析code flow,兩者互相糅合,理清問題的關鍵。public void onbuttonclick view v catch exception e catch exception e else if count 1 else catch remoteexception e...
android2 1 Eclair 編譯執行
裝了個ubuntu9.10虛擬機器,使用預設配置,拖了好久把源 搞下來,接著將ubuntu編譯全部需要的軟體都更新了 接著在eclair目錄執行make,等了好幾個小時,一直停在某個地方,但是又沒有死掉,硬碟一直在閃!後來實在受不了了,終止了編譯過程,退出系統並調整記憶體從256mb到1gb,這樣再...