Android framework 使用自定的activity取代默認(rèn)的Launcher界面

背景:需要實(shí)現(xiàn)使用自定的activity取代默認(rèn)的Launcher界面
a. 開機(jī)啟動(dòng)后進(jìn)入自定義的activity
b. 按home鍵跳轉(zhuǎn)到自定義的activity

1.先看一下launcher的流程

image
    boolean startHomeActivityLocked(int userId, String reason) {
        if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            // We are running in factory test mode, but unable to find
            // the factory test app, so just sit around displaying the
            // error message and don't try to start anything.
            return false;
        }
        Intent intent = getHomeIntent();
        ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
        if (aInfo != null) {
            intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
            // Don't do this if the home app is currently being
            // instrumented.
            aInfo = new ActivityInfo(aInfo);
            aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
            ProcessRecord app = getProcessRecordLocked(aInfo.processName,
                    aInfo.applicationInfo.uid, true);
            if (app == null || app.instrumentationClass == null) {
                intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                mActivityStarter.startHomeActivityLocked(intent, aInfo, reason);
            }
        } else {
            Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
        }
        return true;
    }
//startHomeActivityLocked中將“l(fā)auncher”啟動(dòng)起來,打個(gè)引號(hào)就是說不一定是launcher應(yīng)用师脂,可以是其他符合條件的組件害晦。


String mTopAction = Intent.ACTION_MAIN;
Intent getHomeIntent() {
        Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
        intent.setComponent(mTopComponent);
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            intent.addCategory(Intent.CATEGORY_HOME);
        }
        return intent;
 }
 //創(chuàng)建一個(gè) ACTION_MAIN 并且CATEGORY_HOME 類型的 Intent ,通過resolveActivityInfo函數(shù)向 PackageManagerService 查詢 CATEGORY 是否類型為 HOME 并且ACTION為ACTION_MAIN 的應(yīng)用
 //startHomeActivityLocked中resolveActivityInfo方法會(huì)返回一個(gè)最佳匹配的組件获搏。這個(gè)處理是在PMS中完成的谓罗,當(dāng)有多個(gè)組件action和category都滿足條件的情況下刑巧,
 //會(huì)依據(jù)priority的值的大小來選擇,取priority值最大的一個(gè)秀菱,當(dāng)有多個(gè)組件priority相同的情況部凑,會(huì)提示用戶進(jìn)行選擇.

2. 那么我們就構(gòu)造這樣一個(gè)activity

       <activity
            android:name="com.test.learning.MainActivity"
            android:launchMode="singleInstance"
            android:excludeFromRecents="true"
            android:configChanges="mcc|mnc"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter android:priority="1">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.MONKEY"/>
            </intent-filter>
        </activity>

根據(jù)第一小節(jié)launcher啟動(dòng)流程的描述,定義了這樣一個(gè)activity后车海,滿足了action.MAIN笛园,category.HOME,priority=”1”(launcher為0侍芝,默認(rèn)的)研铆,應(yīng)該就可以替代launcher了吧,然而并沒有什么卵用州叠。

通過加log發(fā)現(xiàn)resolveActivityInfo方法返回的最佳匹配組件還是launcher界面蚜印。明明已經(jīng)定義了我們這個(gè)activity priority=”1”了呀
這是因?yàn)镻MS在解析所有組件的時(shí)候會(huì)根據(jù)策略調(diào)整intent的優(yōu)先級(jí),具體策略在PMS的adjustPriority方法中留量。(大于0的會(huì)被強(qiáng)制設(shè)置為0)
這一塊的部分流程參加下圖:


image
private void adjustPriority(
                List<PackageParser.Activity> systemActivities, ActivityIntentInfo intent) {
            // nothing to do; priority is fine as-is
            if (intent.getPriority() <= 0) {
                return;
            }

            final ActivityInfo activityInfo = intent.activity.info;
            final ApplicationInfo applicationInfo = activityInfo.applicationInfo;

            if("your pacakgename".equals(applicationInfo.packageName)
                    && "your activity classname".equals(intent.activity.className)) {
                return;
            }
            ..................
            ..................
}

在adjustPriority方法中過濾掉我們自定義的activity 窄赋,不讓framework去強(qiáng)制設(shè)置成0.
至此,開機(jī)啟動(dòng)的首個(gè)activity就是我們自定義的activity界面楼熄,按home鍵進(jìn)入的也是我們自定義的activity界面忆绰。

如有不當(dāng)之處,還請(qǐng)同學(xué)們指正~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末可岂,一起剝皮案震驚了整個(gè)濱河市错敢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缕粹,老刑警劉巖稚茅,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異平斩,居然都是意外死亡亚享,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門绘面,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺税,“玉大人侈沪,你說我怎么就攤上這事⊥碓洌” “怎么了亭罪?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歼秽。 經(jīng)常有香客問我应役,道長,這世上最難降的妖魔是什么燥筷? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任扛吞,我火速辦了婚禮,結(jié)果婚禮上荆责,老公的妹妹穿的比我還像新娘。我一直安慰自己亚脆,他們只是感情好做院,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著濒持,像睡著了一般键耕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柑营,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天屈雄,我揣著相機(jī)與錄音,去河邊找鬼官套。 笑死酒奶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶赔。 我是一名探鬼主播惋嚎,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼站刑!你這毒婦竟也來了另伍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤绞旅,失蹤者是張志新(化名)和其女友劉穎摆尝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體因悲,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕汞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晃琳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼朗。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邻寿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出视哑,到底是詐尸還是另有隱情绣否,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布挡毅,位于F島的核電站蒜撮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跪呈。R本人自食惡果不足惜段磨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耗绿。 院中可真熱鬧苹支,春花似錦、人聲如沸误阻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽究反。三九已至寻定,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間精耐,已是汗流浹背狼速。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卦停,地道東北人向胡。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像惊完,于是被迫代替她去往敵國和親捷枯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容