5

我创建了一个文件资源管理器并注册

<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.OPENABLE" />

但我不希望我的内部文件资源管理器开始显示供用户选择何时另一个应用程序发送具有“可打开”类别的隐式意图。我该怎么做?我应该创建自己的动作名称吗?

我没有明确的,因为我希望用户在我的应用程序中选择其他文件资源管理器。

4

5 回答 5

2

If it's important that only your own app is able to start one of your components, set the exported attribute to "false" for that component in the manifest.

于 2014-03-10T08:02:11.693 回答
2

如果您问我-我认为对于您的情况,最好的方法是创建自己的意图过滤器(正如您在问题中所建议的那样),因为如果您声明您的活动以接收内置广播的系统-它就有意义。那么使用这个内置广播有什么意义呢,如果你从系统的角度来看有点“违反他的合同”,并且在某些情况下想忽略它?

如果您仍然决定使用此内置过滤器,尽管我已经建议了,那么实现您想要的方法是:

不是在清单中注册您的接收器,而是在您的第一个启动活动的 onCreate() 方法中注册,并在 onDestroy() 中取消注册他。

这样,当您的所有活动都不是前台时,您的活动将不会被注册 - 从用户的角度来看,这接近于哪个应用程序关闭的状态。

如果您不确定它是如何完成的,那就是这样:

private BroadcastReceiver mMyCustomReceiver = new  BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    registerReceiver(mMyCustomReceiver, IntentFilter.create(YOUR_FILTER_ACTION_COMMAND, YOUR_FILTER_DATA_TYPE));
}

@Override
protected void onDestroy() {
    unregisterReceiver(mMyCustomReceiver);
    super.onDestroy();
}
于 2012-06-25T04:12:12.543 回答
1

我同意Chris StrattonTal Kanel的观点。但是您可以在您的意图过滤器中使用特定的“数据”。文档说:

仅当过滤器同样未指定任何 URI 或数据类型时,既不包含 URI 也不包含数据类型的 Intent 对象通过测试。

因此,如果意图具有“可打开”类别并且没有与您的意图过滤器特定数据部分匹配的数据部分,则不会向用户显示您的内部文件浏览器。

于 2012-06-25T04:32:53.993 回答
1

您可以使用“活动别名”来制作具有 android:exported="false" 和私有意图的活动的“副本”?

于 2015-10-21T17:17:32.883 回答
0

如果您愿意通过显式意图调用您的活动(即,给出目标组件名称),那么您可以省略该活动的意图过滤器。

于 2012-06-25T04:23:08.477 回答