安卓系统默认启动LAUNCHER

596 阅读2分钟

当系统存在多个Launcher时,开机完成并解锁后,系统会弹出一个选择框让用户选择
进入哪一个Launcher,如果不想选择,而是想直接进入某一个默认的Launcher,并且
用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的那个默
认的Launcher,并且取消了默认值,可以重新弹出launcher选框。

解决方法:

      下面以设置Google
Launcher2作为默认启动的Launcher为例,
其package name 为 com.android.launcher
launcher activity name 为 com.android.launcher2.Launcher

需要以下两个修改点

1)修改Provision应用

编辑packages/apps/Provision/src/com/android/DefaultActivity.java文件

/*

 * Copyright (C) 2008 The Android Open Source Project

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *      www.apache.org/licenses/LI…

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

 

package com.android.provision;

 

import android.app.Activity;

import android.content.ComponentName;

import android.content.Intent;

import android.content.IntentFilter;

import android.content.pm.PackageManager;

import android.content.pm.ResolveInfo;

import android.os.Bundle;

import android.provider.Settings;

import android.util.Log;

 

import java.util.List;

 

/**

 * Application that sets the provisioned bit, like SetupWizard does.

 */

public class DefaultActivity extends Activity {

 

    private static final String TAG = "DefaultActivity";

 

    @Override

    protected void onCreate(Bundle icicle) {

        super.onCreate(icicle);

 

        //新增这个函数的调用

        setupDefaultLauncher();

 

        // Add a persistent setting to allow other apps to know the device has been provisioned.

        Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);

 

        // remove this activity from the package manager.

        PackageManager pm = getPackageManager();

        ComponentName name = new ComponentName(this, DefaultActivity.class);

        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

                PackageManager.DONT_KILL_APP);

 

        // terminate the activity.

        finish();

    }

 

    private void setupDefaultLauncher() {

        // remove this activity from the package manager.

        PackageManager pm = getPackageManager();

 

        String examplePackageName = "com.bluegod.launcher"; //请修改为需要设置的 package name

        String exampleActivityName = "com.android.launcher2.Launcher"; //请修改为需要设置的 launcher activity name

 

        ComponentName defaultLauncher = null;

 

        Intent intent = new Intent(Intent.ACTION_MAIN);

        intent.addCategory(Intent.CATEGORY_HOME);

 

        List resolveInfoList =

                pm.queryIntentActivities(intent, 0);

        if (resolveInfoList != null) {

            int size = resolveInfoList.size();

            for (int j = 0; j < size; ) {

                final ResolveInfo r = resolveInfoList.get(j);

                if (!r.activityInfo.packageName.equals(examplePackageName)) {

                    resolveInfoList.remove(j);

                    size -= 1;

                } else {

                    j++;

                }

            }

            ComponentName[] set = new ComponentName[size];

            defaultLauncher = new ComponentName(examplePackageName, exampleActivityName);

            int defaultMatch = 0;

            for (int i = 0; i < size; i++) {

                final ResolveInfo resolveInfo =

                        resolveInfoList.get(i);

                Log.d(TAG, resolveInfo.toString());

                set[i] = new

                        ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);

                if (defaultLauncher.getClassName().equals(resolveInfo.activityInfo.name)) {

                    defaultMatch = resolveInfo.match;

                }

            }

            Log.d(TAG, "defaultMatch =" + Integer.toHexString(defaultMatch));

            IntentFilter filter = new IntentFilter();

            filter.addAction(Intent.ACTION_MAIN);

            filter.addCategory(Intent.CATEGORY_HOME);

            filter.addCategory(Intent.CATEGORY_DEFAULT);

 

            pm.clearPackagePreferredActivities(defaultLauncher.getPackageName());

            pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);

        }

    }

}

 

在setComponentEnabledSetting函数调用之前,新增setupDefaultLauncher()函数的调用。

然后修改packages/apps/Provision/AndroidManifest.xml文件,增加以下语句:

 

2)修改框架文件修改
PackageManagerService.java

framework/base/services/java/com/android/server/pm/PackageManagerService.java该文件中找到 findPreferredActivity
方法
,将此方法的比较靠后的一段代码if (!pa.mPref.sameSet(query, priority)) { 添加如下语句

// Okay we found a previously set preferred app.

            // If the result set is different from when this

            // was created, we need to clear it and re-ask the

            // user their preference.

            /*if (!pa.mPref.sameSet(query, priority)) {

                Slog.i(TAG, "Result set changed, dropping preferred activity for "

                        + intent + " type " + resolvedType);

                pir.removeFilter(pa);

                return null;

            }*/

 

            if (!pa.mPref.sameSet(query, priority)) {

                if (!(intent.getAction() != null

                        && intent.getAction().equals(intent.ACTION_MAIN)

                        && intent.getCategories() != null

                        && intent.getCategories().contains(intent.CATEGORY_HOME))) //添加

                {  //添加这行

                    Slog.i(TAG, "Result set changed, dropping preferred activity: "

                            + intent + " type " + resolvedType);

                    pir.removeFilter(pa);

                    return null;

                }  //添加这行

                Slog.i(TAG, "Result set not change, not drop preferred activity special intent: " + intent);//添加这行

            }

替换上面/* */注释部分的代码,说白了主要增加一个if语句的判断

if (!(intent.getAction() != null

                        && intent.getAction().equals(intent.ACTION_MAIN)

                        && intent.getCategories() != null

                        && intent.getCategories().contains(intent.CATEGORY_HOME)))

如果非Launcher,则执行removeFilter()。

OK,经过以上两个修改,就可以做到开机后设置Google Launcher2作为默认启动的Launcher