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


101

次のような別のアクティビティから1つのアクティビティを終了したい:

アクティビティ[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();

ねえ、あなたは別の権利からある活動を終えたいと思っていました...それから私は正しい答えを投稿しました。しかし、なぜそれを否決したのですか?
Manjunath 2012

ここではいくつかの素敵な答えを持つスレッドがあります: stackoverflow.com/questions/14355731/...
AB

回答:


189
  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インテントを使用して呼び出す必要があります。


6
素晴らしい答え.. !!
Vaibhav Vajani 2012

93
アクティビティへの静的参照を保持しています。どこかから手動でクリアしない限り、これは消えません->メモリリークが発生しています!
DArkO 2012

5
まあそれは大丈夫です、あなたはすぐに使える思考のための私の+1を持っています:D、私はただsingleTopに変更します。ただし、同様のことをするときは、それが私の最初の選択肢にはなりません。コードをクリーンアップすることで、静的参照を取り除く方法を意図したので、メモリリークはありませんが、それはアプリの構造に依存します。
DArkO 2012

6
誰も最初のソリューションを使用しないでください、それは完全に間違っています。あなたはゾンビオブジェクトを作成している間、本当にハックな方法でAndroidフレームワークをバイパスしています。BroadcastReceiverを使用します。
S-K

1
素晴らしいソリューション。アクティビティA-> B-> Cから行ってCのonBackPressedで行っていた問題に対して非常にうまく機能しましたが、Bの新しいインスタンスを起動していました。しかし、Bの新しいインスタンスでonBackPressedを実行した場合、 Aの古いインスタンスではなくBの古いインスタンスに移動します(私が欲しかったもの)。だから私はCのonBackPressedであなたの最初のメソッドを実行し、それは私が望んだ動作を私に与えました:)ありがとうトン:)
SoulRayder

87

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

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


「registerReceiver(broadcast_reciever、new IntentFilter( "finish_activity"));」にこのエラー「トークンの構文エラー、代わりにAnnotationNameが必要です」が表示されます。どうしましたか?
Behzad 2012年

2
「通常の活動の流れを壊してはならない」+1これ
S-K

11
登録broadcast_receiverを忘れずにunregisterReceiver()
Jaec


これが解決策です。いいね
パリンダラージャパクシャ

17

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

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


6
+1だけ、((ResultReceiver)getIntent()。getParcelableExtra( "finisher"))。send(1、new Bundle());
Hamidreza Sadegh

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:ユーザーが[追加]ボタンをクリックした場合、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();

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

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

6

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

StartActivityForResult(intent,1234);

そして、あなたはこのような他の活動からそれを閉じることができます:

finishActivity(1234);

どの言語で?
Morten Holmgaard

5

参照してくださいスタックオーバーフローの質問に対する私の答え完了までのすべての活動を

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

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

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

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


4

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

あなたのフラグメントへ

// 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);
}

2

私はBで新しいものを押すのが最も簡単なアプローチだと思います...

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);
    }

1

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

私はオーバーライドしonPausefinish()そのメソッド内で呼び出しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.