替代Intent.FLAG_ACTIVITY_CLEAR_TASK

时间:2012-06-19 09:37:18

标签: java android android-intent

我有两个应用程序App-B推出App-A。如果用户从App A内部启动App B,我在App-A上调用完成,所以我没有问题。

如果用户从应用程序抽屉直接进入应用程序B或长按主页按钮,则执行下面的操作,在应用所有附加内容之前先清除App 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);

谢谢

杰森

6 个答案:

答案 0 :(得分:14)

新的IntentCompat应该对此有所帮助,但显然该API会在低于11的情况下被忽略。

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

答案 1 :(得分:2)

这将正常工作

i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY | 
               Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

答案 2 :(得分:1)

我发现这些Intent标志的最佳文档是:http://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/

我不明白你想做什么,但你试过FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET吗?

答案 3 :(得分:1)

我理解你在问什么可能是错的,但是当你发布B时,你想要A被杀?

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

android:noHistory=true

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

答案 4 :(得分:0)

我仍然在理解问题方面遇到很多麻烦,但我想帮助您解决问题。由于评论只允许600个字符并且格式不好,我将创建一个答案,因为我确信我们可以一起解决这个问题。

我希望能够重现您的问题。为此,我创建了2个应用程序: AppA AppB 。 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的{​​{1}}是什么?

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

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

答案 5 :(得分:0)

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

在清单中使用singleInstance代替singleTask即可。

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

由于launchMode无法在programaticaly中更改,FLAG_ACTIVITY_CLEAR_TASK无法用于API< = 10,因此您可能需要创建两个相同的活动。

一个launchMode=singleTask,一个launchMode=singleInstance

将此添加到使用singleInstance的那个,以便在从应用抽屉启动时获得清晰的堆栈:

 <category android:name="android.intent.category.LAUNCHER" />