“私人”意图过滤器仅供自我应用使用

时间:2012-06-25 03:27:15

标签: android intentfilter

我创建了一个文件浏览器并注册

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

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

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

5 个答案:

答案 0 :(得分:2)

如果只有您自己的应用程序能够启动您的某个组件,请务必将清单中该组件的导出属性设置为“false”。

答案 1 :(得分:1)

如果你问我 - 我认为根据你的情况,最好的办法是创建你自己的意图过滤器(当你在问题中消化时),因为如果你宣布你的活动接收一个内置广播的系统 - 它有一个含义。那么使用这种内置广播有什么意义呢?如果你从系统的角度“打破他的合同”,并想在某些情况下忽略它?

如果你决定使用这个内置的过滤器,尽管我已经建议,实现你想要的方法是:

注册你的接收器不是在清单中,而是在第一次启动活动的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();
}

答案 2 :(得分:1)

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

  

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

因此,如果一个intent具有“Openable”类别且没有与您的intent filter特定数据部分匹配的数据部分,则不会为用户显示您的内部文件资源管理器。

答案 3 :(得分:1)

您可以使用&#39;活动别名&#39;制作副本&#39; android:exported =&#34; false&#34;和私人意图?

答案 4 :(得分:0)

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