Android内置多个launcher设置默认launcher

Android设置默认launcher

  • 前言
    • 高通 code
    • MTK code
    • 结语

前言

launcher因为开机即启动,若添加默认launcher过早则可能导致其他进程崩溃,添加过晚则起不到启动默认设置的效果且会弹出选择launcher的提示框.
查看了一些其他的修改方法,均需在ActivityManagerService.java的startHomeActivityLocked添加默认启动,但是发现添加后,若系统存在多个launcher apk,则仍然会弹出launcher选择提示框.经过几天折腾,发现一个比较简便且改动不大的方法.
主要思路是发现某些OS自带的apk也添加了

<category android:name="android.intent.category.HOME" />

的响应,且设置了 priority=“1”,则可以保证该应用在Launcher启动前就运行起来.

以下为具体code修改.

高通 code

7.1版本
若有编译 SetupWizard则使用此方法,无则使用 mtk code方法.
vendor\qcom\proprietary\qrdplus\Extension\apps\SetupWizard\src\com\qualcomm\qti\setupwizard\SetupWelcomeActivity.java

private static final String ORIGINAL_LAUNCHER_PACKAGENAME = "com.android.launcher3";//设置为定制的包名
private static final String ORIGINAL_LAUNCHER_CLASSNAME = "com.android.launcher3.Launcher";//设置为定制的类名

MTK code

6.0版本
packages\apps\Provision\AndroidManifest.xml
添加 android:sharedUserId=“android.uid.system”

packages\apps\Provision\src\com\android\provision\DefaultActivity.java
onCreate()方法添加

 if(SystemProperties.getInt("persist.sys.defualt.launcher",0)==0)//一次性使用系统变量,为免后续重复调用	
 initLauncher();

添加initLauncher()方法.

 public void initLauncher ()
	{
		String ORIGINAL_LAUNCHER_PACKAGENAME = "com.xxx.ilauncher";//包名
    	String ORIGINAL_LAUNCHER_CLASSNAME = "com.xxx.ilauncher.MainActivity";	//类名
        Intent queryIntent = new Intent();
		final PackageManager mPm = this.getPackageManager();
        queryIntent.addCategory(Intent.CATEGORY_HOME);
        queryIntent.setAction(Intent.ACTION_MAIN);

        List<ResolveInfo> homeActivities = mPm.queryIntentActivities(queryIntent, 0);
        if(homeActivities == null) {
            return ;
        }

        ComponentName defaultLauncher = new ComponentName(ORIGINAL_LAUNCHER_PACKAGENAME,
                ORIGINAL_LAUNCHER_CLASSNAME);
        int activityNum = homeActivities.size();
        ComponentName[] set = new ComponentName[activityNum];
        int defaultMatch = -1;
        for(int i = 0; i < activityNum; i++){
            ResolveInfo info = homeActivities.get(i);
            set[i] = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
            if(ORIGINAL_LAUNCHER_CLASSNAME.equals(info.activityInfo.name)
                    && ORIGINAL_LAUNCHER_PACKAGENAME.equals(info.activityInfo.packageName)){
                defaultMatch = info.match;
            }
        }

        //if Launcher is not found, do not set anything
        if(defaultMatch == -1){
            return ;
        }
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_MAIN);
        filter.addCategory(Intent.CATEGORY_HOME);
        filter.addCategory(Intent.CATEGORY_DEFAULT);

        mPm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
		SystemProperties.set("persist.sys.defualt.launcher",String.valueOf(1));
    }

结语

 高通平台8.0版本默认未将SetupWizard 内置,则也可参照mtk code方法修改packages\apps\Provision 中代码即可.
 Provision为4.4平台即内置的应用,其他平台皆可使用该方法.

你可能感兴趣的:(OS修改,android,os)