我有两种活动。我们称他们为ActivityA
和ActivityB
。 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}}始终是根目录的方式管理这两个活动,如果它已经在运行,则不会重新开始。
答案 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
。