在没有实际打开活动的情况下提示默认活动

时间:2014-01-06 15:59:29

标签: android android-intent

我需要为特定的mime类型设置默认应用。我知道如何清除默认值,但我需要在没有实际打开应用程序的情况下提示用户。

PackageManager p = mContext.getPackageManager();
ComponentName cN = new ComponentName(mContext, FakeDownloadActivity.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Intent selector = new Intent(Intent.ACTION_DEFAULT);
selector.addCategory(Intent.CATEGORY_DEFAULT);
selector.setType(mimeType);
mContext.startActivity(selector);

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

上面的代码启动活动而不是仅选择默认活动。它可以启用虚假活动,然后禁用它。这会导致“选择默认应用程序”对话框在下次调用时显示。我只想选择默认活动。

1 个答案:

答案 0 :(得分:6)

您正在寻找的是ACTION_PICK_ACTIVITY意图。

首先,您创建一个定义应该有资格选择的应用的intent,例如:

Intent mainIntent = new Intent(Intent.ACTION_DEFAULT, null);
mainIntent.addCategory(Intent.CATEGORY_DEFAULT);

然后,您创建ACTION_PICK_ACTIVITY意图,并作为Extra,传递您之前创建的主要意图

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent);

现在,您只需使用此意图启动结果活动:

startActivityForResult(pickIntent, 0);

将创建一个对话框,其中已使用的可以选择一个应用程序,但是当单击时,活动不会启动,而是会保留在您的活动中,并且将调用函数onActivityResult并显示结果。所以你需要创建这个功能:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

               //In data, you have all the information about the selected application
       if (data != null) {
                 //You can launch the application that we just picked with startActivity(data);
                 //or explore the variable to get all the information than you want
       }
    }

看一下Intent课程。在那里,您可以获得有关包名称和将要启动的类的信息。

从现在开始,您需要将该包和类设置为intent的默认值,或者您需要的任何其他内容。不好的一面是,您只能为了自己的内部目的保存该信息,例如,决定下次用户执行某些操作时要启动的应用程序。您不能做的是修改系统设置以设置给定intent的默认活动。实际上,the package manager has the addPreferredActivity方法,应该这样做,但它自API级别8以来已被弃用,原因如下:

  

这是受保护的API,不应该对第三方可用   派对申请。这是平台分配的责任   首选活动,这不能直接修改。添加一个新的   映射到系统的首选活动。这将用于   在何时自动选择给定的活动组件   Context.startActivity()还可以找到多个匹配的活动   匹配给定的过滤器。