2017-05-26 6 views
1

あるアクティビティから複数のアクティビティを特定の順序で呼び出す方法を説明できますか?Android:特定の順序で複数のアクティビティを連続して呼び出す

実際には、最初のサブアクティビティ(該当する条件が真である場合)を呼び出し、終了するのを待ってから2番目のサブアクティビティを呼び出します(条件付きでも可能です)。に。最後に、アプリは別のアクティビティに移動し、サブアクティビティが呼び出されたアクティビティを閉じる必要があります。

問題は、アプリケーションが一度にすべてのインテントを実行し、最後に呼び出されるはずのアクティビティが最初に画面に表示されることです。ここで

はコードです:私が欲しいもの

@Override 
    public void onResume() 
    { 
     super.onResume(); 

     if(allocated) 
     { 
      super.onResume(); 
      if (warEvent) 
      { 
       Intent intent = new Intent(this, War.class); 
       warEvent = false; 
       startActivity(intent); 
      } 

      if (annexEvent) 
      { 
       Intent intent = new Intent(this, Annexation.class); 
       annexEvent = false; 
       startActivity(intent); 
      } 

      if (heirEvent) 
      { 
       Intent intent = new Intent(this, Dynasty.class); 
       heirEvent = false; 
       startActivity(intent); 
      } 

      if (diseaseEvent) 
      { 
       Intent intent = new Intent(this, Disease.class); 
       diseaseEvent = false; 
       startActivity(intent); 
      } 

      if (corruptEvent) 
      { 
       Intent intent = new Intent(this, Corruption.class); 
       corruptEvent = false; 
       startActivity(intent); 

      } 

      if (catchEvent) 
      { 
       Intent intent = new Intent(this, CatchCorrupt.class); 
       catchEvent = false; 
       startActivity(intent); 
      } 

      Intent intent = new Intent(this, Coliseum.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent); 
     } 
    } 

はように、戦争を呼び出すメインの活動に戻り、その後、併合を呼び出し、およびすることであり、コロシアムは最後に呼び出されなければなりません。何らかの理由で、メインアクティビティのonPause()が呼び出されず、すべてのインテントが一度に実行されるため、Warの代わりにColiseumが最初に呼び出されます。あなたのシナリオの

+0

[Fragments](https://developer.android.com/guide/components/fragments.html)を使ってみませんか? –

+0

'startActivityForResult'を使い、if-elseを実行すると、一度に1つのアクティビティだけを開始できますか? – nasch

答えて

0

startActivityForResultフレームワークを使用してこれを行うことができます。最初のキーを宣言:

public static final String KEY_LAST_STARTED_ACTIVITY = "last-started-activty"; 

はその後onResume()Activityを開始するための最も理想的な場所であれば(再考Activityあなたの最初を開始します。それは)より頻繁にあなたが思うだろうよりも呼ばれ、そのためのためのドキュメントを読まれる:

あなた War活動で
@Override 
    public void onResume() 
    { 
     super.onResume(); 

     if(allocated) 
     { 
      if (warEvent) 
      { 
       Intent intent = new Intent(this, War.class); 
       warEvent = false; 
       startActivityForResult(intent); 
      } 
     } 
    } 
} 

setResult()メインActivityにあなたが開始された最後Activityあった把握できるように、そして次の起動するかを決定します、あなたのメインActivityさんonActivityResult()

Intent intent = new Intent(); 
intent.putString(MainActivity.KEY_LAST_STARTED_ACTIVITY, War.class.getSimpleName(); 
setResult(RESULT_OK, intent); 
// finish() immediately or sometime later 

を開始するかを把握するために、結果を使用して、次:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (data.getStringExtra(KEY_LAST_STARTED_ACTIVITY)) { 
     case "War": 
      // Last activity that was started was War, start the next one 
      if (annexEvent) 
      { 
       Intent intent = new Intent(this, Annexation.class); 
       annexEvent = false; 
       startActivityForResult(intent); 
      } 
      break; 
     // ... Add other cases for other activities 

    } 
} 
+0

これは非常に便利なアイデアですが、実装する方法がわからないので、呼び出す可能性のあるアクティビティのあらゆる組み合わせに対して機能することができます。たとえば、 'warEvent'がfalseであれば、まず' Annexation'を呼び出す必要がありますか?または 'War'が呼び出されましたが、' annexEvent'はfalseですが、他のいくつかの条件はtrueで、 'War'の後に別のアクティビティを呼び出す必要がありますか?各 'case'文のすべての条件をチェックすることはオプションではありません。 – VaderGareth

+0

任意の条件に基づいて順番に呼び出される 'Activity'の' List'を作成することができます。上記のように 'startActivityForResult'を使用するだけでなく、あなたがリストにある場所を追跡するためのインデックス変数を維持します。 'onActivityResult'でインデックスをインクリメントし、次のアクティビティを開始します。他のアクティビティが実行されている間にアクティビティの順序が変更された場合、私は 'フラグメント'が行く方法だと思います。 –

0

ベストケースは@nashが述べたようにstartActivityForResultで動作するようになります。あなたは、単に活動「B」はstartActivityForResult「A」を呼び出し、さらにによって開始でき

によって活動が結果を設定すること

Intent in = new Intent(); 
      in.putExtra (LATITUDE, lat); 
      in.putExtra (LONGITUDE, lng); 
      setResult (RESULT_OK, in); 
      finish(); 
以下のような点での活動「B」でOK
を終えることができます

さらにアクティビティ "A"のonActivityResultでフィニッシュコールを受け取り、BI(ビジネスロジック)を適用することができます。したがって、あなたは他の活動と同じことをすることができます。

0

私の提案は、新しいアクティビティ全体にフラッグを渡し、それぞれの最後に条件を満たすかどうかを確認して、新しいアクティビティを開始するか、戻ることができます。あなたはインテントフラグ

にそこのAndroidには保証はあなたが意図を通じて活動を起動しようとするたびに、それはちょうどそれをだということだない、と意図することを忘れないでくださいを使用して活動をカスタマイズすることができます新しいアクティビティを開始します。 Androidの性質は一度に1つのアクティビティを表示することです。

関連する問題