如何在单个应用程序中进行多个BROWSABLE活动?

时间:2013-01-13 17:53:54

标签: android android-intent android-activity android-manifest intentfilter

我有一个包含2个活动的应用程序,应该响应android.intent.action.VIEW。它们的定义与清单

相同
<activity android:name=".FirstActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="my_callback1"/>
    </intent_filter>
</activity>
<activity android:name=".SecondActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="my_callback2"/>
    </intent_filter>
</activity>

my_callback1默认启动浏览器活动。这是一个Twitter授权回调,所以它可能是这样的

浏览器会重定向到网址my_callback1://callback?token=0123456789abcdef

my_callback2由自定义Linkify过滤器启动,如下所示:

Linkify.addLinks(textView, pattern, null, matcher, new Linkify.TransformFilter() {
    @Override
    public String transformUrl(Matcher match, String url) {
    return "my_callback2://".concat(url);
    }
});

并且两个回调都不起作用,IF android.intent.category.DEFAULT未添加到intent过滤器。如果将DEFAULT添加到任何intent过滤器,则相应的回调开始正常工作。如果同时设置为none,则回调都不起作用(我收到android.content.ActivityNotFoundException

3 个答案:

答案 0 :(得分:1)

对于原始提问者我的回答有点迟,但这个特别的问题非常值得回答,而是被误解了。我还在努力使多个活动可浏览,以便处理从网页重定向到我的应用程序的不同部分。这在Android中基本上不受支持,因为为了使活动可浏览,你还必须使其默认,这意味着你不能有多个可浏览的活动。如果将多个活动标记为可浏览和默认,则无法创建正确区分的意图URI,因为在解压缩uri时会忽略组件信息。

但是,当您从浏览器获取意图并使用它们时,您可以接受参数,并使用新的BrowsableActivity启动您最初想要启动的活动。浏览器必须点击如下链接:

<a href="intent:#Intent;component=my.app.package/.activity.BrowsableActivity;S.my.app.package.activity.BrowsableActivity.PARAMETER_NAME=activityName;end">

关键是为您的应用制作新的BrowsableActivity。将该活动的intent-filter设置为BROWSABLE,如下所示:

<activity android:name="BrowsableActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent_filter>
</activity>

然后在您解压缩参数的Activity的代码中:

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent()
    String otherActivityName = (String) intent.getSerializableExtra(PARAMETER_NAME);
    if (otherActivityName == firstOne) {
       // create an intent and launch the first activity
    } else {
      // create an intent and launch the other activity
    }
  }

现在,您可以在可浏览活动中启动所需的任何活动,如果有必要,您也可以将额外参数传递给该活动,只需将其从BrowsableActivity的意图中解压缩并将其传递给其他活动。

答案 1 :(得分:0)

浏览器将android.intent.category.BROWSABLE添加到它启动的Intent。因此,如果您希望Intent分辨率起作用,则需要在过滤器中使用该类别。

来自documentation for IntentFilter

  

如果Intent中的所有类别都匹配,则匹配   过滤器中给出的类别。过滤器中的额外类别   不在Intent中不会导致匹配失败。注意   与动作不同,没有类别的IntentFilter只会匹配   Intent,没有任何类别。

答案 2 :(得分:0)

我刚刚遇到了这个问题,并根据其中一条评论为每个intent-filter添加了DEFAULT。这似乎对我有用。因此,每个活动的意图过滤器都有:

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />