【问题标题】:Android issue when switching from browser to app via intent filter通过意图过滤器从浏览器切换到应用程序时的Android问题
【发布时间】: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 关联)

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

【问题讨论】:

  • 看看这是否有帮助stackoverflow.com/questions/151777/…
  • 这与我的问题并不完全相关。预期的流程是:MyApp 从 MyActivity1 开始。它来自 MyActivity1 -> 浏览器 -> MyActivity2。现在,它到达了 MyActivity2,但由于某种原因,一旦它到达那里,MyActivity2 就会与浏览器相关联,而不是与 MyApp 相关联。所有功能都很好,但是哪个活动所属的层次结构完全混乱了。

标签: android android-intent


【解决方案1】:

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

总结一下我的解决方案,我将意图过滤器移至登录活动并声明了 android:launchMode="singleTask"。这样,浏览器会重新打开登录活动并始终运行 onNewIntent(),在此我将浏览器数据重新打包为新意图并按预期打开目标活动。有点复杂,但它有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多