我想把自己寫的launcher設(shè)置成系統(tǒng)唯一的home launcher,。 在網(wǎng)上搜了資料,,都是講在android2.1版本上如何修改,, 我現(xiàn)在版本是android2.3,一些文件都不一樣了,。 在android2.3上該如何修改??? 多謝指教??! 附上別人寫的2.1版本上的方法: 定義一個(gè)私有的filter選項(xiàng),,然后用這個(gè)選項(xiàng)來過濾HOME. 一般情況下我們使用Manifest中定義的<category android:name="android.intent.category.HOME"來過濾的,, 我們現(xiàn)在增加一個(gè)私有的HOME_FIRST過濾。 在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加兩行代碼 //lixinso:添加CATEGORY_HOME_FIRST @SdkConstant(SdkConstantType.INTENT_CATEGORY) public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST"; 3)修改和CATEGORY_HOME相關(guān)的所有的地方,,都改成HOME_FIRST,,主要是framework中的這幾個(gè)地方: frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中 //intent.addCategory(Intent.CATEGORY_HOME); 改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso: //if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中 // _intent.hasCategory(Intent.CATEGORY_HOME) && 改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中 //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中 //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中 //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中 //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso 4) 寫一個(gè)自己的Launcher. 可以參考android sample中的Launcher,或者android源代碼中的 /packages/apps/Launcher 來寫,。 在Launcher中標(biāo)記其是不是Launcher的最關(guān)鍵的代碼時(shí)Manifest中的filter:android:name="android.intent.category.HOME" 現(xiàn)在我們定義了自己的filter,那么,,我們在我們自己寫的Launcher中將Manifest改為: <application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".FirstAppActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME_FIRST" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.MONKEY" /> </intent-filter> </activity> </application> 然后將編譯好的apk放到/out/target/product/generic/system/app目錄下。 5)將Android自帶的Launcher刪除掉,,包括源代碼(packages/apps/Launcher)和apk(/out/target/product/generic/system/app/Launcher.apk),。 6) 做完這些工作,就可以重新編譯Android了,,我們可以編譯修改過的幾個(gè)相關(guān)的包,。 如果之前編譯過了Android源碼,可以用mmm命令來編譯部分的改動,。 這里需要這樣編譯: $ . build/envsetup.sh $ mmm frameworks/base $ mmm frameworks/base/services/java $ mmm frameworks/policies/base/mid $ mmm frameworks/policies/base/phone 7) 編譯完成后重新生成img文件,。 $ make snod 8) 現(xiàn)在可以啟動Android模擬器來看效果了。 首先設(shè)置環(huán)境變量: $ export ANDROID_PRODUCT_OUT= ./out/target/product/generic 然后切換到 $ cd ./out/host/linux-x86/bin 運(yùn)行 $ ./emulator 這樣我們啟動的模擬器里面用的image就是我們剛才編譯好的自己定制的東西了,。 從模擬器上可以看到啟動的Launcher是我們自己的Launcher,,不會出現(xiàn)默認(rèn)的Launcher了,也不會出現(xiàn)選擇界面,。 9)我們再驗(yàn)證一下,,如果用戶裝上了一個(gè)其他的Launcher(Home)會怎么樣。 從網(wǎng)上找一個(gè)一般的Launcher或者自己寫一個(gè)一般的Launcher裝上去,,重新啟動,,不會出現(xiàn)選擇界面。 按HOME鍵也不會出來兩個(gè)HOME來選擇,。 這樣我們就牢牢控制了用戶的桌面,。 只有我們自己定制的HOME才能裝上。 這對于定制Android設(shè)備的廠商很有用處,。 |
|