web-dev-qa-db-ja.com

別のアクティビティからアクティビティを終了する

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

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

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

しかし、ユーザーがアクティビティ[B]からNewボタンをクリックすると、スタックからアクティビティ[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();
91
Kanika
  1. マニフェストファイルでアクティビティAを作成します:launchMode = "singleInstance"

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

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

最初の方法

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

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

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

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

2番目の方法

アクティビティを呼び出している間FirstActivity移動するとすぐに終了します。FirstActivityを呼び出しながらフラグを追加できます

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

ただし、このフラグを使用すると、アクティビティを禁止する場合でも、アクティビティは終了します。 onBackを表示したい場合は、意図的にFirstActivityを呼び出す必要があります。

184
MKJParekh

できることですが、通常の活動の流れを壊すべきではないと思います。アクティビティを終了する場合は、アクティビティ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"));

BからアクティビティAを終了する場合は、アクティビティBからアクティビティAにブロードキャストを送信します

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

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

79
Bharat Sharma

これは、かなり標準的なコミュニケーションの質問です。 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());

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

16
Femi

ケースで使用できるアプローチが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:ユーザーが[追加]ボタンをクリックした場合、FLAG_ACTIVITY_CLEAR_TOP。Alsoを使用してアクティビティAを開始し、フラグを追加で渡します。 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();

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

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
11
Dharmendra

Stack Overflowの質問に対する私の答えFinishすべての以前のアクティビティ を参照してください。

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

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

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

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

5
DArkO

リクエストコードでアクティビティを開始します。

StartActivityForResult(intent,1003);

そして、このような他のアクティビティからそれを閉じることができます:

FinishActivity(1003);
4
yaniv maymon

私はネプスターのソリューションを適用したばかりで、魅力のように機能します。フラグメントから実行するための小さな変更があります。

あなたの断片へ

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

そして、アクティビティのOnNewIntent()に再起動したいです。

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}
4
koras

私は最も簡単なアプローチを持っていると思います...

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

そしてAでそれを取得

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }
2
Xar E Ahmer

私はこれが古い質問であることを知っています、これらの方法のいくつかは私にとってはうまくいきませんでした

onPauseをオーバーライドし、そのメソッド内でfinish()を呼び出しました。

1
Tony Kutzler

最初にstartactivity()を呼び出し、次にfinish()を使用します

0
Dharmik Ghori