1

毎日午後 2 時 30 分から午後 4 時 30 分まで、繰り返しアラームの開始時刻と終了時刻をユーザーに設定させます。指定した開始時間にアラームを鳴らすように設定できますが、終了時間にアラームを停止するにはどうすればよいですか?

余分なものを取得してシステム時間と比較する Broadcast Receiver クラスでこれを処理する必要があると思いますが、アクティビティでキャンセルする方法でアラームをキャンセルすることはできません。

これは、アラームを設定する方法の例です。

    Intent intent = new Intent(NewSchedule.this, RepeatingAlarm.class);
    intent.putExtra("endTime", cal_alarmend.getTimeInMillis()/1000);
    PendingIntent sender = PendingIntent.getBroadcast(NewSchedule.this, REQUEST_CODE, intent, 0);
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal_alarmstart.getTimeInMillis(), 6000, sender);

受信者クラス:

public class RepeatingAlarm extends BroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();

        long now = System.currentTimeMillis();

        Bundle b = intent.getExtras();
        long end = b.getLong("endTime");

        Log.i("now", now + "");
        Log.i("end", end + "");


        if (now > end)
        {
            ???????
        }

      }
    }

編集

BroadcastReceiver の onReceive() でアラームをキャンセルできないのはなぜですか?

public class RepeatingAlarm extends BroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();

        long now = System.currentTimeMillis();
        Bundle b = intent.getExtras();
        long end = b.getLong("endTime");
        int rc = b.getInt("reqCode");

        Log.i("rc", rc + "");

        long n = now/1000;
        long e = end;

        Log.i("now", n + "");
        Log.i("end", e + "");


        if (n > e)
        {
            Log.i("STATUS", "now > end    " + n + ">" + e);
            Intent intentstart = new Intent();
            PendingIntent senderstart = PendingIntent.getBroadcast(context, rc, intentstart, PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
            am.cancel(senderstart);
        }
        else
        {
            Log.i("STATUS", "now <= end    " + n + "<=" + e);
        }

      }
    }

スタックトレースを再確認したところ、rc は、アラームを開始するために使用した要求コードとまったく同じです。

これはスタックトレースです: ここに画像の説明を入力

この後、アラームはキャンセルされたはずですが、まだトースト メッセージが表示されます。

4

1 に答える 1

2

アクティビティでアラームをキャンセルするのと同じように、ここでアラームをキャンセルすることはできません

私の知る限り、できます。もっと正確に言えば、何が問題になるのかわかりません。

そして、これがアクティビティでアラームをキャンセルする方法です

そのコードはアラームを設定します。キャンセルしません。アラームをキャンセルするには、同等のもの(エクストラ以外のすべて) でPendingIntent同じタイプ (例: ) の を作成し、 を呼び出します。getBroadcast()Intentcancel()AlarmManager

于 2012-10-14T14:10:22.850 に答える