2012-03-14 8 views
5

私は5つのアクティビティを持っています(A,B,C,DEとしましょう)。 アクティビティA〜Dは一部のデータを設定するためのもので、ユーザーは何でも変更することができます。一方アクティビティEは要約であるため、ユーザーはもう戻ることはできません。ナビゲーションの前のアクティビティを完了する

私の考えは、ユーザーがDE

現在、私の活動Aに到達したときに、以前のすべての活動を終了することがあるが、それらに添付何の旗を持っていません。

Intent I = new Intent(this, SomeClass.class);

I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

が、私はそれらのフラグは、私がやろうとしています何を達成することになっていることをどこにでも読んでてきたが、それら:

Activty Eは、このように呼ばれていますユーザーがアクティビティEに移動してBackボタンを押すと、アプリケーションはアクティビティDに戻ります。

アイデア?私は何かを欠いている?これはこの問題を解決する正しい方法ではありませんか?あなたが戻るイベントを取り扱う示すためにActivit EonKeyDown()メソッドをオーバーライドし、KEYCODE_BACK(戻るキー)のキープレスイベントを傍受し、単にreturn trueする必要があなたの助け

答えて

7

活動A、B、C、Dの代わりにstartActivityの各々における方法startActivityForResultを使用します。ユーザーがアクティビティEを終了すると、バックボタンを処理し、結果コードをインテントに設定します。各A、B、C、DクラスのonActivityResultメソッドでこれを処理し、アクティビティを閉じて、前のアクティビティに結果を渡します。

ユーザーはDアクティビティを終了するとすぐに実行することもできます。ユーザーがDからEに移動すると、上記の方法を使用してアクティビティAまで実際に移動し、アクティビティEを開いてアクティビティAを終了できます

上記の両方のケースでは、ユーザーの観点から同じ結果が得られます。中間アクティビティA、B、C、Dは、それらのアクティビティのonStartメソッドで長いジョブを実行していない限り表示されません。

+0

それは簡単に変更でき、うまくいきました、ありがとう! –

0

ため

感謝。これで、ユーザーは前のアクティビティに戻ることはできません。

+0

それはしません。これは実際には、ユーザーがベストプラクティスに反するボタンをもう一度使用する機会を持たないという問題を引き起こしています。あなたが正当な理由がない限り、戻るボタンをブロックしないでください。そして、この場合、ユーザーは戻るボタンをクリックしても終了することができません。 – achie

0

アクティビティEを起動すると、このコードを使用する:

Intent I = new Intent(this, SomeClass.class); 
I.putExtra("finish_all", true); 
I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(I); 
+0

私はそれを試しましたが、何もしていないようです。それはいくつかの組み込みの旗か何かですか? 何らかの方法で治療する必要がありますか? –

3

私はyour'reウィザードのいくつかの並べ替えを書き込もうとし:)

FLAG_ACTIVITY_CLEAR_TOPフラグを使用するためには、現在の活動タスクですでに活動Eを持っている必要があります。

例:E-> A-> B-> C-> D - > DがCLEAR_TOPでEを開始する場合、スタック内にアクティビティEのみがあります。既にスタックに存在すると呼ばれる活動タイプのインスタンスがある場合は活動 を起動するフラグCLEAR_TOPを使用して

FLAG_ACTIVITY_CLEAR_TOP は、このインスタンスではなく、新しいインスタンスを作成するのフォアグラウンドに移動されます。また、そのインスタンスの上にあるスタック内のすべてのアクティビティはスタックからクリアされます。たとえば、現在のアクティビティスタックがABCDEであると仮定すると、タイプCのアクティビティを起動すると、アクティビティDおよびEがタスクからクリアされ、スタックABCになります。

FLAG_ACTIVITY_SINGLE_TOP(あなたのシナリオでは関係ありません) ターゲットアクティビティのインスタンスがスタックの一番上にすでにある場合、新しいインスタンスが作成されません。

+0

あなたの説明は、私がこれらのフラグの実際の使い方を理解するのを助けました。私の場合、Aを呼び出す前にEを呼び出すことは現時点では有効ではありませんでしたが、今後のアプリではこれを覚えています。 ありがとうございます! –

5

誰かが提案@achieコードを必要とするだけの場合には、ここにある:、また

Intent myIntent = new Intent(this, B.class); // Or C/D 
startActivityForResult(myIntent, 1); 

A、B、C、Dの活動は、このような次のアクティビティを開始する必要がありますが、Bは、C、Dの活動をオーバーライドする必要があり:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == 1) { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

を次にE活性がボタンをバック処理する必要があり:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     setResult(RESULT_OK); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

これはあなたのために機能しましたか?上記と同じコードを試してみましたが、最後のアクティビティは前のアクティビティに戻ります。 –

+0

はい、これは私のために働いています。 AはBにナビゲートし、CにナビゲートしてDにナビゲートし、Eにナビゲートしてから戻ると、すべてのアクティビティが終了するためホーム画面に移動します。 Androidプロジェクトのサンプルをアップロードしました:https://anonfiles.com/file/e9a7c889a7b2f358f29c868b7fa1d755 – fernandospr

+0

投稿していただきありがとうございますが、私はすでにそれを動作させることができました。 –

関連する問題