2017-05-26 62 views
1

有人可以解释如何以特定顺序从一个活动调用多个活动吗?Android:以特定顺序连续调用多个活动

其实我想调用第一个子活动(如果相应的条件为真),等待它完成,然后调用第二个子活动(如果条件允许),也等待它完成,所以上。最后,应用程序必须转到其他活动并关闭子活动被调用的活动。

问题是,应用程序一次执行所有意图,最初应该调用的活动首先出现在屏幕上。

下面是代码:

@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()不会被调用,并且所有intent都会立即执行,所以Coliseum首先被调用而不是War。为您的方案

+0

为什么不使用[Fragments](https://developer.android.com/guide/components/fragments.html)? –

+0

如何使用'startActivityForResult'和do if-else以便一次只启动一个活动? – nasch

回答

0

您可以使用startActivityForResult框架来做到这一点。首先声明一个关键:

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

然后开始你的第一个Activity(反思,如果onResume()是启动一个Activity最为理想的地方。它往往比你想象的调用,所以阅读的文档):

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

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

在你War活动,setResult()使主Activity,你可以找出哪些是最后Activity已启动并决定下一步该怎么入手:

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

在你的主ActivityonActivityResult(),使用结果找出开始下一步是什么:

@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'错误,我们需要先调用'Annexation'?或'War'被调用,但是'annexEvent'是错误的,但其他一些条件是真的,另一个活动应该在'War'后面调用?检查每个'case'语句中的每个条件不是一个选项。 – VaderGareth

+0

你可以根据任何条件创建一个'Activity'列表来按顺序调用。然后像上面那样使用'startActivityForResult',但还要维护一个索引变量来跟踪列表中的位置。在'onActivityResult'中增加索引并开始下一个活动。如果在其他活动正在运行时活动顺序发生变化,我认为'Fragment's是要走的路。 –

0

最好的情况将作为@nash提到与startActivityForResult工作。

你可以简单地致电startActivityForResult“A”开始活动“B”并且可以进一步完成该活动由像下面

Intent in = new Intent(); 
      in.putExtra (LATITUDE, lat); 
      in.putExtra (LONGITUDE, lng); 
      setResult (RESULT_OK, in); 
      finish(); 
在设置结果确定
在活动的“B”

然后进一步接收活动“A”的onActivityResult中的完成调用,然后可以应用您的BI(业务逻辑)。因此,您可以对其他活动进行相同的操作。

0

我的建议是通过一个旗帜横跨新的活动,并在每一个检查结束条件,以便您可以开始新的或返回。您可以使用意图的标志

请记住,有在Android的任何担保,只要你试图通过一个Intent来启动一个活动,它只是这一点,意图定制活动发起一个新的活动;而Android自然是一次显示一个活动。