我在清单中有A
的活动android:launchMode="singleTop"
。
如果我转到活动B
,C
和D
,我会有菜单快捷方式返回我的应用程序根活动(A
)。
代码如下所示:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
但是,不是返回我A
的现有实例MainActivity.class
,而是创建新实例 - >它转到onCreate()
而不是onNewIntent()
。
这不是预期的行为,对吧?
答案 0 :(得分:68)
这应该可以解决问题。
<activity ... android:launchMode="singleTop" />
当您创建启动应用程序的意图时使用:
Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
这应该是需要的。
答案 1 :(得分:29)
最终对我有用的是:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
答案 2 :(得分:14)
“标准”和“单击”模式 只有一个彼此不同 尊重:每次有新的意图 对于“标准”活动,新的 创建类的实例 回应这个意图。每个实例 处理单一意图。同样,a “singleTop”活动的新实例 也可以创建来处理新的 意图。但是,如果是目标任务 已经有一个现有的实例 它顶部的活动 堆栈,该实例将收到 新意图(在onNewIntent()中 呼叫);没有创建新实例。
我不是百分之百确定“已经在其堆栈顶部存在活动的现有实例”意味着,但也许您的活动不符合这一条件。
singleTask
或singleInstance
会为您效劳吗?或者也许您可以尝试在创建的意图上设置FLAG_ACTIVITY_SINGLE_TOP
,看看是否会产生影响,尽管我认为不会。但
答案 3 :(得分:6)
您可以返回相同的现有Activity实例
android:launchMode="singleInstance"
。
当您从A
返回B
时,可能需要finish()
来销毁B
。
答案 4 :(得分:1)
首先,可以检查堆栈结构。对于发射模式:singleTop
如果相同活动的实例已经位于任务堆栈的顶部,则将重用此实例以响应意图。
所有活动都保存在堆栈中(“倒数第一个”),所以如果您当前的活动位于堆栈顶部,并且您在manifest.file中将其定义为singleTop
android:name=".ActivityA"
android:launchMode="singleTop"
如果您在ActivityA中重新创建它将不会进入的活动onCreate将继续onNewIntent(),您可以通过创建通知来查看 不是:如果你没有实现onNewIntent(Intent),你就不会有新的意图。
Intent activityMain = new Intent(ActivityA.this,
ActivityA.class);
activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(activityMain);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
notify("onNewIntent");
}
private void notify(String methodName) {
String name = this.getClass().getName();
String[] strings = name.split("\\.");
Notification noti = new Notification.Builder(this)
.setContentTitle(methodName + "" + strings[strings.length - 1])
.setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
.setContentText(name).build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify((int) System.currentTimeMillis(), noti);
}
答案 5 :(得分:0)
这是因为原始A活动在从B,C或D开始时已被破坏。因此,将调用onCreate而不是onNewIntent()。解决此问题的一种方法是在开始新A之前始终销毁现有的A(在startActivity时使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK连接),因此将始终调用onCreate,并通过检查getIntent(将onInwIntent()的代码放入onCreate中( )是你开始的意图。