新意图()开始与Android新实例:launchMode =“singleTop”
-
19-09-2019 - |
题
我有活性A
与清单android:launchMode="singleTop"
。
如果我去到活动B
,C
和D
那里我有菜单快捷方式回到我的应用程序根系活力(A
)。
的代码看起来是这样的:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
不过,而不是返回到我A
的已经存在的情况下MainActivity.class
它会创建一个新的实例 - >它去onCreate()
而不是onNewIntent()
这不是预期的行为,是吗?
解决方案
这应该可以解决问题。
<activity ... android:launchMode="singleTop" />
当创建的意图来启动该应用使用:
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);
从文档引用:
“标准”和“singleTop”模式 彼此只是一个不同 尊重:每当有新意图 对于“标准”的活动,新的 类的实例被创建 应对这一意图。每一个实例 处理一个意图。同样, 一个“singleTop”活动的新实例 也可以创建以处理新 意图。然而,如果目标任务 已经拥有的现有实例 在顶部的活动 堆下,该实例将接收 新的意图(在onNewIntent() 呼叫);不创建新实例。
我不是100%肯定什么“已经活动的现有实例在其堆栈的顶部”的意思,但也许你的活动不符合这一条件。
会singleTask
或您singleInstance
工作?或许你可以尝试在您创建,看看是否是有差别的意图设置FLAG_ACTIVITY_SINGLE_TOP
,但我不认为你会的。
可以返回到活动的用相同的现有实例
android:launchMode="singleInstance"
在清单中。
当返回从A
到B
,可能需要finish()
破坏B
。
首先,堆叠结构可以被检查。对于起跑模式:singleTop结果 如果同一活动的实例已经在任务堆栈的顶部,那么这种情况下将被重用向意图做出回应。
所有的活动都保持在堆栈(“先进后出的第一”),所以如果您当前的活动是在堆栈的顶部,如果你在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);
}
这是因为原来的A活性已经由从B,C或D.启动它因此时间销毁,的onCreate将在onNewIntent代替)称为(。解决的方法之一是始终破坏现有的A |开始一个新的A,这样的onCreate总会被调用之前(使用FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_NEW_TASK一起时startActivity),并且您可以通过检查把onNewIntent()进入的onCreate的代码,如果getIntent( )是你开始的意图。