[英]Bring activity front if it is running or create new one with backpress
让我详细解释一下; 我有通知,此通知会打开两个案例的B activity
。
案例:
情况1
我点击通知,它用case-1
打开B activity
。 当我press back
我想要去A activity
并杀死B activity
。 我不再需要B activity
了。 一切都很简单,不用flags
。 当我在B activity
并从这里按两次后,它会进入A activity
,然后关闭app
。 我的麻烦在于,如果我从手机的导航按钮打开app
(不记得这个按钮的名称)应用程序是从B activity
打开的。 那不是我的预期。 我想打开A activity
。 不想再看B activity
了。
案例2
我点击通知,它用case-2
打开B activity
。当我press back
我想把A activity
带到前面,而不创建任何新的东西。 如果我按回B activity
,两次并关闭应用程序,然后再次从手机的导航按钮重新打开应用程序,想要从A activity
打开应用程序。
那么我怎样才能正确地做到这一点,我试图使用flags
(我已经阅读过文档)但是无法正常工作。 什么flags
,当我打开我应该使用B activity
和onBackPress
的方法B activity
去A activity
,我想
这应该可以通过添加来实现
android:launchMode="singleTask"
对于Manifest中的A活动,那么你可以在B活动onBackPressed上打开一个活动,你将在堆栈中只有一次A.
如果它不按你想要的方式工作,你可以创建一个扩展Activity并在静态对象中处理堆栈的抽象类,然后A&B必须扩展这个新类
试试这个
Intent intent = new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
试试这个
android:launchMode="singleTask" in android manifest file
您可以通过添加FLAG_ACTIVITY_REORDER_TO_FRONT来实现此目的
Intent i = new Intent(context, Activity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
你可以试试这个isTaskRoot()这将返回B是root
如果确实如此,则启动A.
另外,你可以完成B
B活动
@Override
public void onBackPressed() {
if (isTaskRoot()) {
//call A which is not exist
Intent i =new Intent(B.this,A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}else {
//Finish B if A Already Exixt
finish();
}
}
您可以在通知单击上调用B活动
如果A存在,那么你可以完成B,否则你可以启动A.
如果设置了FLAG_ACTIVITY_CLEAR_TOP,则正在启动的活动已经在当前任务中运行,那么将不会启动该活动的新实例,而是关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图。
把它放在ActivityB onBackPressed中:
Intent i = new Intent(ActivityB.this , ActivityA.calss);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
finish();
finish();
在ActivityB BackPressed方法上,在ActivityA打开后使ActivityB完成。 因此,在打开ActivtyA后,ActivityB将关闭。
有了这个组合标志,它会做你想要的。 它将关闭堆栈中的所有活动,并保持目标活动。 如果存在活动实例,它将使用它并调用OnNewInstance
,如果不存在,它将创建新的活动。
如果这是使用的活动B的唯一实例,则可以将标志noHistory添加到活动B的清单中
android:noHistory="true"
这将停止将活动B添加到后台堆栈,这也可以通过在调用活动B时使用Intent Flag FLAG_ACTIVITY_NO_HISTORY来动态实现。
至于在活动B被杀死时启动活动A @Quentin Menini的答案是,如果您希望访问活动A,或者意图标记Intent.FLAG_ACTIVITY_REORDER_TO_FRONT为@,那么在清单中设置单个任务活动将会起作用。 Naimish Vinchhi建议,在这种情况下会产生预期的效果。
https://developer.android.com/reference/android/content/Intent.html链接以查看所有可能的Intent标志
所有可能的清单活动选项的https://developer.android.com/guide/topics/manifest/activity-element.html链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.