Android 如何从不同的活动中接收单个活动的多个意图?
我是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和两个空值生成的结果。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收集所有发送的数据(结果),并在单个文本视图中显示这些数据。但是文本视图上显示的是,只有活
所以,如果你知道如何克服这个问题,请帮助我。我们将不胜感激 正如评论中指出的,也许你使用了错误的方法 无论如何,如果您确定自己在做什么(如果我正确理解了您的问题),您可以将您的活动声明为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.
}