如何从不同的活动中接收单个活动的多个意图?

时间:2012-11-15 13:41:34

标签: android android-intent

我是Android开发的新手。 在我的应用程序中,我有一个广播接收器R和4个其他活动,比如A,B,C,D。当R收到SMS时,R使用意图向A,B和C活动发送一些数据。为这3项活动发送数据工作正常。使用A,B和C活动的发送数据,他们实现自己的任务并产生一些结果。现在,A,B和C活动中的每一个都应将生成的结果发送到活动D. 我使用Intent来实现它,数据作为bundle发送。我期望活动D从A,B和C收集所有发送的数据(结果),并在单个文本视图中显示它们。但是Text视图上显示的内容只是Activity C的结果和两个空值。 那么,如果您知道如何克服这个问题,请帮助我。我们将非常感谢。

3 个答案:

答案 0 :(得分:2)

正如评论中所指出的,也许你使用的是错误的方法。

无论如何,如果您确定自己在做什么(如果我能正确理解您的问题),您可以将您的活动声明为 singleInstance singleTask 有关详细信息,请参阅android:launchMode:https://developer.android.com/guide/topics/manifest/activity-element.html

我想知道文档本身说的

  

其他模式 - singleTask和singleInstance - 不是   适用于大多数应用程序,因为它们会导致   用户可能不熟悉的交互模型非常   与大多数其他应用程序不同。


编辑:

阅读完代码后: 有两种方法可以解决这个问题

如果您 NOT 需要用户互动,则应使用AsyncTask(https://developer.android.com/reference/android/os/AsyncTask.html):您不需要活动只是为了执行计算,你不应该以这种方式使用它们。 如果要确保在执行过程之前已完成每个任务,则可能需要使用Executor。添加任务(new AsyncTaskClassX().executeOnExecutor(executor, params);),然后,如果要等待结果:

executor.shutdown();
try {
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
    //something
}

这将导致系统在进行处理之前等待所有任务的完成。

如果您需要用户互动,那么您可以考虑使用

启动活动
startActivityForResult(intent, 0);

使用此方法启动第一个活动(控制屏幕),当活动使用

等操作完成操作时
Intent intent=new Intent();
setResult(RESULT_OK, intent);
finish();

您可以收集覆盖onActivityResult的结果并检查您可以建立刚刚完成的活动的请求代码。此时启动B然后启动C并使用他们的结果。

只是注意:您应该编辑您的问题以添加代码而不是添加评论。这可以避免在阅读“复杂”问题并将所有内容保存在一个地方时产生混淆(这也是我编辑答案的原因,而且我没有添加其他答案)。

答案 1 :(得分:1)

活动通常与UI相关联。您不能同时运行3个活动,因为当另一个活动停在最前面时它们会暂停。

如果三个(A,B,C)活动正在进行的过程不需要UI,我会将其移动到服务或线程,并使用广播意图将其报告回D活动。 / p>

如果确实需要UI,则必须按顺序执行此操作,以确保活动不会因您自己的其他活动而中断。所以,启动活动A,用它的结果填充一个新意图,然后启动活动B.然后B会计算它自己的东西,把它和A的结果一起放在一个新的意图开始C.与C活动相同,直到它交付所有结果都来自活动D.

我肯定会建议您阅读活动生命周期文档。

祝你好运

答案 2 :(得分:0)

Bundle b = new Bundle();
splitMsg = smsMsg.split("\\n");

for(int i=0; i<splitMsg.length; i++)
{
  if(!(splitMsg[i].equalsIgnoreCase("null")))
  {
     splitFeatures = splitMsg[i].split(":");               

     if(splitFeatures[0].equals("SomethingToA"))
     {

       String valueA = splitFeatures[1];
       b.clear();
       b.putString("keyA", valueA);

       Intent ia = new Intent(context, A.class);
       iaContactName.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       iaContactName.putExtras(b);
       context.startActivity(ia);  
     } 

     if(splitFeatures[0].equals("somethingToB"))
     {
       String valueB = splitFeatures[1];
       b.clear();
       b.putString("keyB", valueB);   
       Intent ib = new Intent(context, B.class);
       ib.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

       ib.putExtras(b);
       context.startActivity(ib);
     } 

     if(splitFeatures[0].equals("SomethingToC"))
     {
       String valueC = splitFeatures[1];
       b.clear();
       b.putString("keyC", unreadSms);

       Intent ic = new Intent(context, C.class);
       ic.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       ic.putExtras(b);
       context.startActivity(ic);
     } 
   }
 }

现在上面的代码片段是我用来将数据从R接收器发送到活动A,B和C的部分。这3个活动中的每一个都接收到已发送给他们的适当意图,并将提取捆绑的数据并使用这些数据产生一些结果。

然后将生成的结果捆绑并发送到活动D.这是如何 完成。

Bundle b = new Bundle();
 b.putString("keyD", valueD);
 Intent id = new Intent(A.this,D.class);
 id.putExtras(b);
 startActivity(id); 
 Each of A,B and C activities send results to D as in the above. Then D will try to  
 extract data from intents as like this, 

   Bundle extras = getIntent().getExtras();



if(extras != null)
   {
      String fromA = extras.etString("keyA");           
      String fromB = extras.etString("keyB");           
      String fromC = extras.etString("keyC");       
      // some code goes here to append fromA, fromB, fromC together and set it into a 
         Text view. 
     }

但是在文本视图中,它显示的是这样的,      “空值       空值        活动C“

产生的结果

代替,   “活动A产生的结果

活动B产生的结果

活动C“

产生的结果