6

作業中のAndroidアプリで小さな問題が発生しました:

A、B、Cの3つのアクティビティがあり、呼び出しは次の順序で行われます:A-> B->C。Cで、戻るボタンを押すと、デフォルトではBではなくAに戻るはずです。 ]。そして、AでBACKを押すと、プログラムが終了します。

インテントをCからAに呼び出そうとしましたが、この場合、新しいアクティビティがスタックの一番上にプッシュされるため、呼び出しの呼び出しはループに入ります:A-> B->C->A。その結果、AでBACKを押すと、[Aが開始]を終了する代わりに、C、B、Aの順に不必要な円で戻ります。

誰かがこのループのシナリオに対処するためのより良い方法を与えることができれば素晴らしいでしょう!

4

8 に答える 8

21

とてもシンプル!アクティビティCを開始するときは、BからB.finish()を使用します。このようなもの。

Intent i = new Intent(B.this, C.class);
B.this.finish();
startActivity(i);

これにより、スタックからBが削除されます。

于 2012-04-18T04:53:57.853 に答える
12

おそらく遅いですが、検索でこれを見つける可能性がある人のために:あなたは追加することができます

        android:noHistory="true"

AndroidManifestのアクティビティBに移動します。これにより、Cが結果を返すときにアクティビティBでonActivityResult()メソッドが呼び出されることも回避されます。基本的に、Cを開始するとすぐにBが消えるのは好きではありません。

于 2012-11-22T12:24:59.947 に答える
2

このようなBアクティビティのフラグを設定します

private boolean mDestroyActivity = false;

startActivity Cを呼び出すときに、そのフラグをtrueに設定します。

アクティビティBのonStopメソッドの場合、次のようなチェックを追加します。

if (mDestroyActivity) finish();

次に、Cで戻るボタンを押すと、Aに戻ります。

于 2012-04-18T04:49:08.317 に答える
1

アクティビティCはstartActivityForResult()onActivityResult()アクティビティBで開始できます。

アクティビティCを開始するには、

Intent intent = new Intent(ActivityB.this, ActivityC.class);
startActivityForResult(intent, 123);

アクティビティBでオーバーライドします

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == 123){
            if(resultCode == Activity.RESULT_OK){
                finish();
            }
        }
    }

そして、アクティビティCの内部ではsetResult(Activity.RESULT_OK)以前に使用しますfinish();

アップデート:

もう1つの方法は、アクティビティCからアクティビティAを使用FLAG_ACTIVITY_NEW_TASKして開始することです。FLAG_ACTIVITY_CLEAR_TOP

Intent intent = new Intent(ActivitC.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

もう1つの方法はfinish()、アクティビティCを開始するときにアクティビティBだけにすることができます。したがって、アクティビティCをもう一度押すと、アクティビティBがすでに終了しているため、アクティビティAに直接移動します。

于 2012-04-18T04:49:34.457 に答える
1

新しいアクティビティを開始する前に、このフラグを設定してください

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

于 2012-04-18T04:55:30.037 に答える
1

マニフェストファイルで、値の下のアクティビティタグに記載されています

android:noHistory = "true"

その後、アクティビティをスキップします

于 2018-07-20T10:38:53.463 に答える
0

通常の流れを壊してはいけないと思います。Cは最初にBに戻り、次にAに戻る必要があります。

とにかく私はあなたの問題の解決策を持っています。ブロードキャストレシーバーをAアクティビティに登録し、CからAにブロードキャストを送信します。Aアクティビティでは、そのブロードキャストを受信して​​からスタックをクリアできます。これにより、すべての子アクティビティが自動的に終了します。

onbackpressをオーバーライドし、onbackpressでスーパーを呼び出さないでください。代わりにアクティビティAにブロードキャストを送信してください。

于 2012-04-18T05:03:36.627 に答える
0
  • アクティビティB:

    public static boolean mDestroyActivity = false; @Override protected void onResume(){super.onResume(); / ***アクティビティC->A(アクティビティBをスキップ)から戻ったときに終了します* / Log.i( "FINISH"、 "=" + mDestroyActivity); if(mDestroyActivity){mDestroyActivity = false; 終了(); }}

  • アクティビティC:

    B.mDestroyActivity = true;

于 2019-03-09T09:06:34.127 に答える