【发布时间】:2014-04-07 06:10:31
【问题描述】:
我有一个以登录活动启动的应用程序,它将用户重定向到浏览器以对服务进行身份验证(必须通过浏览器完成,不能使用 REST API 或 curl),并且然后使用会话 ID 跳回应用程序。从应用程序转到浏览器很容易,我只是这样启动它:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://domain.com/login/?url=appscheme://loggedin&sessionTransfer=window"));
startActivity(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 关联) -> Browser -> MyActivity2(与 MyApp 关联)
这就是实际发生的情况: MyActivity1(与 MyApp 关联) -> Browser -> MyActivity2(与 Browser 关联)
所以现在,如果用户想要查看电子邮件然后返回我的应用程序,他们实际上必须从最近的应用程序中选择浏览器才能工作。
【问题讨论】:
-
这与我的问题并不完全相关。预期的流程是:MyApp 从 MyActivity1 开始。它来自 MyActivity1 -> 浏览器 -> MyActivity2。现在,它到达了 MyActivity2,但由于某种原因,一旦它到达那里,MyActivity2 就会与浏览器相关联,而不是与 MyApp 相关联。所有功能都很好,但是哪个活动所属的层次结构完全混乱了。