2

我有一个包含 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 授权回调,所以它可能是这样的

浏览器被重定向到 urlmy_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);
    }
});

并且两个回调都不起作用,IFandroid.intent.category.DEFAULT没有添加到意图过滤器中。如果DEFAULT添加到任何一个意图过滤器,相应的回调开始正常工作。如果同时对两者都设置为 none - 所有回调都不起作用(我收到android.content.ActivityNotFoundException

4

3 回答 3

3

我对这个问题的回答对于最初的提问者来说有点晚了,但这个特定的问题非常值得回答,但却被误解了。我还在努力让多个活动可浏览,以便处理从网页重定向回我应用程序的不同部分。这在 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。将仅为该活动的意图过滤器设置为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 的意图中解压缩并将其传递给其他活动即可。

于 2015-04-28T10:15:45.590 回答
1

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

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
于 2014-06-16T16:12:29.953 回答
0

浏览器添加android.intent.category.BROWSABLEIntent它启动的 s 中。因此,如果您希望 Intent 解析起作用,则需要在过滤器中包含该类别。

文档中IntentFilter

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

于 2013-01-14T07:48:26.317 回答