2017-05-23 6 views
-1

アクティビティAがBに続いてC、D、Fに進み、FIで終了したら、Bに再びジャンプしたいが、すべてのアクティビティC、D、およびFは歴史から削除する必要がありますが、BからAに戻ることは可能ですが、これを行う方法はありますか?ありがとう!!スタックからアクティビティの範囲を削除する

+0

ロジックを理解しようとすると、すべてのアクティビティに対してシングルトンオブジェクトが作成されます。このアクティビティFでアクティビティFで使用されているオブジェクトを使用して、A-Fの間に完了したアクティビティを終了することができます。 – Vasant

+0

なぜフラグメントを使用しないのですか? – xbadal

答えて

0

あなたは、活動F(または他のイベント)での戻るボタンを押すイベントをインターセプトし、提案xbadalは正しい考えであるとしてフラグを追加するバックアクティビティBへ

@override 
public void onBackPressed(){ 
    // Do what you need done here 
    Intent intent = new Intent(this, ActivityB.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    // if you need to pass data back to ActivityB 
    //intent.putExtra("tagName", yourData); 
    startActivity(intent); 
    this.finish(); 
} 

を取得するためにintentを使用することができますAndroidのドキュメントによれば、FLAG_ACTIVITY_CLEAR_TOPを使用する必要があるようです。 Androidのドキュメントから

設定、およびアクティビティが起動され、既に他の活動のすべての上に、そして、 現在のタスクで実行中の代わりに、その 活動の新しいインスタンスを起動している場合それが閉鎖され、 このインテントは新しいインテントとして という古いアクティビティに配信されます。例えば

、活動からなるタスクを考慮する:A、B、C、D Dは活性Bの 成分に解決を意図してstartActivity()を呼び出す場合、C及びDは、完成したであろうA、Bの

https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

他のフラグがあなたに確認する必要がありintentを呼び出す時に設定されているかに応じて:とBは今いるスタックで、その結果、与えられたテント を受け取りますどのフラグが既に含まれているかは、getFlags()と矛盾するものをremoveFlags(int)で削除します。

+0

mmしかしこれだけでFは破壊されますが、CとDはまだ履歴スタックに残っていますが、私はFを残すときにどうすればこれらの2つを削除できますか? – goseta

+0

他のアクティビティを破壊する必要がある場合は、個々のアクティビティで 'this.finished();'を呼び出すことができます。あなたのコードとコードの意図についてもっと知ることなく、私は本当に多くの情報を与えることはできません。 – Barns

+0

ユーザーがアクティビティBに戻ると、戻るボタンを押すと、「F」と「B」の間のアクティビティの1つに戻ってくることに気づいていますか? – Barns

0

これを行う直接的な方法はありません。ちょうど代替、あなたは目的を調査するために次のコードを使用することができます。

navigateToBFのonBackPressedメソッドで使用してください。

注:すべての活動を開始します。アイデアを得るには、アクティビティコードBFをご覧ください。すべてのアクティビティfinishを除くおよび

A.java

public class A { 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(data != null && data.getBooleanExtra("shouldClose", false)) { 
      finish(); 
     } 
    } 
} 

B.java

public class B { 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(data != null && data.getBooleanExtra("shouldClose", false)) { 
      Intent i = new Intent(); 
      i.putExtra("shouldClose", false); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
    } 
} 

C.java

public class C { 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(data != null && data.getBooleanExtra("shouldClose", false)) { 
      Intent i = new Intent(); 
      i.putExtra("shouldClose", true); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
    } 
} 

D.Javaの

public class D { 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(data != null && data.getBooleanExtra("shouldClose", false)) { 
      Intent i = new Intent(); 
      i.putExtra("shouldClose", true); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
    } 
} 

F.javaは

public class F { 

    public void navigateToB() { 
     Intent i = new Intent(); 
     i.putExtra("shouldClose", true); 
     setResult(RESULT_OK, i); 
     finish(); 
    } 

    @Override 
    public void onBackPressed() { 
     navigateToB(); 
    } 
} 
+0

しかし、これはBの新しいインスタンスを作成しますか? – xbadal

+0

ここでfinish()を呼び出しています。しかし、もし私たちがE-Dから移動したいのであればどうですか? – xbadal

+0

Cを起動している間に終了しない場合は、いいえ。アクティビティを開始している間にfinishを使用しないでください。 ' – Pehlaj

0

これを試してみてください。これで以前のスタックがすべてクリアされ、新しいアクティビティが開始されます。

Intent intent= new Intent(F.this, B.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
    startActivity(intent); 
    ActivityCompat.finishAffinity(this) 
関連する問題