我是android开发的新手。在我的应用程序中,我有一个广播接收器 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 生成的结果和两个空值。所以,如果你知道如何克服这个问题,请帮助我。将不胜感激。
3 回答
正如评论中指出的那样,也许您使用了错误的方法。
无论如何,如果您确定自己在做什么(并且如果我正确理解了您的问题),您可以将您的活动声明为singleInstance或singleTask
请参阅此处的 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);
使用此方法,您启动第一个活动(控制屏幕),当活动使用类似的东西完成其操作时
Intent intent=new Intent();
setResult(RESULT_OK, intent);
finish();
您可以收集结果覆盖onActivityResult
并检查您可以建立刚刚完成的活动的请求代码。此时启动 B 然后 C 并使用它们的结果。
请注意:您应该编辑您的问题以添加代码而不是添加评论。这样可以避免在阅读“复杂”问题时产生混淆,并将所有内容保存在一个地方(这也是我编辑答案但没有添加另一个答案的原因)。
活动通常与 UI 相关联。您不能同时运行 3 个活动,因为当另一个活动处于顶部时它们会暂停。
如果三个(A、B、C)活动正在执行的过程不需要 UI,我会将其移动到服务或线程,并使用广播意图将其报告回 D 活动。
如果确实需要 UI,则必须按顺序执行以确保该活动不会被您自己的其他活动打断。所以,启动活动A,用它的结果填充一个新的意图,然后启动活动B。然后B会计算自己的东西,把它和A的结果放在一个新的意图a开始C。和C活动一样,直到它交付活动 D 的所有结果。
我肯定会建议您通读活动生命周期文档。
祝你好运
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 产生的 null null 结果”
而不是“活动 A 产生的结果
活动 B 产生的结果
活动C产生的结果"