我有一个包含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
)
答案 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" />