新的Intent()用Android启动新的实例:launchMode =“singleTop”

我有活动A与清单中的android:launchMode="singleTop"

如果我去活动BCD那里我有菜单快捷方式返回到我的应用程序的根活动( A )。

代码如下所示:

 Intent myIntent = new Intent(getBaseContext(), MainActivity.class); startActivity(myIntent); 

但是,不是返回到我的MainActivity.class的已经存在的实例A ,而是创build一个新的实例 – >它去onCreate()而不是onNewIntent()

这不是预期的行为,对吧?

这应该做的伎俩。

 <activity ... android:launchMode="singleTop" /> 

当你创build一个意图启动应用程序使用:

 Intent intent= new Intent(context, YourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

这是应该需要的。

实际上到底为我工作的是这样的:

 Intent myIntent = new Intent(getBaseContext(), MainActivity.class); myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(myIntent); 

从文档引用:

“standard”和“singleTop”模式在一个方面有所不同:每当“标准”活动有新的意图时,都会创build一个类的新实例来响应该意图。 每个实例处理一个意图。 同样,也可以创build一个“singleTop”活动的新实例来处理新的意图。 但是, 如果目标任务已经在其堆栈顶部存在一个活动的现有实例,那么该实例将接收新的目标(在onNewIntent()调用中)。 一个新的实例不会被创build。

我不是100%确定“已经有一个在堆栈顶部的活动的现有实例”是什么意思,但也许你的活动不符合这个条件。

singleTasksingleInstance会为你工作吗? 或者,也许你可以尝试设置FLAG_ACTIVITY_SINGLE_TOP你正在创build的意图,看看是否FLAG_ACTIVITY_SINGLE_TOP ,但我不认为它会。

您可以使用android:launchMode="singleInstance"返回到Activity的相同现有实例

在清单中。 当你从B返回到A时,可能需要finish()来销毁B

首先,可以检查堆栈结构。 对于启动模式:singleTop
如果同一活动的一个实例已经在任务栈的顶部,那么这个实例将被重用来响应这个意图。

所有的活动都保存在堆栈中(“先进后出”),所以如果你当前的活动在堆栈顶部,并且如果你在manifest.file中定义它作为singleTop

 android:name=".ActivityA" android:launchMode="singleTop" 

如果你在ActivityA重新创build活动,它不会进入onCreate将恢复onNewIntent(),你可以看到通过创build一个通知不:你没有实现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(在startActivity中使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK连接),所以总是调用onCreate,并且通过检查getIntent()是否将onNewIntent()的代码放入onCreate )是你开始的目的。