2016-08-24 4 views
0

EDITソリューション:なんらかの理由で、私はアクティビティ2と3をNEW_TASKフラグでも起動しました。APIのNEW_TASKとCLEAR_TASKでスタックをクリアできません15

元の質問: 私は検索し、完全にスタックをバッククリアする方法については、複数の答えを見つけましたが、複数の異なるソリューションを試した後、私はまだ苦労していました。私の問題を明確にするために、私は3つのアクティビティを持っています。アクティビティ1がメインアクティビティで、いつでもアクティビティ2または3のツールバーの上ボタンをクリックしてアクティビティ1に戻ることができます。アクティビティ1で完全にクリアされ、「スクラッチからスタート」します。アクティビティ2は、バックスタックに複数のバージョンを持つこともできます。ですから、例えば:

1> 2> 2> 3(アップボタンをクリックします)1

または

1> 2> 2> 2(アップボタンをクリックします)1

すべての答え基本的に同じことを言っていることがわかりました。これは、アクティビティ1を起動するときにFLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TASKを使用することです。アクティビティを開始した後でfinish()の使用を指摘した人もいます。だから私のコードは次のようになります:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      Intent intent = new Intent(this, MainActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      startActivity(intent); 
      finish(); 
      break; 
     case R.id.action_homepage: 
      openHomepage(); 
      break; 
     default: 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

私は期待どおりのアクティビティ1に戻ります。しかし、戻るボタンをクリックすると、私はアクティビティ2に戻ります。つまり、スタックはクリアされませんでした。

これは、アクティビティ1,2および3がすべて拡張するカスタムBaseActivityで実装されています。ただし、「開始点」であるため、アクティビティ1では上ボタンがオフになっています。また、マニフェストファイルにandroid:launchMode="singleTask"を追加し、CLEAR_TOPフラグを使用してこれらを組み合わせることも試みました。

なぜこれが私にとってうまくいかないのですか?活動2と3には、これが機能するための特定のフラグが必要ですか?

答えて

0

あなたはは、2と3 その後finishAffinityを呼び出して、あなたの活動に方法をOnBackPressedオーバーライドすることができます()すべてのバックスタックをクリアした後、あなたのMainActivityを開始

低いバージョンについて、あなたはbelow-

ように実装できるようにfinishAffinity()メソッドは、API 16に添加した例えば、

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    finishAffinity(); 
    startActivity(new Intent(getActivity(), MainActivity.class)); 
} 

は上記方法のみAPI 16または上に動作しますが

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 
+0

これは**戻るボタン**ではなく**戻るボタン**に適用されます。これをアクティビティ2とアクティビティ3に追加すると、アクティビティ2をブラウズするときに戻ることができません。アクティビティ3からアクティビティ3に戻って2に戻ります。最後に、finishAffinity();を追加します。ホームボタンのonOptionsItemSelectedの 'startActivity()'ビットが違いをもたらさない場合、前と同じ結果が得られます。 – blae

関連する問題