まず、このフォーラムを使うのは初めてなので、このフォーラムのネチケットを尊重したいと思います。
これが私の問題です:私は次の構造のAndroidアプリケーションを持っています:
- 主なアクティビティ(SMSコンテンツに応じてユーザー表示とアラートダイアログを表示します(2を参照))
- 起動時に実行されるSMSブロードキャストレシーバー(正常に動作し、起動時に実行され、SMSを読み取り、正しい方法で解析します)。
受信者が適切なSMSを受信したときに、アクティビティをアクティブにしてAlertDialogを表示できるようにしたいと思います。最初にアクティビティを表示してからそのままにしておくと(アクティビティが一時停止状態になる場合)、すべて正常に機能しますが、アクティビティを開かない場合は、アクティビティ自体を表示することはできますが、AlertDialogをアクティブにすることはできません。
次に、2つの小さなコードを示します。
受信者(特定のSMSを受信するときに実行されるコード):
//Show/start activity
Intent sec=new Intent(context, SecureMessagesActivity.class);
sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(sec);
// Activate AlertDialog
Intent i = new Intent(context.getString(R.string.intentReceivedSuccessSms)).putExtra("some_msg", "I will be sent!");
context.sendBroadcast(i);
Log.v(TAG, "Sent Intent intentReceivedSuccessSms");
アクティビティ(AndroidマニフェストではsingleTopとして定義されています):
public void onCreate(Bundle savedInstanceState)
{
Log.v(TAG, "Performing onCreate");
super.onCreate(savedInstanceState);
setTheme( android.R.style.Theme_Light);
setContentView(R.layout.main);
//--------------------------------------------------------------
// Manage subscription to intent
//--------------------------------------------------------------
IntentFilter intentFilter = new IntentFilter(
getString(R.string.intentReceivedSuccessSms));
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle(getString(R.string.youFoundIt));
ad.setMessage(getString(R.string.stopTheMusic));
ad.setIcon(R.drawable.tick);
ad.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.v(TAG, "Received button pressure to stop ringtone");
};
}
);
ad.show();
}
};
//registering our receiver
this.registerReceiver(mReceiver, intentFilter);
//--------------------------------------------------------------
// End of manage subscription to intent
//--------------------------------------------------------------
}
私の問題は、アプリがアクティブ化されていないときはブロードキャストレシーバーのみがアクティブであるという事実に関連していると思います。そのため、アクティビティのOnCreateメソッドを実行することはありません。このように、最初にアクティビティを開始し(コメント「アクティビティの表示/開始」を参照)、その直後にOnCreateメソッドで受け入れられる(したがって、まだ登録されていない)ブロードキャストメッセージを送信するのは適切ではないと思います。受信者がインテントを送信したときに、OnCreateがまだ開始されていませんでした)。しかし、それを修正する方法がわかりません。これはアーキテクチャ上の問題だと思います。電話を起動して2つのメッセージを送信すると、次のことが発生することに注意してください。
- 電話オン
- 最初のSMS
- アクティビティが表示され、AlertDialogは表示されません
- アクティビティを最小限に抑えます(またはフルスクリーンのままにします、関係ありません)
- AlertDialogでアクティビティが表示されます
どんな助けでもありがたいです
明けましておめでとうございます。