1

まず、このフォーラムを使うのは初めてなので、このフォーラムのネチケットを尊重したいと思います。

これが私の問題です:私は次の構造のAndroidアプリケーションを持っています:

  1. 主なアクティビティ(SMSコンテンツに応じてユーザー表示とアラートダイアログを表示します(2を参照))
  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つのメッセージを送信すると、次のことが発生することに注意してください。

  1. 電話オン
  2. 最初のSMS
  3. アクティビティが表示され、AlertDialogは表示されません
  4. アクティビティを最小限に抑えます(またはフルスクリーンのままにします、関係ありません)
  5. AlertDialogでアクティビティが表示されます

どんな助けでもありがたいです

明けましておめでとうございます。

4

2 に答える 2

1

あなたがすでにあなた自身を説明したという理由でこれはうまくいきません:

アクティビティがまだ実行されていない場合、アクティビティを開始してすぐにブロードキャストインテントを送信することはできません。ブロードキャストインテントを送信した時点では、アクティビティはまだ開始されていないため、リスナーは登録されていません。

次のように、アクティビティの開始に使用するインテントにメッセージ情報を直接追加する必要があります。

//Show/start activity
Intent sec=new Intent(context, SecureMessagesActivity.class);
sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
sec.putExtra("some_msg", "I will be sent!");
context.startActivity(sec);
Log.v(TAG, "Sent Intent intentReceivedSuccessSms");

次に、inonCreate()とinでonNewIntent()追加を取得し、それを使用してダイアログを表示できます。BroadcastReceiverあなたはあなたの活動に必要はありません。

于 2013-01-02T10:02:03.200 に答える
0
Intent sec=new Intent(context, Dialog.class);
            sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            context.startActivity(sec);

そして、あなたはアクティビティでこれを必要としています!

public class Dialog extends Activity 
{

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);


    this.getWindow()
    .setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder
        .setTitle("Califica la llamada")
        .setMessage("Esto ayudará a brindarte un mejor servicio de telefonía!")

        .setCancelable(true)
        .setPositiveButton("Buena", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();
                finish();
            }
        })
        .setNegativeButton("Mala", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();
                finish();
            }
        });


    AlertDialog alert = builder.create();
    alert.show();



}
}
于 2013-10-17T14:21:27.747 に答える