我是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的结果和两个空值。 那么,如果您知道如何克服这个问题,请帮助我。我们将非常感谢。
答案 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“
产生的结果