【问题标题】:Alternative to Intent.FLAG_ACTIVITY_CLEAR_TASKIntent.FLAG_ACTIVITY_CLEAR_TASK 的替代方案
【发布时间】:2012-06-19 09:37:17
【问题描述】:

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

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

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

谢谢

杰森

【问题讨论】:

  • 如果已经存在则不清除堆栈.....
  • 您真的是指 2 个不同的应用程序吗?还是您在谈论同一应用程序中的 2 个活动?发布清单的相关部分,我们可以为您提供更多帮助。
  • 是的,有两个不同的应用程序,一个正在启动的是 SingleTask,它必须是,但不是为了这部分功能。
  • 对不起,我还是不明白你在做什么。你说'正在启动的是singleTask'。那是app-A还是app-B?您是否要从中创建 2 个单独的任务?你没有提供足够的信息。请更详细地解释您要完成的工作。也许有更好/不同的方法来获得相同的结果。
  • app-A 是正在启动的。任何时候都不会只有一项任务。

标签: java android android-intent


【解决方案1】:

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

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

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

【讨论】:

  • 希望这是真的,但是:“只有在支持 API 11 或更高版本的设备上才会遵守此标志。” From the docs
  • @kabuko 我完全忽略了这一点。但那有什么意义!我想我们不用做 if(api>x) 但仍然不是很有帮助。
【解决方案2】:

这将正常工作

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我可能理解错了你在问什么,但是当你启动 B 时,你希望 A 被杀死吗?

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

      android:noHistory=true
      

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

      【讨论】:

        【解决方案5】:

        我仍然无法理解该问题,但希望能帮助您解决问题。由于 cmets 只允许 600 个字符并且格式不正确,因此我将创建一个答案,因为我确信我们可以一起解决这个问题。

        我希望能够重现您的问题。为此,我创建了 2 个应用程序:AppA 和 AppB。 AppA 有一个名为ActivityA 的活动,而AppB 有一个名为ActivityB 的活动。 ActivityA 和 ActivityB 都使用 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 将不起作用。

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

        另外,你的AppB 的launchMode 是什么?

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

        请在您的原始问题中或此处以 cmets 的形式提供更多信息。

        【讨论】:

          【解决方案6】:

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

          在清单中使用 singleInstance 而不是 singleTask 可以做到这一点。

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

          由于launchMode 不能以编程方式更改并且FLAG_ACTIVITY_CLEAR_TASK 不适用于API

          一个是launchMode=singleTask,一个是launchMode=singleInstance。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-13
            • 2015-03-03
            • 2015-09-25
            • 2019-12-16
            • 2011-06-20
            • 2015-11-03
            • 2014-04-03
            • 2011-12-13
            相关资源
            最近更新 更多