【问题标题】:android: choose default launcher programmaticallyandroid:以编程方式选择默认启动器
【发布时间】:2014-04-16 12:52:52
【问题描述】:

我想弹出一个对话框,让用户选择要启动的启动器设置为默认选项。我试过了

Intent home = new Intent(Intent.ACTION_DEFAULT);
home.addCategory(Intent.CATEGORY_LAUNCHER);
Intent chooser = Intent.createChooser(home, "Launcher");
context.startActivity(chooser);

但是由此弹出的对话框没有设置默认值的选项。而如果已经设置了默认启动器,以下代码将不会弹出对话框。

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

如何做到这一点?

【问题讨论】:

    标签: android android-intent homescreen android-launcher


    【解决方案1】:

    尝试使用以下方法:

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

    如果已设置默认操作(您的),您可以先调用:

    getPackageManager().clearPackagePreferredActivities(getPackageName());
    

    如果默认操作不是您的,您无法以编程方式清除它,您可以做的是检查其他应用是否设置为默认并显示消息..

    private boolean isMyLauncherDefault() {
        PackageManager localPackageManager = getPackageManager();
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.HOME");
        String str = localPackageManager.resolveActivity(intent,
              PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName;
        return str.equals(getPackageName());
    }
    

    作为一种解决方法,如果其他应用被设置为默认,您可以创建一个fake 主页,安装它(这将强制系统清除默认应用)然后卸载它...

    Manifest.xml

    <activity
            android:name="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>
    

    FakeHome.java

    public class FakeHome extends Activity {
    
    }
    

    某处

    if (!isMyLauncherDefault()) {           
        PackageManager p = getPackageManager();
        ComponentName cN = new ComponentName(getApplicationContext(), 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);            
        startActivity(selector);
    
        p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);            
    }
    

    【讨论】:

    • 如果已经设置了默认启动器,此代码将不会弹出对话框。
    • filters 的参数getPreferredActivities() 是一个输出参数。调用前向列表中添加过滤项无效。
    • @Nermeen this isMyLauncherDefault() 在哪里被调用?FakeHome Activity 或任何其他活动?以及在哪里传递上述意图?
    • 这很好用。有什么方法可以使用 ROLE_HOME 完成这项工作吗?
    【解决方案2】:

    从 API 29 开始,现在正式支持使用 RoleManager

    一个可以从任何活动调用的方法的非常简单的 Kotlin 示例:

    fun showLauncherSelector(activity: AppCompatActivity, requestCode : Int) {
        val roleManager = activity.getSystemService(Context.ROLE_SERVICE) as RoleManager
        if(roleManager.isRoleAvailable(RoleManager.ROLE_HOME)){
            val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME)
            activity.startActivityForResult(intent, requestCode)
        }
    }
    

    然后您可以检查调用者活动中的错误:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == MY_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                // Something went wrong
            }
        }
    }
    

    【讨论】:

    • 我根本不明白他们为什么创建Kotlin,只是为了让类似的答案无用。
    • 遗憾的是,这只有在您启用了可以处理 Intent 的 Activity 时才有效。如果没有,什么都不会发生。
    【解决方案3】:

    试试这个:

        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.HOME");
        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        getContext().startActivity(intent);
    

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2012-04-28
      • 2019-01-17
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多