Android上导航与单顶
我有一个主活动(活动a),它显示一个事件(我的应用程序是关于事件管理的),我需要能够打开另外两个子活动,并且能够再次“向上”导航到它们的父活动(a),如图中所示Android上导航与单顶,android,android-navigation,Android,Android Navigation,我有一个主活动(活动a),它显示一个事件(我的应用程序是关于事件管理的),我需要能够打开另外两个子活动,并且能够再次“向上”导航到它们的父活动(a),如图中所示 open open Activity (A) ----------> SubActivity (B) ----------> SubActivity (C) ^ ^ |
open open
Activity (A) ----------> SubActivity (B) ----------> SubActivity (C)
^ ^ | |
| | | |
| | Up | |
| -------------------------- |
| Up |
-----------------------------------------------------------
因此,我从任何子活动触发此调用:
NavUtils.navigateUpFromSameTask(this);
为了确保不重新加载活动(A),我在其AndroidManifest定义中使用了singleTop
(这样,当返回到它时,它将具有与我留给它的相同状态的相同事件):
但问题在于,有一个新的需求,需要从系统通知中打开活动(a),并使用我要打开的eventId
传递一个额外的值,如果我删除singleTop
配置,它可以正常工作,但是使用它,它给我以前加载的活动实例,甚至没有调用它的onCreate
或其他类似的东西
那么,我应该如何处理活动(A)的子导航及其通知导航?在从系统通知打开时将值传递给活动,并在onCreate中使其有条件。只是一个猜测。您必须扩展活动a,以便它能够从现在的行为以及从通知调用中找到它应该显示的事件。也许您可以解释活动A如何获取有关要显示的事件的信息,然后我们可以帮助您扩展此功能以处理来自通知的调用。通过使用
android:launchMode=“singleTop”
将不会重新创建已存在的活动!生命周期也会发生轻微变化:当您打开一个已经存在的活动,并尝试从通知活动中打开一个“新实例”时,不会再次调用onCreate(Bundle)
。相反,将调用方法Activity.onNewIntent()
。因此,您必须在活动中重写此方法
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Setup your UI Activity, just like you would to in the onCreate() method
}
更新:要以新的意图重新启动活动:
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// pass this extra from the notification only to make a new instance
boolean makeNewInstance = intent.getBooleanExtra("makeNewInstance", false);
if (makeNewInstance) {
finish(); // Finish the current activity
startActivity(intent); // Start new instance by simply using the intent passed as parameter
}
}
我已经在传递一个额外的值,但是当usint
singleTop
它从不重新加载活动时,它只会在加载活动时显示已加载的实例onResume()
;您不能相应地修改您的活动吗?您提出了一个很好的观点,但经过一些尝试后,我发现当从系统通知调用活动(a)时,它会触发onNewIntent()
,但当读取我刚刚传递的额外值时,它会给我旧值,而不是我从通知传递的值!是的,如果调用getIntent(),它将返回初始意图(创建活动的意图)。通知的意图作为参数在onNewIntent()中传递。。。您必须使用onNewIntent()
中的Activity.setIntent()
手动设置它,或者您只需完成当前(已经存在)的活动,然后使用onNewIntent()
传递的意图启动一个新的活动。如果您想在新活动开始时显示Anmiation,这可能很有用。。。否则,setIntent()
应该适合您。我认为完成当前任务并根据传递的意图启动一个新任务是一个好的解决方案(不要陷入布局麻烦),但我如何在onNewIntent()中做到这一点,我刚刚对答案进行了编辑,以确保在从子活动返回时不会重新启动活动,我已经尝试过了&它对我来说工作非常好,非常感谢:),一旦编辑被批准,我将接受答案。
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// pass this extra from the notification only to make a new instance
boolean makeNewInstance = intent.getBooleanExtra("makeNewInstance", false);
if (makeNewInstance) {
finish(); // Finish the current activity
startActivity(intent); // Start new instance by simply using the intent passed as parameter
}
}