清除和设置默认的主应用程序

2022-09-01 08:13:52

Nova到底是如何做到这一点的?我实际上是在尝试做完全相同的事情:为用户提供一个按钮,用户可以按下以清除并选择新的默认启动器。

我能够获取默认应用名称并显示它:

       private String getPrefered(Intent i) {
       PackageManager pm = this.getActivity().getPackageManager();
       final ResolveInfo mInfo = pm.resolveActivity(i, 0);
       return (String) pm.getApplicationLabel(mInfo.activityInfo.applicationInfo);
   }

在哪里Intent i

Intent home = new Intent("android.intent.action.MAIN");
        home.addCategory("android.intent.category.HOME");

然后我调用系统 ResolveActivity,

private void makePrefered() {
       Intent selector = new Intent("android.intent.action.MAIN");
       selector.addCategory("android.intent.category.HOME");                          
       selector.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
       startActivity(selector);
   }

选取器出现并正常运行,但它实际上并未设置或清除任何值。在调试它时,似乎我错过了一些额外的东西?当我调用该方法时,我收到以下日志消息,makePrefered

I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=android/com.android.internal.app.ResolverActivity u=0} from pid 22641

但是,当我使用Nova实现时,我看到所有这些,

    I/PackageManager(  602): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 (has extras) } type null
I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=android/com.android.internal.app.ResolverActivity (has extras) u=0} from pid 22905
I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.mycolorscreen.canvas/.Launcher (has extras) u=0} from pid 22905
  1. 我怎样才能进入那里,看看与该捆绑包一起发送的内容?
  2. 如何清除首选应用?不要告诉我你不能,我已经看到了足够多的答案。Nova做到了,并且完全按照我想要的方式去做。

答案 1

执行此操作的代码实际上只是一个非常聪明的解决方法。

当组件具有

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

启用后,通常从安装新的家庭应用程序开始,默认的家庭应用程序将被清除。

要利用这一点,请使用这样的主组件创建一个空活动。

<activity
            android:name="com.t3hh4xx0r.haxlauncher.FakeHome"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>     

如果要设置新的默认值,请启用此组件,然后调用主目录意图,然后再次禁用假主组件。

public static void makePrefered(Context c) {
       PackageManager p = c.getPackageManager();
       ComponentName cN = new ComponentName(c, FakeHome.class);
       p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

       Intent selector = new Intent(Intent.ACTION_MAIN);
       selector.addCategory(Intent.CATEGORY_HOME);            
       c.startActivity(selector);

       p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
   }

最终结果是系统认为安装了新的家庭应用程序,因此默认值被清除,允许您设置没有特殊权限的应用程序。

感谢来自TeslaCoil和NovaLauncher的Kevin提供了有关如何完成此操作的信息!


答案 2

r2DoesInc的解决方案在我的4.2.2测试设备上不起作用。
我的解决方案:禁用然后重新启用我的应用程序的“家庭活动”,它不必创建FakeHome

PackageManager p = getPackageManager();
ComponentName cN = new ComponentName(this, HomeActivity.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

推荐