New Intent()使用Android启动新实例:launchMode=";单顶;
我在清单中有带有android:launchMode=“singleTop”的活动New Intent()使用Android启动新实例:launchMode=";单顶;,android,android-activity,android-intent,Android,Android Activity,Android Intent,我在清单中有带有android:launchMode=“singleTop”的活动A 如果我转到活动B、C和D,我就有菜单快捷方式可以返回到我的应用程序根活动(A) 代码如下所示: Intent myIntent = new Intent(getBaseContext(), MainActivity.class); startActivity(myIntent); 但是,它不是返回到myMainActivity.class的已存在实例A,而是创建一个新实例->它转到onCreate()而不是o
A
如果我转到活动B
、C
和D
,我就有菜单快捷方式可以返回到我的应用程序根活动(A
)
代码如下所示:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
但是,它不是返回到myMainActivity.class的已存在实例A
,而是创建一个新实例->它转到onCreate()
而不是onNewIntent()
这不是预期的行为,对吗?引自:
“标准”和“单顶”模式
在一个方面彼此不同
尊重:每次有新的意图
对于“标准”活动,新的
类的实例被创建为
对这一意图作出反应。每个实例
处理单一意图。同样,一个
“单顶”活动的新实例
也可以创建以处理新的
意图但是,如果目标任务
已具有的现有实例
处于其顶部的活动
堆栈,该实例将接收
新的意图(在onNewIntent()中)
电话);未创建新实例
我不能100%确定“在堆栈顶部已经有一个活动的现有实例”是什么意思,但可能您的活动不符合此条件
singleTask
或singleInstance
是否适合您?或者你可以试着根据你正在创建的意图设置FLAG\u ACTIVITY\u SINGLE\u TOP
,看看这是否会产生影响,尽管我不认为会有影响。这应该可以解决问题
<activity ... android:launchMode="singleTop" />
这正是我所需要的。最终对我起作用的是:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
您可以使用返回到相同的现有活动实例
android:launchMode=“singleInstance”
在舱单上。
当您从B
返回A
时,可能需要finish()
来销毁B
,首先,可以检查堆栈结构。对于启动模式:单顶
如果同一活动的实例已位于任务堆栈顶部,则将重用此实例以响应意图
所有活动都保存在堆栈中(“先进先出”),因此如果当前活动位于堆栈顶部,并且在manifest.file中将其定义为singleTop
android:name=".ActivityA"
android:launchMode="singleTop"
如果您在ActivityA中,则重新创建该活动时将不会进入onCreate,它将恢复onNewIntent(),您可以通过创建通知来查看
不:如果你不实现onNewIntent(意图),你就不会得到新的意图
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);
}
这是因为当您从B、C或D启动原始A活动时,它已被销毁。因此,将调用onCreate而不是onNewIntent()。解决这一问题的一种方法是,在启动新的A之前,始终销毁现有的A(使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK连接,当startActivity时),因此始终会调用onCreate,并通过检查getIntent()是否是您开始时的意图。这意味着当前处于活动状态的任务堆栈(应用程序堆栈)的顶部有一个该活动的实例(例如,一个活动在有焦点时正在启动同一活动的另一个副本)。同一活动的其他实例可能存在于其他任务(应用程序)中。因此,如果我的意愿是在同一进程中启动新的活动实例,但我已经将重点放在该活动的前一个实例上,我将如何做到这一点?我想@rayman使用标准模式?它在文档中说,“每当有一个“标准”活动的新意图时,就会创建一个新的类实例来响应该意图。”您可能会遇到一些与singleTop活动有关的问题。太棒了!谢谢,先生这对我不起作用。:(代码行下面的代码可以正常工作。Intent myIntent=newintent(getBaseContext(),MainActivity.class);myIntent.setFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP);startActivity(myIntent);
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);
}