34

我有两个应用程序 App-B 启动 App-A。如果用户从 App-A 内部的 App AI 调用中启动 App B,那么我没有问题。

如果用户从应用程序抽屉或长按主页按钮直接进入应用程序 B,那么我将执行以下操作,在应用所有附加功能之前先清除应用程序 A 中的任务。这具有预期的效果,但仅适用于 API 11。在较低的 API 上,APP-A 中的新任务不会改变,额外的 putExtra 将无效。有什么替代方法FLAG_ACTIVITY_CLEAR_TASK吗?对于 API <=10?

        Intent i = new Intent("com.App-A");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

谢谢

杰森

4

6 回答 6

15

新的IntentCompat应该对此有所帮助,但显然低于 11 的 API 会忽略该标志。

要使用 IntentCompat,请执行以下操作:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
于 2014-06-06T18:53:06.883 回答
2

这将正常工作

i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY | 
               Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
于 2012-12-11T09:04:13.753 回答
1

我可能无法理解您在问什么,但是当您启动 B 时,您是否希望 A 被杀死?

在 A 中,将其添加到清单中的活动标记中:

android:noHistory=true

这将导致活动在失去焦点后立即从内存中删除。

于 2012-11-01T09:11:08.137 回答
1

我为这些 Intent 标志找到的最佳文档在这里:http ://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/

我不明白您要做什么,但是您尝试过FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET吗?

于 2012-09-29T00:23:26.617 回答
0

我仍然很难理解这个问题,但想帮助你解决它。由于评论只允许 600 个字符并且格式不正确,因此我将创建一个答案,因为我确信我们可以一起解决这个问题。

我希望能够重现您的问题。为此,我创建了 2 个应用程序:AppAAppB。AppA 有一个名为的活动ActivityA,而 AppB 有一个名为 的活动ActivityB。两者ActivityAActivityB使用android:launchMode="singleTask".

ActivityA上面有一个按钮,可以启动 AppB 并完成,如下所示:

    Intent intent = new Intent("de.sharpmind.example.AppB");
    intent.putExtra("extra", "launched from AppA");
    startActivity(intent);
    finish();

ActivityB上面有一个按钮,可以像这样启动 AppA:

    Intent intent = new Intent("de.sharpmind.example.AppA");
    intent.putExtra("extra", "launched from AppB");
    startActivity(intent);

这一切都按我的预期工作。AppA 和 AppB 在不同的任务中运行。onCreate()在每个应用程序的方法中正确地看到了“额外” 。

所以,你能告诉我更多关于你的问题吗?我怎样才能准确地重现您的问题?你写了:

在较低的 API 上,APP-A 中的新任务不会改变,额外的 putExtra 将不起作用。

你是什​​么意思?你在哪里放置额外的东西,你从哪里得到它们,你期望发生什么?

另外,你的是launchMode什么AppB

此外,当您遇到此问题时,AppA 的任务堆栈中是否还有其他活动?

请在您的原始问题或此处作为评论提供更多信息。

于 2012-09-26T14:43:39.457 回答
0

使用FLAG_ACTIVITY_CLEAR_TASK清除后台堆栈。如果我理解正确,这就是你想要的行为。

在你的清单中使用singleInstance而不是会做到这一点。singleTask

在评论中你说它必须是singleTask。我假设这是因为您在某些情况下需要后台堆栈。

由于launchMode无法以编程方式更改并且FLAG_ACTIVITY_CLEAR_TASK不适用于 API <=10,因此您可能必须创建两个相同的活动。

一个与launchMode=singleTask一个与launchMode=singleInstance

从应用程序抽屉启动时,将其添加到使用singleInstance以获得清晰的堆栈:

 <category android:name="android.intent.category.LAUNCHER" />
于 2012-10-22T01:00:46.710 回答