好的,所以我对这件事情感到困惑。所以我有MainActivity,从那里可以启动一个Activity到DegreePlanActivity,从那里可以启动另一个Activity到EditDegreePlan。我在AndroidManifest中将EditDegreePlan设置为noHistory。问题是在他们保存EditDegreePlan后它会向DegreePlan启动一个Activity。因此,如果用户按下Back,则必须按两次才能再次进入MainActivity。我想摆脱它,所以他们只需要按一次。我很难知道如何做到这一点。
如果我将DegreePlanActivity设置为noHistory,那么在EditDegreePlan中他们无法按回到它。
我尝试重写onBackPressed方法并启动对MainActivity的意图。那么问题是他们必须多次按Back才退出应用程序。
我该怎么办?
答案 0 :(得分:120)
FLAG_ACTIVITY_CLEAR_TOP清除您的活动堆栈,您可以使用以下代码:
Intent intent = new Intent(this, Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
请记住,此标志仅清除中间活动,例如,如果您的Back Stack
中有A,B,C,然后使用此标记从C活动转到D,则不会清除Back Stack
和堆栈将是A,B,C,D但是如果你从活动D转到活动A并带有这个标志,B,C,D活动将从堆栈中弹出,你将只有A in后栈。
答案 1 :(得分:11)
API的简单解决方案> = 15到API 23 意图中的用户活动名称。
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
答案 2 :(得分:10)
我建议您在启动EditDegreePlan-Activity时使用startActivityForResult()
,而不是简单startActivity()
,如Android tutorials中所述。
在EditDegreePlan-Activity中,然后调用
setResult(RESULT_OK);
finish();
如果您不希望EditDegreePlan-Activity中有任何数据,那么您不一定要实现onActivityResult
。
答案 3 :(得分:6)
看来,如果您根本没有指定任何标志,您将获得所需的行为。后退按钮会做正确的事情。要在代码中关闭活动,请使用finish()
方法,它与用户按下后退按钮的效果相同。因此,当您完成EditDegreePlan时,您将自动到达DegreePlan,无需调用任何Intents
。
答案 4 :(得分:5)
这是你的流程:
MainActivity - > DegreePlanActivty - > EditDegreePlan - > DegreePlan - > MainActivty
在“DegreePlan”
中覆盖这些方法public void onBackPressed() {
super.onBackPressed();
Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now
startActivity(goToMainActivity);
}
答案 5 :(得分:2)
用它来清除堆栈:
menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
答案 6 :(得分:2)
您可以在开始新活动之前致电完成。这将卸载当前活动,因此当您按下后退按钮然后下一个活动时,第一个活动将不再存在。
memcpy
答案 7 :(得分:0)
您可以按如下所示添加标志并启动Activity,请尝试以下代码
Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);
答案 8 :(得分:0)
要从清单中的后堆栈中删除活动,请在清单文件中的活动中添加android:noHistory="true"
。
请参见下面的示例。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activity"
android:versionCode="1"
android:versionName="1.0">
<application android:name="MyApp" android:label="My Application">
<activity android:name=".LoginActivity"
android:noHistory="true"> //add this line to your activity inside manifest
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
答案 9 :(得分:0)
This code should help you out: It is in Kotlin
private fun verifyIfUserIsLoggedIn(){
val uid = FirebaseAuth.getInstance().uid
if(uid== null){
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
}
答案 10 :(得分:-1)
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);