次のように、あるアクティビティを別のアクティビティから終了したい:
アクティビティ[A]で、ボタンをクリックすると、アクティビティ[A]を終了せずにアクティビティ[B]を呼び出しています。
アクティビティ[B]には、2つのボタンNewとModifyがあります。ユーザーが[変更]をクリックすると、すべてのオプションが選択された状態でスタックからアクティビティ[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();
マニフェストファイルでアクティビティAを作成します:launchMode = "singleInstance"
ユーザーが[新規]をクリックしたら、FirstActivity.fa.finish();
を実行し、新しいインテントを呼び出します。
ユーザーが変更をクリックすると、新しいインテントを呼び出すか、単にアクティビティ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
を呼び出す必要があります。
できることですが、通常の活動の流れを壊すべきではないと思います。アクティビティを終了する場合は、アクティビティ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);
私はそれがあなたのために働くことを願っています...
これは、かなり標準的なコミュニケーションの質問です。 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());
そのようなものを試してください。
ケースで使用できるアプローチが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
}
Stack Overflowの質問に対する私の答えFinishすべての以前のアクティビティ を参照してください。
必要なのは、Intent.FLAG_CLEAR_TOP
を追加することです。このフラグは、スタック内のターゲットアクティビティより上のすべてのアクティビティが終了し、そのアクティビティが表示されるようにします。
もう1つ必要なのは、SINGLE_TOP
フラグです。これにより、スタックに既に作成されているアクティビティがある場合、Androidが新しいアクティビティを作成するのを防ぎます。
アクティビティが既に作成されている場合は、これらのフラグを持つインテントがターゲットアクティビティのonNewIntent(intent)
(それを処理するにはオーバーロードする必要があります)というメソッドで配信されることに注意してください。
onNewIntent
には、restartと呼ばれるメソッドまたはfinish()
を呼び出してそれ自体に対して新しいインテントを起動するメソッドがあるか、新しいデータを設定するrepopulate()
メソッドがあります。私は2番目のアプローチを好みます。それはより安価であり、いつでもonCreate
ロジックを、移入のために呼び出すことができる別のメソッドに抽出できます。
リクエストコードでアクティビティを開始します。
StartActivityForResult(intent,1003);
そして、このような他のアクティビティからそれを閉じることができます:
FinishActivity(1003);
私はネプスターのソリューションを適用したばかりで、魅力のように機能します。フラグメントから実行するための小さな変更があります。
あなたの断片へ
// 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);
}
私は最も簡単なアプローチを持っていると思います...
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);
}
私はこれが古い質問であることを知っています、これらの方法のいくつかは私にとってはうまくいきませんでした
onPause
をオーバーライドし、そのメソッド内でfinish()
を呼び出しました。
最初にstartactivity()
を呼び出し、次にfinish()
を使用します