web-dev-qa-db-ja.com

Androidバックスタックからアクティビティを削除

わかりましたので、私はこれで何をすべきかに困惑しています。 MainActivityがあるので、そこからアクティビティをDegreePlanActivityに起動し、そこから別のアクティビティをEditDegreePlanに起動できます。 AndroidManifestでEditDegreePlanをnoHistoryに設定しました。問題は、EditDegreePlanを保存した後、DegreePlanにアクティビティを起動することです。そのため、ユーザーが[戻る]を押すと、もう一度MainActivityに到達するために2回押す必要があります。私はそれを取り除きたいので、彼らはそれを一度押すだけです。しかし、これを行う方法に困惑しています。

DegreePlanActivityをnoHistoryに設定すると、EditDegreePlanで[戻る]を押すことができませんでした。

OnBackPressedメソッドをオーバーライドして、MainActivityのインテントを起動しようとしました。問題は、アプリを終了するために戻るボタンを複数回押す必要があることです。

私は何をすべきか?

63
Emrys90

FLAG_ACTIVITY_CLEAR_TOP はアクティビティスタックをクリアします。以下のコードを使用できます。

Intent intent = new Intent(this, Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

このフラグは中間アクティビティのみをクリアすることに注意してください。たとえば、Back Stackその後、このフラグを使用してCアクティビティからDに移動するthisdos notclear Back StackおよびスタックはA、B、C、Dになりますが、このフラグを使用してアクティビティDからアクティビティAに移動すると、B、C、Dアクティビティがスタックからポップアップし、バックスタックにAだけが表示されます。 。

125
Arash GM

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);
11
Kamal Bunkar

Androidチュートリアル で説明されているように、EditDegreePlan-Activityを起動するときに、単にstartActivityForResult()の代わりにstartActivity()を使用することをお勧めします。

EditDegreePlan-Activityで、次に呼び出します

setResult(RESULT_OK);
finish();

EditDegreePlan-Activityからのデータを期待しない場合、onActivityResultを必ずしも実装する必要はありません。

10
Soana

フラグをまったく指定しないと、目的の動作が得られるようです。戻るボタンは正しいことをするだけです。コード内からアクティビティを閉じるには、finish()メソッドを使用します。これは、ユーザーが[戻る]ボタンを押した場合と同じ効果があります。したがって、EditDegreePlanを終了すると、DegreePlanに自動的に到着します。Intentsを呼び出す必要もありません。

6
Henry

フローは次のとおりです。

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
Vikalp Patel

新しいアクティビティを開始する前に、finishを呼び出すことができます。これにより、現在のアクティビティがアンロードされるため、次のアクティビティで戻るボタンを押すと、最初のアクティビティはもう存在しなくなります。

Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();  
startActivity(i);
2
live-love

これを使用してスタックをクリアします。

 menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2
Heena Arora

マニフェスト内のバックスタックからアクティビティを削除するには、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>
1
Isaac Sekamatte
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

startActivity(intent);
0
Luis Muñoz

次のようにフラグを追加してアクティビティを開始し、以下のコードを試してください

Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);
0
Rachit Mishra