Android从后台删除活动

时间:2013-01-01 16:46:16

标签: android stack

好的,所以我对这件事情感到困惑。所以我有MainActivity,从那里可以启动一个Activity到DegreePlanActivity,从那里可以启动另一个Activity到EditDegreePlan。我在AndroidManifest中将EditDegreePlan设置为noHistory。问题是在他们保存EditDegreePlan后它会向DegreePlan启动一个Activity。因此,如果用户按下Back,则必须按两次才能再次进入MainActivity。我想摆脱它,所以他们只需要按一次。我很难知道如何做到这一点。

如果我将DegreePlanActivity设置为noHistory,那么在EditDegreePlan中他们无法按回到它。

我尝试重写onBackPressed方法并启动对MainActivity的意图。那么问题是他们必须多次按Back才退出应用程序。

我该怎么办?

11 个答案:

答案 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);