自定义操作意图在与我单击的应用程序相同的上下文中打开我的应用程序

Posted

技术标签:

【中文标题】自定义操作意图在与我单击的应用程序相同的上下文中打开我的应用程序【英文标题】:Custom Action Intent Opens my App in the same context as the app that I clicked From 【发布时间】:2014-03-22 14:11:49 【问题描述】:

我在这方面搜索了很多。

但是,我的代码可以使用自定义意图 URL 打开我的应用程序。此 URL 通常通过电子邮件发送。

当我点击链接时,它会很好地打开我的应用程序,并且一切似乎都正常;但是,它会在电子邮件应用程序的上下文中打开。

例如,如果我点击 Gmail 中的链接,当我打开多任务处理时,我必须点击 Gmail 才能返回刚刚打开的应用程序。

我认为它应该会打开我的应用,并且我可以在其他应用运行时继续使用 Gmail。

对此有什么想法吗?

【问题讨论】:

这是 android 的默认行为。 FD_ :我不知道您使用的女巫安卓版本,但在 Jelly bean 和 Kitkat 中,我遇到了与 Frenzy 相同的问题:默认情况下,共享按钮在当前应用程序中启动活动。顺便说一下这个问题,在来到这里之前我很难找到答案。 【参考方案1】:

使您的网址如下所示:

intent:#Intent;launchFlags=0x10000000;component=com.mycompany.myapp/com.mycompany.myapp.MyActivity;end

此 URL 包含 Intent.FLAG_ACTIVIY_NEW_TASK 的 launchFlag,因此这将在单独的任务中启动您的应用程序(在电子邮件客户端或浏览器或其他任何内容之外)。


编辑:根据 OP 的评论添加更多详细信息

你说你正在使用这样的 URL:http://com.my.app/5058749

在这种情况下,您必须使用 Intent 过滤器通过在清单中的某个 <activity> 上指定 <intent-filter> 来让 Android 打开您的应用程序。您可以采取多种措施来解决已启动的 Activity 最终与启动它的 Activity 执行相同任务的问题:

1) 如果 Activity 总是打算作为任务的根(开始,第一个)Activity,您可以将以下代码放在onCreate() 调用super.onCreate() 之后:

if (!isTaskRoot()) 
    // Activity was launched into another task. Restart it in its own task
    Intent intent = new Intent(this, this.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    finish();
    return;

2) 你可以在manifest中设置这个Activity的启动模式为singleTask,通过添加

android:launchMode="singleTask"

<activity> 定义。这将导致 Activity 在它自己的任务中启动,但这种启动模式还有其他更微妙的后果,因此您需要小心使用它。一般来说,我不喜欢这样建议,因为它往往会产生比它解决的问题更多的问题。

3) 您可以通过检查用于在onCreate() 中启动应用程序的Intent 来确定您的应用程序是从浏览器还是电子邮件客户端启动的(当通过浏览器或电子邮件客户端)。然后,您可以使用我在上面选项 1 中提供的代码来决定是否要在自己的任务中重新启动它。

【讨论】:

嘿大卫,我有点困惑:这就是我的 url 的结构方式,它在您的示例中传递“ID”com.my.app/5058749 时打开我的应用程序,它看起来如何?【参考方案2】:

Intent.FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_CLEAR_TOP 标志(intent.SetFlags() 添加到您的意图中。您的活动将在新任务中打开,此活动将成为新堆栈的根。

【讨论】:

OP 正在使用 URL 执行此操作,他没有从代码中调用 startActivity()。【参考方案3】:

这是android的默认行为,但要覆盖它,你需要通过

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_CLEAR_TOP

按照你的意图。

【讨论】:

OP 正在使用 URL 执行此操作,他没有从代码中调用 startActivity()

以上是关于自定义操作意图在与我单击的应用程序相同的上下文中打开我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在与我的 tableview 相同的位置显示 UISearchbarResult

如何停止以自定义意图启动的 Android 服务

使用 java 应用程序安装添加自定义文件类型

如何在 Delphi Form Designer 中为自定义组件添加上下文菜单操作?

如何在 iOS 10 中使用 Sirikit 自定义 SendPayment 意图的“MoneySent”意图 UI 屏幕

当 ajax 代码在 wordpress 的自定义插件中打开时,数据库表条目停止