AndroidでAlarmManagerのキャンセル方法
受付中
回答 1
投稿 ・編集
- 評価
- クリップ 0
- VIEW 2,435
Androidでアラーム機能を実装中なのですが、以下のようなバグが発生します。
1.アラームを設定する
2.キャンセルする
3.アラームを再度設定する
4.設定時刻になると、アラームが多重に起動してしまう
2の時点では正しくキャンセルされているようで、設定時刻になってもアラームは動きません。
4の段階で、複数回に渡ってIntentがとんでいるようです。
4の段階で、多重起動をやめて、一度だけアラームが起動するように修正したいと思っています。
登場人物とコードは以下の通りです。
すみませんが、どなたかよろしくお願いします。
【登場人物】
・AlarmSetActivity
-アラームを設定するアクティビティ(画面からのチェックボックスによってアラーム設定)
・AlarmReceiver
-アラームのレシーバー(BroadcastReceiverを継承)
・AlarmActivity
-アラームを鳴らすActivity。設定時刻になるとこの画面に遷移してアラームを鳴らす。
【コード】
//アラームを設定するアクティビティ
AlarmSetActivity{
private AlarmReceiver receiver;
//アラームを設定
public void onCheckboxClicked(View v) {
TimePicker timePicker = (TimePicker) findViewById(R.id.time_picker);
PendingIntent pi = getPendingIntent();
AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(
Context.ALARM_SERVICE);
if (((CheckBox) v).isChecked()) {
//チェックボックスがONならアラーム設定する
alarmManager.set(AlarmManager.RTC_WAKEUP, getStartTime(timePicker),
pi);
} else {
//チェックボックスがOFFならキャンセルする
alarmManager.cancel(pi);
pi.cancel();
this.unregisterReceiver(receiver);
}
}
private PendingIntent getPendingIntent() {
//現アクティビティ(AlarmSetActivity)から(AlarmReceiver)へ送信するIntentを設定
IntentFilter filter = new IntentFilter();
filter.addAction(Constants.ALARM);
receiver = new AlarmReceiver();
registerReceiver(receiver, filter);
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(Constants.ALARM);
return PendingIntent.getBroadcast(getApplicationContext(), 0,
broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
//アラームのレシーバー
public class AlarmReceiver extends BroadcastReceiver {
boolean alarmSetFlg;
@Override
public void onReceive(Context context, Intent intent) {
Intent transCall = new Intent(context,AlarmActivity.class);
transCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(transCall);
}
}
AndroidManifest.xml
<receiver
android:name="jp.exmple.alarm.AlarmReceiver"
android:permission="android.permission.Alarm"
android:process=":remote" >
<intent-filter>
<action android:name="Alarm" />
</intent-filter>
</receiver>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
まだ整理できると思いますが、取り急ぎ。ありがとうございました。
public void onCheckboxClicked(View v) {
TimePicker timePicker = (TimePicker) findViewById(R.id.time_picker);
if (((CheckBox) v).isChecked()) {
PendingIntent pi = getPendingIntent();
AlarmManager alarmManager = (AlarmManager) getApplicationContext()
.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, getStartTime(timePicker),
pi);
} else {
AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(AlarmSetActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
aManager.cancel(pIntent);
// alarmManager.cancel(pi);
pIntent.cancel();
this.unregisterReceiver(receiver);
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。