rk修改launcher_Android更改桌面应用程序launcher的两种方式
http://blog.csdn.net/mdx20072419/article/details/9632779/
launcher,也就是android的桌面應用程序。下圖是我正在使用的魅族手機的launcher應用程序:
接下來我們要開發(fā)一個自己的launcher,使其替代系統(tǒng)的默認launcher。
怎樣使我們的應用程序成為一個launcher?
首先我們要有一個自己的Android應用,在這里,我使用最簡單的應用程序Hello,
使用eclipse創(chuàng)建Android項目我這里就省略了,直接上圖
來看看我的AndroidManifest.xml
package="com.example.hello"
android:versionCode="1"
android:versionName="1.0"?>
android:minSdkVersion="7"
android:targetSdkVersion="7"?/>
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"?>
android:name="com.example.hello.MainActivity"
android:label="@string/app_name"?>
我們知道,一個應用程序可以有多個Activity,每個Activity是同級別的。那么在啟動程序時,最先啟動哪個Activity呢?有些程序可能需要顯示在程 序列表里,有些不需要。怎么定義呢?android.intent.action.MAIN決定應用程序最先啟動的Activity ,android.intent.category.LAUNCHER決定應用程序是否顯示在程序列表里。Main和LAUNCHER同時設定才有意義,如果有多個同級的Activity都有過濾器
則只有最前面的Activity的 有 效,啟動該程序時,執(zhí)行的是該Activity。且在程序列表中有多個圖標,這些Activity都在程序列表中顯示,該Application有多個入 口,執(zhí)行不同的Activity,但是整個程序的主入口(整個程序最先運行的那個activity)只有最先定義的那個Activity。
如 果一個應用沒有LAUNCHER則該apk仍能安裝到設備上,但是在主程序圖中看不到。如果給那個Activity 設定了LAUNCHER,且同時設定了Main,則這個Activity就可出現(xiàn)在程序圖中;如果沒有Main,則不知啟動哪個Activity,故也不 會有圖標出現(xiàn)。
那如果我們要把一個應用程序做為桌面應用程序,該怎么辦呢?
如果了解Android的啟動流程的同學都知道,Zygote啟動SystemServer,SystemServer的main函數(shù)開始啟動各種服務。 首先啟動init1,然后啟動init2.?init1這個方法是被Zygote調用來初始化系統(tǒng)的,init1會啟動native的服務如SurfaceFlinger,AudioFlinger等等,這些工作做完以后會回調init2來啟動Android的service。
public?static?final?void?init2()?{
501?????????Log.i(TAG,?"Entered?the?Android?system?server!");
502?????????Thread?thr?=?new?ServerThread();
503?????????thr.setName("android.server.ServerThread");
504?????????thr.start();
505?????}
init2中啟動ServerThread線程,ServerThread中啟動了一系列的服務,比如ActivityManagerService,EntropyService等等。
當這些服務起來以后,開始 ?((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady() 在systemReady后開始開始啟動Launcher。
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
8422?????public?void?systemReady(final?Runnable?goingCallback)?{
8423?????????//?In?the?simulator,?startRunning?will?never?have?been?called,?which
8424?????????//?normally?sets?a?few?crucial?variables.?Do?it?here?instead.
.........................
8594???????????resumeTopActivityLocked(null);
}
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
2576?????private?final?boolean?resumeTopActivityLocked(HistoryRecord?prev)?{
2577?????????//?Find?the?first?activity?that?is?not?finishing.
2578?????????HistoryRecord?next?=?topRunningActivityLocked(null);
2579
2580?????????//?Remember?how?we'll?process?this?pause/resume?situation,?and?ensure
2581?????????//?that?the?state?is?reset?however?we?wind?up?proceeding.
2582?????????final?boolean?userLeaving?=?mUserLeaving;
2583?????????mUserLeaving?=?false;
2584
2585?????????if?(next?==?null)?{
2586?????????????//?There?are?no?more?activities!??Let's?just?start?up?the
2587?????????????//?Launcher...
2588?????????????return?startHomeActivityLocked();
2589?????????}
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
2457?????private?boolean?startHomeActivityLocked()?{
2458?????????if?(mFactoryTest?==?SystemServer.FACTORY_TEST_LOW_LEVEL
2459?????????????????&&?mTopAction?==?null)?{
2460?????????????//?We?are?running?in?factory?test?mode,?but?unable?to?find
2461?????????????//?the?factory?test?app,?so?just?sit?around?displaying?the
2462?????????????//?error?message?and?don't?try?to?start?anything.
2463?????????????return?false;
2464?????????}
2465?????????Intent?intent?=?new?Intent(
2466?????????????mTopAction,
2467?????????????mTopData?!=?null???Uri.parse(mTopData)?:?null);
2468?????????intent.setComponent(mTopComponent);
2469?????????if?(mFactoryTest?!=?SystemServer.FACTORY_TEST_LOW_LEVEL)?{
2470?????????????intent.addCategory(Intent.CATEGORY_HOME);
2471?????????}
frameworks/base/core/java/android/content/Intent.java
1881?????public?static?final?String?CATEGORY_HOME?=?"android.intent.category.HOME";
根據(jù)上面代碼可知,在尋找Launcher的時候是根據(jù)HOME的filter(在Manifest中定義的)來過濾。?然后根據(jù)filter出來的HOME來啟動,如果只有一個HOME,則啟動這個HOME,如果用戶自己裝了HOME,那就會彈出來一個列表供用戶選擇。
既然如此,我們現(xiàn)在就可以更改我們的AndroidManifest.xml來安裝自己的HOME。所以我們只需在AndroidManifest.xml添加兩行代碼:
現(xiàn)在重新編譯我們的應用程序,把編譯生成的APK放到相應的目錄下,一般是/system/app,啟動開發(fā)板,我們可以看到在我們的LCD屏上面,要求用戶選擇launcher。
到這里,我們不禁要想,如果我們從這里彈出我們自己定制的Launcher,但同時不彈出選擇HOME的界面,我們也不希望用戶修改我們的home,比如我們的home上放了好多廣告,以及強制安裝的程序,不希望用戶把它干掉。
在這里,我們就可以寫一個自己私有的filter選項,然后用這個選項來過濾HOME. 一般情況下我們使用Manifest中定義的
這里我們有一種比較暴力的更改方法,就是把系統(tǒng)中原有的public static final String CATEGORY_HOME = "android.intent.category.HOME";
更改成public static final String CATEGORY_FS_HOME = "android.intent.category.FS_HOME";
然后修改和CATEGORY_HOME相關的所有的地方,都改成CATEGORY_FS_HOME.如果不知道修改哪些地方,可以使用如下命令去查找:
grep??CATEGORY_HOME??-l??*??-R
查找到的文件大概有這些:
將上述文件中和CATEGORY_HOME相關的所有的地方,都改成CATEGORY_FS_HOME即可。
然后,我們可以把之前的應用程序hello的AndroidManifest.xml更改如下:
package="com.example.hello"
android:versionCode="1"
android:versionName="1.0"?>
android:minSdkVersion="7"
android:targetSdkVersion="7"?/>
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"?>
android:name="com.example.hello.MainActivity"
android:label="@string/app_name"?>
重新編譯我們的應用程序,放到我們開發(fā)板相應目錄下,就可以看到我們自己的Launcher了!
Android設置默認Launcher
http://huamm.blog.51cto.com/5646020/1550305
當系統(tǒng)存在多個launcher時,若沒有設置默認launcher,開機啟動后會彈出提示框,羅列所有l(wèi)auncher,用戶選擇并設置了默認launcher后,按home鍵以及以后重啟都會進入默認的launcher。
現(xiàn)在,我希望系統(tǒng)能直接就進入我設定的launcher而不是彈出框后選擇然后設置
網(wǎng)上大部分的做法就是修改
和
我按照這個做不能達到預期的效果,
/添加內容
后期修改包名,發(fā)現(xiàn)開機自啟動出現(xiàn)問題,然后弄了兩天,終于差不多弄清楚了。果然,欠下的債遲早得還!
其實修改DefaultActivity.java就能夠完成開機自啟動,只是當時我的程序有問題,所以沒有達到預期效果
當然下面修改ActivityManagerService.java也能完成開機自啟動
這兩者的區(qū)別在于
DefaultActivity.java只是在第一次啟動時執(zhí)行,如果修改了默認launcher后不可恢復
ActivityManagerService.java在每次啟動時執(zhí)行,每次都默認啟動設定的launcher,當然,如果設定的launcher存在的話,設置其他的launcher為默認會無效,因為重新啟動時setDefaultLauncher()會將當前默認launcher清除。只有在卸載了設定默認啟動的launcher后才能設置其他launcher為默認啟動.
//
這篇文章有借鑒之處,直接使用時會發(fā)現(xiàn)有些字段是上下文中沒有的,故寫下此文記錄一下。
修改文件
添加一個方法:
然后在ActivityManagerService類中的
方法第一行調用上面添加的
添加后的方法全部內容如上,重新編譯android,燒錄,開機就能夠自動進入自定義的launcher
可以通過系統(tǒng)設置取消該launcher的默認設置,取消之后按home鍵會彈出launcher選擇提示框
ResolverActivity類就是選擇打開方式的彈出框
總結
以上是生活随笔為你收集整理的rk修改launcher_Android更改桌面应用程序launcher的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zeekooper集群搭建_How to
- 下一篇: android qq分享自动弹出,史上最