3つのアクティビティがあります。アクティビティBにつながるアクティビティAは、アクティビティAに戻るか、アクティビティCを開始できます。ただし、アクティビティCを押し戻すと、アプリが閉じます。
総括する:
アクティビティBからCに行くにはどうすればよいですか?現在、このコードは最後の行でNullPointerExceptionを示しています。
Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();
最後の2行を切り替えると、nullポインターも取得されます。
これが機能するかどうかはわかりませんが、試してみてください:
アクティビティAから、startActivityForResult()
を使用して結果のアクティビティBを開始します
アクティビティBで、ユーザーがアクティビティCをトリガーしたら、アクティビティCを開始します。
startActivity()
はすぐに戻るため、
aに終了を通知する結果を設定し、
Bでfinish()
を呼び出します。
AがBからその結果を受け取ると、Aもfinish()
を呼び出します。
それに失敗すると、アクティビティCを独自のアプリにし、2番目のアプリを起動した後、最初のアプリ(AとB)を閉じることができます。
追伸Falmarriのコメントを参考にしてください。
がんばろう。
子アクティビティから親アクティビティを終了する場合、
親アクティビティで、子アクティビティをトリガーしながら、次のコマンドを使用します。
startActivityForResult(intent_name,any_integer_variable);
次の方法でonActivityResultメソッドをオーバーライドします。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==2){
finish();
}
}
さて、子アクティビティで、次の方法でonStopとonDestroyをオーバーライドします。
protected void onStop() {
setResult(2);
super.onStop();
}
@Override
protected void onDestroy() {
setResult(2);
super.onDestroy();
}
子アクティビティで値を2に設定し、親アクティビティで値を確認していることに注意してください。値が設定した値と同じ場合、親アクティビティも終了します。その後、再帰的なアプローチを使用して、さらにアクティビティを実行できます。
親アクティビティでonActivityResultメソッドを使用します
アクティビティAがアクティビティBの親であるとします。アクティビティBの戻るボタンをクリックしてアプリケーションを終了する場合(アクティビティAも終了する場合)
アクティビティBのonStop()
またはonDestroy()
あなたが呼ぶ
setResult(0); //any int number is fine
これにより、親アクティビティに結果コードが渡されます。
親Actvity Aは、呼び出し可能なメソッド内でonActivityResult
メソッドを使用する必要がある結果コードをリッスンします
if(resultCode == 0) //matches the result code passed from B
{
ActivityA.this.finish()
}
わたしにはできる :)
私はこれをしませんでした。これは私があなたのコードを修正する方法です。
別のインテントを入力するために使用するコード:
Intent whatEverIntentName = new Intent("Path.to.next.Intent");
startActivity(whatEverIntentName);
finish();
この方法では、戻るキーを押すと常に終了します。ちょっと待って!バックキーを押したときに反応する方法を変更できます。
これを行う:
@Override
public void onBackPressed() {
super.onBackPressed();
Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
startActivity(whatEverIntentName);
// Don't add finish here.
//This is necessary because you finished your last activity with finish();
}
そのどれも私にとってはうまくいきませんでした。そこで解決策を見つけました。ヘルプには、Intent.FLAG_ACTIVITY_CLEAR_TASKをIntent.FLAG_ACTIVITY_NEW_TASKとともに使用する必要があることが明確にリストされています。だからここに私のために働いたコードがあります。
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
アクティビティ「A」からアクティビティ「B」を開始するには、startActivityForResultメソッドを次のように使用します。
Intent intent2 = new Intent(A.this,B.class);
startActivityForResult(intent2,2);
2の代わりに、任意の数字を使用できます。
次のメソッドを実装して、子アクティビティから結果をキャッチします。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 2) {
finish();
}
}
アクティビティの開始時に使用したものと同じ数字を使用することを忘れないでください。
アクティビティ「B」で次の操作を実行します。アクティビティ「C」を開始するには
Intent intent3 = new Intent(B.this,C.class);
startActivityForResult(intent3,3);
実装方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 3) {
setResult(2);
finish();
}
}
ここでは、結果を2に設定してアクティビティ「A」を終了しています。したがって、アクティビティ「B」はアクティビティ「A」も終了します。
そして、アクティビティ「C」に次の行を追加します。
setResult(3);
アクティビティ「C」が開始するとすぐに、以前のアクティビティは終了します。
そのため、アクティビティ「C」からバッキングすると、実際にはアプリケーションが閉じられます。
これを試して
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
アクティビティAにいて、アクティビティBと呼ばれる別のアクティビティを開始した場合。アクティビティA->アクティビティB
そして今、両方のアクティビティを閉じたいです。
次に、アクティビティBで以下のコードを使用します。
B.this.finish();
そして、アクティビティAでこのコードを使用します。
startActivity(new Intent(A.this, B.class));
finish();
アクティビティBが終了するとすぐに、アクティビティAも終了します。
欠点が1つあります。これが必要かどうかはわかりません。
欠点は、ユーザーがアクティビティBにいて、戻るボタンを押してアクティビティAに移動した場合です。この場合、アクティビティAも終了します。
これは完全に機能しています:
btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
Player.this.finish();
}
});
finishAffinity()
を使用すると、現在のアクティビティの現在のアクティビティとすべての親アクティビティを閉じます。
注:ただし、子アクティビティから親アクティビティへの結果は処理されません。
それが役に立てば幸い !!
アクティビティAから、startActivityForResult(intent、19)を使用して結果のアクティビティBを開始します
アクティビティBで、ユーザーがアクティビティCをトリガーしたら、アクティビティCを開始します。
startActivity()はすぐに戻るため、
aに終了を通知する結果を設定し、
Bでfinish()を呼び出し、子アクティビティのfinish()メソッドの前にsetResult()メソッドを呼び出します。親アクティビティでonActivtyResult(....)メソッドをオーバーライドします。 AがBからその結果を受け取ると、Aも自分自身でfinish()を呼び出します。
enter code here
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
//Added by Ashish to close parent activity
if(arg1==19){
finish();
}
super.onActivityResult(arg0, arg1, arg2);
}
バック画面なしでscreen(C)を起動したいscreen(B)から、この画面(C)を次のように起動します:
screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(screenC);
finish();
ScreenCに戻ると、アプリケーションが終了します。
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
アクティビティCがルートアクティビティになり、プレスバックでアプリが終了します。
back key behavior をオーバーライドできます:
アクティビティAはアクティビティBを開始します
アクティビティBで[戻る]を押すと、Aにつながるはずです
アクティビティBはアクティビティCを開始します
アクティビティCで[戻る]を押すとアプリが終了します
OnBackPressedからsuperを呼び出さないことに注意してください。これにより、Androidのブラウズスタックメカニズムをオーバーライドすることもできます。これは、現時点ではブラウズスタックから最も古い単一のアイテムを簡単な方法でクリアする方法がないように思えるので、大きな利点だと思います。
public class B extends Activity
{
...
@Override
public void onBackPressed()
{
// Start activity A
Intent aIntent = new Intent(this, A);
startActivity(bIntent);
}
...
}
public class C extends Activity
{
...
@Override
public void onBackPressed()
{
// Close
finish();
}
...
}
必要に応じて親アクティビティを明確に終了することもできますが、この方法を使用すると、親アクティビティを心配する必要はありません。
次のコードはあなたのためにそれを行う必要があります。他のほとんどすべてのアプローチでは、アプリは最近のアプリに残ります。 Javadocは、 https://developer.Android.com/reference/Android/app/ActivityManager.AppTask.html#finishAndRemoveTask() にあります。
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
if(am != null) {
List<ActivityManager.AppTask> tasks = am.getAppTasks();
if (tasks != null) {
tasks.get(0).finishAndRemoveTask();
}
}
各アクティビティが次のアクティビティの結果をリッスンし、それが発生した場合は終了します。
特別な結果コードを使用して、アクティビティを終了することを示すことができます。