Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从不同的活动中接收单个活动的多个意图?_Android_Android Intent - Fatal编程技术网

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

Android 如何从不同的活动中接收单个活动的多个意图?,android,android-intent,Android,Android Intent,我是android开发新手。 在我的应用程序中,我有一个广播接收器R和4个其他活动,比如a、B、C、D。当R收到短信时,R使用意图向a、B和C活动发送一些数据。发送这3项活动的数据效果良好。使用A、B和C活动的发送数据,他们执行自己的任务并产生一些结果。现在,这些A、B和C活动中的每一个都应该将生成的结果发送给活动D。 我使用了intent来实现这一点,并将数据作为捆绑包发送。我所期望的是活动D从A、B和C收集所有发送的数据(结果),并在单个文本视图中显示这些数据。但是文本视图上显示的是,只有活

我是android开发新手。 在我的应用程序中,我有一个广播接收器R和4个其他活动,比如a、B、C、D。当R收到短信时,R使用意图向a、B和C活动发送一些数据。发送这3项活动的数据效果良好。使用A、B和C活动的发送数据,他们执行自己的任务并产生一些结果。现在,这些A、B和C活动中的每一个都应该将生成的结果发送给活动D。 我使用了intent来实现这一点,并将数据作为捆绑包发送。我所期望的是活动D从A、B和C收集所有发送的数据(结果),并在单个文本视图中显示这些数据。但是文本视图上显示的是,只有活动C和两个空值生成的结果。
所以,如果你知道如何克服这个问题,请帮助我。我们将不胜感激

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

无论如何,如果您确定自己在做什么(如果我正确理解了您的问题),您可以将您的活动声明为singleInstance或singleTask
有关更多详细信息,请参见此处的android:launchMode:

我想强调一下,文件本身说

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


编辑:

阅读代码后: 有两种可能的方法来解决这个问题

如果您不需要用户交互,则应使用AsyncTask(https://developer.android.com/reference/android/os/AsyncTask.html):您不需要活动来执行计算,也不应该以这种方式使用它们。 如果要确保在继续之前已完成所有任务,可能需要使用执行器。添加任务(
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();
您可以通过覆盖ActivityResult上的
来收集结果,并检查您可以在刚刚完成的活动中建立的请求代码。此时,先启动B,然后启动C,并使用它们的结果

请注意:您应该编辑您的问题以添加代码,而不是添加注释。这避免了阅读“复杂”问题时的混乱,并将所有内容都放在一个地方(这也是为什么我编辑了我的答案而没有添加其他答案的原因)

但在文本视图中,它显示如下内容, “无效 无效的 活动C产生的结果”

而不是, “活动A产生的结果

活动B产生的结果


活动C生成的结果“

活动通常与UI关联。不能同时运行3个活动,因为当另一个活动位于顶部时,它们会暂停

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

如果确实需要UI,则必须按顺序执行,以确保活动不会被您自己的另一个活动中断。因此,启动活动A,用它的结果填充一个新的意图,然后启动活动B。然后B将计算自己的东西,并将其与A的结果一起放入一个新的意图A中,启动C。C活动也是这样,直到它将所有结果交付给活动D为止

我绝对建议您通读活动生命周期文档


祝你好运

我是android开发的新手。
我觉得你的问题在android框架的工作原理上遗漏了一些非常重要的要点。前台总是只有一个活动,并且考虑到该活动是由UI线程处理的,所以总是只有一个活动正在处理。这样,你如何“发送”给三个活动?你只能开始一个!如果没有实际的代码,猜测问题是什么几乎是不可能的。分享你的代码。你需要展示一些代码,但是,你这样做完全是错误的。活动不应用作类来进行处理。活动用于构建和维护应用程序UI。我将提供一些代码。。感谢您对我的帖子的关注。感谢您的评论。Barkausen,我提供了一些代码片段的详细描述。你能解释一下有什么问题吗?对不起,Barkausen,我必须等8小时才能回答我自己的问题,因为我是这个网站的新手。我会保证的。。再次感谢您的关注。非常感谢Barkausen的知识和建议。这些对我来说真的很重要。最后我找到了解决问题的办法。我没有使用3个单独的活动,而是使用一个包含这3个活动代码的活动。现在代码看起来有点长,有点乱,但它工作得很好,并提供了所需的结果…我很高兴您找到了解决方案(:非常感谢您分享您的知识,Robert Estvill先生。我之前尝试了您指定的顺序方式,但不起作用。但现在我找到了解决方案。我使用的不是三个单独的活动,而是一个活动,其中包括所有三个活动的代码片段。尽管新代码看起来有些混乱,它工作良好,并提供所需的结果。
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);
     } 
   }
 }
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. 
     }