【问题标题】:How to receive multiple intents to a single activity from different activities?如何从不同的活动接收对单个活动的多个意图?
【发布时间】:2012-11-15 13:41:33
【问题描述】:

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

【问题讨论】:

  • I am new to android development. 您的问题在我看来,您在 Android 框架的工作原理上遗漏了一些非常重要的要点。前台总是只有一个活动,并且考虑到该活动是由 UI 线程处理的,所以总是只有一个活动正在处理。那样的话,怎么“送”到三个活动呢?你只能开始一个!
  • 如果没有实际代码,几乎不可能猜出问题所在。分享您的代码。
  • 您需要显示一些代码,但是您以完全错误的方式执行此操作。不应将活动用作类来进行处理。 Activity 用于构建和维护应用程序 UI。
  • 好吧,我会提供一些代码..感谢您对我的线程的关注..

标签: android android-intent


【解决方案1】:

正如 cmets 中所指出的,您可能使用了错误的方法。

无论如何,如果您确定自己在做什么(并且如果我正确理解您的问题),您可以将您的活动声明为 singleInstancesingleTask
更多详情请参见此处的 android:launchMode:https://developer.android.com/guide/topics/manifest/activity-element.html

我想强调一下文档本身说的

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


编辑:

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

如果你确实需要用户交互,你应该使用 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);

当 Activity 使用类似的东西完成其操作时,使用此方法启动第一个 Activity(控制屏幕)

Intent intent=new Intent();
setResult(RESULT_OK, intent);
finish();

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

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

【讨论】:

  • 感谢您对 Barkausen 的评论,我已经提供了一些代码 sn-p 的详细描述。你能解释一下它有什么问题吗?
  • 抱歉 Barkausen,我必须等待长达 8 小时才能回答我自己的问题,因为我是这个网站的新手。我一定会提供的。再次感谢您的关注。
  • 非常感谢 Barkausen 提供的知识和建议。这些对我来说真的很重要。最后我找到了解决我的问题的方法。我没有使用 3 个单独的活动,而是使用了一个包含这 3 个活动的代码的活动。现在代码看起来有点长和杂乱,但它工作正常并提供了预期的结果......
  • 很高兴您找到了解决方案 (:
【解决方案2】:

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

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

如果确实需要 UI,您必须按顺序执行,以确保该活动不会被您自己的其他活动打断。所以,启动活动A,用它的结果填充一个新的意图,然后启动活动B。然后B会计算自己的东西,把它和A的结果放在一个新的意图a开始C。和C活动一样,直到它交付活动 D 的所有结果。

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

祝你好运

【讨论】:

  • 非常感谢 Robert Estvill 先生分享您的知识。我之前尝试过您指定的顺序方式,但没有奏效。但现在我找到了解决方案。我没有使用三个单独的活动,而是使用一个包含所有三个活动的代码 sn-ps 的活动。尽管新代码看起来有些凌乱,但它运行良好并提供了预期的结果。
【解决方案3】:
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);
     } 
   }
 }

现在上面的代码 sn-p 是我用来将数据从 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 产生的结果"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多