从窗口小部件启动活动时的活动堆栈行为

时间:2015-03-04 12:51:05

标签: android android-intent android-pendingintent android-task

我有两种活动。我们称他们为ActivityAActivityB。 ActivityA在清单文件中标记为singleTask。 我可以使用简单的ActivityB调用(不使用ActivityA标记)从startActivity开始Intent。我也可以从ActivityC开始ActivityA并从中ActivityB开始(也使用"简单" Intents)。

ActivityB有一个执行此代码的按钮:

Intent intent = new Intent(ActivityB.this,
                ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

我还有一个可以使用以下代码启动ActivityA的小部件:

Intent aIntent = new Intent(context, ActivityA.class);
aIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                aIntent, 0);

此外,它还可以从网格项启动ActivityB

Intent bIntent = new Intent(context, ActivityB.class);
PendingIntent bPendingIntent = TaskStackBuilder.create(context)
        .addNextIntent(aIntent).addNextIntent(bIntent )
        .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

如果我从启动器启动ActivityA,请从启动器ActivityB启动ActivityA(或ActivityC - > ActivityB - > ActyvityA) - 我可以移动使用ActivityC中的后退按钮或按钮(如上所述)返回ActivityB(或ActivityA),并且不会重新创建ActivityB。 没关系。

问题在于,如果我从窗口小部件启动ActivityB并使用ActivityA中的后退按钮或按钮(如上所述),则会重新创建ActivityA并成为堆栈中的单个实例。

我希望能够以{{1}}始终是根目录的方式管理这两个活动,如果它已经在运行,则不会重新开始。

1 个答案:

答案 0 :(得分:0)

使用TaskStackBuilder无法真正做到这一点。如果您可以找到确保TaskStackBuilder永远不会启动到任务的方法,那么您可以避免使用ActivityB,除非ActivityA已经存在。这样,当ActivityB返回ActivityA时,ActivityA的实例将无法重新创建。

要解决此问题,您应该启动ActivityB而不是直接从窗口小部件启动ActivityA,并传递额外信息,告诉ActivityA您希望它启动ActivityB }:

Intent bIntent = new Intent(context, ActivityA.class);
bIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
        Intent.FLAG_ACTIVITY_NEW_TASK);
bIntent.putExtra("launchActivityB", true);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            bIntent, 0);

onCreate()的{​​{1}}和onNewIntent()中,检查是否存在附加信息,如果存在,则应立即启动ActivityA