112

次のように、あるアクティビティを別のアクティビティから終了したい。

アクティビティ[A]で、ボタンをクリックすると、アクティビティ[A]を終了せずにアクティビティ[B]を呼び出します。

アクティビティ[B]には、 [新規]と[変更]の2つのボタンがあります。ユーザーが[変更]をクリックすると、すべてのオプションがチェックされた状態でスタックからアクティビティ[A]がポップされます。

ただし、ユーザーがアクティビティ[B]の[新規]ボタンをクリックすると、スタックからアクティビティ[A]を終了し、そのアクティビティ[A]をスタックに再度リロードする必要があります。

試していますが、スタックからアクティビティ[A]を終了できません...どうすればよいですか?

私は次のようにコードを使用しています:

アクティビティ[A]から:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

同じアクティビティの別の方法

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

そして、アクティビティ[B]で、ボタンをクリックします。

setResult(1);
finish();
4

10 に答える 10

193
  1. マニフェストファイルでアクティビティAを作成します。launchMode = "singleInstance"

  2. ユーザーが[新規]をクリックしたら、実行しFirstActivity.fa.finish();て新しいインテントを呼び出します。

  3. ユーザーが[変更]をクリックしたら、新しいインテントを呼び出すか、アクティビティBを終了します。

ファーストウェイ

Activity object最初のアクティビティで、次のように宣言します。

public static Activity fa;
onCreate()
{
    fa = this;
}

次に、そのオブジェクトを別のオブジェクトで使用してActivity、このような最初のアクティビティを終了します。

onCreate()
{
    FirstActivity.fa.finish();
}

セカンドウェイ

FirstActivity先に進むとすぐに終了したいアクティビティを呼び出している間、呼び出し中にフラグを追加できますFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

ただし、このフラグを使用すると、必要がない場合でもアクティビティは終了します。また、onBack表示したい場合は、FirstActivityインテントを使用して呼び出す必要があります。

于 2012-04-30T06:40:37.947 に答える
104

それはできますが、通常の活動の流れを壊すべきではないと思います。アクティビティを終了したい場合は、アクティビティ B からアクティビティ A にブロードキャストを送信するだけです。

アクティビティ B を開始する前にブロードキャスト レシーバーを作成します。

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

アクティビティ A を B から終了したいときに、アクティビティ B からアクティビティ A にブロードキャストを送信します。

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

私はそれがあなたのために働くことを願っています...

于 2012-04-30T06:14:07.660 に答える
20

これはかなり標準的なコミュニケーションの質問です。1つのアプローチは、アクティビティAでResultReceiverを使用することです。

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

次に、アクティビティBでは、次のようにオンデマンドで終了できます。

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

そのようなことを試してください。

于 2012-04-30T06:15:21.657 に答える
12

ケースで使用できるアプローチが1つあります。

ステップ1:アクティビティAからアクティビティBを開始します

startActivity(new Intent(A.this, B.class));

ステップ2:ユーザーが変更ボタンをクリックした場合は、FLAG_ACTIVITY_CLEAR_TOP.Alsoを使用してアクティビティAを開始します。また、フラグを追加で渡します。

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

ステップ3:ユーザーが[追加]ボタンをクリックした場合は、を使用してアクティビティAを開始しますFLAG_ACTIVITY_CLEAR_TOP。また、フラグを追加で渡します。FLAG_ACTIVITY_CLEAR_TOPターゲットまで開いているすべてのアクティビティをクリアし、ターゲットアクティビティで起動モードが定義されていない場合は再起動します

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

ステップ4:onCreate()アクティビティAのメソッドで、そのフラグを取得する必要があります。

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
于 2012-04-30T06:44:18.940 に答える
5

Stack Overflow の質問Finish All previous activitiesに対する私の回答を参照してください。

必要なのは、を追加することIntent.FLAG_CLEAR_TOPです。このフラグは、スタック内のターゲット アクティビティより上のすべてのアクティビティが終了し、そのアクティビティが表示されるようにします。

もう一つ必要なものはSINGLE_TOP旗です。これにより、スタックに既に作成されているアクティビティがある場合、Android が新しいアクティビティを作成するのを防ぎます。

アクティビティが既に作成されている場合、これらのフラグを含むインテントはonNewIntent(intent)、ターゲット アクティビティで呼び出されるメソッドで配信されることに注意してください (それを処理するにはオーバーロードする必要があります)。

次に、 restart と呼ばれるメソッド、またはそれ自体に対して新しいインテントをonNewIntent呼び出して起動するメソッド、または新しいデータを設定するメソッドがあります。私は 2 番目のアプローチを好みます。コストがかからず、いつでも ロジックを別のメソッドに抽出して、移入のために呼び出すことができます。finish()repopulate()onCreate

于 2012-04-30T06:12:58.200 に答える