通过意图过滤器从浏览器切换到应用程序时的Android问题

时间:2014-04-07 06:10:32

标签: android android-intent

我有一个启动登录活动的应用程序,它将用户重定向到浏览器以便对服务进行身份验证(必须通过浏览器完成,不能使用REST API或卷曲) ,然后使用会话ID跳回应用程序。从应用程序到浏览器很容易,我只是这样启动它:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://domain.com/login/?url=appscheme://loggedin&sessionTransfer=window"));
startActivity(intent);

用户登录后,浏览器应该通过目标活动的intent过滤器跳回应用程序(带有会话ID),使用android.intent.category.BROWSABLE声明。

<intent-filter>
    <action android:name="android.intent.action.VIEW" />

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

    <data
       android:host="loggedin"
       android:scheme="appscheme" />
</intent-filter>

问题在于,它不是在原始应用程序实例下恢复执行,而是在浏览器实例下的初始登录屏幕之后执行所有操作。由于一些原因,这很糟糕。首先,这意味着“最近的应用程序”菜单显示用户在浏览器中执行的所有操作,主应用程序仅显示登录按钮。其次,只要关闭应用程序并打开浏览器,浏览器就会从现有选项卡中重新打开应用程序。

如何使用浏览器,然后确保当用户通过浏览器完成登录时,所有活动都会在原始应用实例下恢复?

编辑:如果这有助于提高清晰度,这是预期的流程,包括每个活动应如何列在最近的应用列表中: MyActivity1(与MyApp相关联) - &gt; 浏览器 - &gt; MyActivity2(与MyApp相关联)

以下是实际发生的事情: MyActivity1(与MyApp相关联) - &gt; 浏览器 - &gt; MyActivity2(与浏览器相关联)

现在,如果用户想要查看电子邮件然后返回我的应用程序,他们实际上必须从最近的应用程序中选择浏览器才能使用它。

1 个答案:

答案 0 :(得分:0)

原来有人在这里问了一个类似的问题:Starting a new Android Activity in different task

总结我的解决方案,我将intent-filter移动到登录活动并声明android:launchMode =&#34; singleTask&#34;。这样,浏览器重新打开登录活动并始终运行onNewIntent(),我将浏览器数据重新打包为新意图并按预期打开目标活动。有点费解,但它确实有效!