Android11默认切换第三方launcher

博客内容涉及Android系统中默认启动器(launcher)的配置方法,通过代码展示了如何设置默认启动器,并提供了通过ADB命令切换launcher的步骤。强调了在处理launcher APK时检查正确包名和启动类名的重要性,以避免不必要的困扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做这个需求之前一定要先读一下客户给的launcherAPK的包名和启动类名,避免出现我种情况(客户给的launcherAPK有两个包名是一样的,还不是客户提供给我的那个包名,我一直用客户提供的包名,做了好久也没作用,浪费了好多时间)

diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

old mode 100644

new mode 100755

index fadc15912dc..db2e3954def

--- a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

+++ b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

第一种方法:

@@ -307,9 +307,51 @@ public class ResolverActivity extends Activity implements

intent.setFlags(intent.getFlags()&~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

return intent;

}

+ // swl add

+ private void setupDefaultLauncher(String defPackageName, String defClassName) {

+ if ((defPackageName != null && defPackageName.trim().length() > 1)

+ && (defClassName != null && defClassName.trim().length() > 0)) {

+ IntentFilter filter = new IntentFilter();

+ filter.addAction("android.intent.action.MAIN");

+ filter.addCategory("android.intent.category.HOME");

+ filter.addCategory("android.intent.category.DEFAULT");

+ Intent intent=new Intent(Intent.ACTION_MAIN);

+ intent.addCategory(Intent.CATEGORY_HOME);

+ List list = new ArrayList();

+ list = getPackageManager().queryIntentActivities(intent, 0);

+ final int N = list.size();

+ ComponentName[] set = new ComponentName[N];

+ int bestMatch = 0;

+ for (int i=0; i

+ ResolveInfo r = list.get(i);

+ set[i] = new ComponentName(r.activityInfo.packageName,

+ r.activityInfo.name);

+ if (r.match > bestMatch) bestMatch = r.match;

+ }

+ ComponentName preActivity = new ComponentName(defPackageName, defClassName);

+ getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);

+ }

+ }

+ // end

+

@Override

protected void onCreate(Bundle savedInstanceState) {

+ // swl add

+ if(true){

+ String defPackageName = "com.aceage.karie";

+ String defClassName = "com.aceage.karie.activity.launch.LaunchActivity";

+ setupDefaultLauncher(defPackageName, defClassName);

+ Intent intent = new Intent();

+ intent.setClassName(defPackageName, defClassName);

+ intent.setAction("android.intent.action.MAIN");

+ intent.addCategory("android.intent.category.HOME");

+ intent.addCategory("android.intent.category.DEFAULT");

+ startActivity(intent);

+ //Settings.Global.putInt(getApplication().getContentResolver(), Settings.Global.DEFAULT_HOME_SETTING_CHANGED, 1);

+ this.finish();

+ }

+ // end

// Use a specialized prompt when we're handling the 'Home' app startActivity()

final Intent intent = makeMyIntent();

final Set categories = intent.getCategories();

第二个方法:

@@ -381,6 +423,17 @@ public class ResolverActivity extends Activity implements

boolean filterLastUsed = mSupportsAlwaysUseOption && !isVoiceInteraction()

&& !shouldShowTabs();

mMultiProfilePagerAdapter = createMultiProfilePagerAdapter(initialIntents, rList, filterLastUsed);

+ /* // swl add

+ String launcherPackagename = "com.aceage.karie";

+ String launcherActivityname = "com.aceage.karie.activity.launch.LaunchActivity";

+ if(launcherPackagename != null && launcherPackagename.length() > 0 && launcherActivityname != null && launcherActivityname.length() > 0){

+ if(mResolvingHome){

+ setupDefaultLauncher(launcherPackagename,launcherActivityname);

+ finish();

+ return;

+ }

+ }

+ // end */

if (configureContentView()) {

return;

}

@@ -433,6 +486,32 @@ public class ResolverActivity extends Activity implements

intent.getAction() + ":" + intent.getType() + ":"

+ (categories != null ? Arrays.toString(categories.toArray()) : ""));

}

+ /* // swl add

+ private void setupDefaultLauncher(String defPackageName, String defClassName) {

+ if ((defPackageName != null && defPackageName.trim().length() > 1)

+ && (defClassName != null && defClassName.trim().length() > 0)) {

+ IntentFilter filter = new IntentFilter();

+ filter.addAction("android.intent.action.MAIN");

+ filter.addCategory("android.intent.category.HOME");

+ filter.addCategory("android.intent.category.DEFAULT");

+ Intent intent=new Intent(Intent.ACTION_MAIN);

+ intent.addCategory(Intent.CATEGORY_HOME);

+ List list = new ArrayList();

+ list = getPackageManager().queryIntentActivities(intent, 0);

+ final int N = list.size();

+ ComponentName[] set = new ComponentName[N];

+ int bestMatch = 0;

+ for (int i=0; i

+ ResolveInfo r = list.get(i);

+ set[i] = new ComponentName(r.activityInfo.packageName,

+ r.activityInfo.name);

+ if (r.match > bestMatch) bestMatch = r.match;

+ }

+ ComponentName preActivity = new ComponentName(defPackageName, defClassName);

+ getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);

+ }

+ }

+ // end */

private boolean isIntentPicker() {

return getClass().equals(ResolverActivity.class);

两个方法的区别就是加入的位置不同,第一个方法开机就运行了,第二个是判断launcher是否有home属性的时候运行的,可以直接用adb命令直接切换launcher3和客户的launcher,命令如下:

关闭客户launcher,切换到系统launcher
1.adb root
2.adb shell pm enable com.android.launcher3
3.adb shell pm disable com.aceage.karie

关闭系统launcher,打开客户launcher
1.adb shell pm enable com.aceage.karie
2.adb shell pm disable com.android.launcher3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值