私はアンドロイド開発が初めてです。私のアプリケーションには、放送受信機 R と、A、B、C、D などの 4 つのアクティビティがあります。R が SMS を受信すると、R はインテントを使用して A、B、および C アクティビティにデータを送信します。これら 3 つのアクティビティのデータの送信は正常に機能します。A、B、C のアクティビティに送信されたデータを使用して、独自のタスクを実装し、いくつかの結果を生成します。これで、これらの A、B、および C アクティビティのそれぞれが、生成された結果をアクティビティ D に送信する必要があります。これを実装するためにインテントを使用し、データはバンドルとして送信されます。私が期待しているのは、アクティビティ D が A、B、および C から送信されたすべてのデータ (結果) を収集し、それらを単一のテキスト ビューに表示することです。しかし、Text ビューに表示されているのは、Activity C によって作成された結果と 2 つの null 値だけです。したがって、この問題を克服する方法を知っている場合は、私を助けてください。高く評価されます。
3 に答える
コメントで指摘されているように、間違ったアプローチを使用している可能性があります。
とにかく、あなたが何をしているのか確信が持てるなら (そして私があなたの問題を正しく理解していれば)、アクティビティをsingleInstanceまたはsingleTask
として宣言することができ
ます。 /topics/manifest/activity-element.html
ドキュメント自体が言うことを強調したいと思います
他のモード (singleTask と singleInstance)は、ほとんどのアプリケーションには適していません。これは、ユーザーにとってなじみがなく、他のほとんどのアプリケーションとは大きく異なる対話モデルになるためです。
編集:
コードを読んだ後: この問題を解決するには 2 つの方法があります。
ユーザーの操作が必要ない場合は、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 か所にまとめます (これが、回答を編集し、別の回答を追加しなかった理由でもあります)。
アクティビティは通常、UI に関連付けられています。3 つのアクティビティを同時に実行することはできません。別のアクティビティが上に来ると一時停止するからです。
3 つの (A、B、C) アクティビティが実行しているプロセスが UI を必要としない場合は、それをサービスまたはスレッドに移動し、ブロードキャスト インテントを使用して D アクティビティに報告します。
UI が必要な場合は、アクティビティが別の独自のアクティビティで中断されないように、順番に実行する必要があります。したがって、アクティビティ A を起動し、新しいインテントにその結果を入力し、アクティビティ B を開始します。次に、B はそれ自体を計算し、それを 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によって生成されたnullnullの結果」のようなものが表示されます。
代わりに、「アクティビティAによって生成された結果
アクティビティBによって生成された結果
活動Cによって生成された結果」