如何显示默认启动器选择器?

时间:2019-02-13 15:19:39

标签: android android-launcher

我正在创建启动器应用程序,我想手动显示默认的启动器选择器。

我已经找到并尝试了this,但这并不完美,因为我无法立即选择ALWAYS。选择启动器后,我需要按下主页按钮才能始终选择。

这是我的代码:

public static void resetPreferredLauncherAndOpenChooser(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, DefaultLauncherHelperActivity.class);
    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    Intent selector = new Intent(Intent.ACTION_MAIN);
    selector.addCategory(Intent.CATEGORY_HOME);
    selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(selector);

    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
}

这里是清单:

<activity
        android:name=".activities.MainActivity"
        android:launchMode="singleTask">
        <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>
<activity
        android:name=".activities.DefaultLauncherHelperActivity"
        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>

这就是我得到的(左)与我要实现的(右)

必须有一种方法,因为Microsoft的启动器和poco启动器能够做到这一点,但是我找不到解决方案,不幸的是,没有开源的启动器具有相同的功能。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

没有直接的 API 可用于此。但是,在重置首选启动器之前调用以下代码将导致选择器对话框如右侧图像所示。

谨慎使用,因为调用此方法实际上会重置用户家庭应用偏好,并且效果也可以在您的家庭应用之外看到。

try {
      IntentFilter intentFilter = new IntentFilter();
      intentFilter.addAction(Intent.ACTION_MAIN);
      intentFilter.addCategory(CATEGORY_HOME);
      intentFilter.addCategory(CATEGORY_DEFAULT);
      Intent intent1 = new Intent(Intent.ACTION_MAIN);
      intent1.addCategory(CATEGORY_HOME);
      intent1.setComponent(null);
      Class<?> clazz = Class.forName("android.app.AppGlobals");
      Class.forName("android.content.pm.IPackageManager")
           .getMethod("setLastChosenActivity", new Class[] { Intent.class, String.class, int.class, IntentFilter.class, int.class, ComponentName.class })
                .invoke(clazz.getMethod("getPackageManager", new Class[0]).invoke(clazz, null),
                    new Object[] { intent1, intent1.resolveTypeIfNeeded(context.getContentResolver()), Integer.valueOf(65536), intentFilter, Integer.valueOf(1081344), intent1.getComponent() });
} catch (Exception ignore) {
}