新的Intent()用Android启动新的实例:launchMode =“singleTop”
我有活动A
与清单中的android:launchMode="singleTop"
。
如果我去活动B
, C
和D
那里我有菜单快捷方式返回到我的应用程序的根活动( 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%确定“已经有一个在堆栈顶部的活动的现有实例”是什么意思,但也许你的活动不符合这个条件。
singleTask
或singleInstance
会为你工作吗? 或者,也许你可以尝试设置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 )是你开始的目的。