252

アプリの起動時に、特定のアラーム(AlarmManagerを介して登録されたもの)が既に設定され、実行されているかどうかを確認したいと思います。グーグルからの結果は、これを行う方法がないことを示しているようです。これはまだ正しいですか?新しいアラームを作成するためのアクションを実行する前に、ユーザーに通知するために、このチェックを行う必要があります。

4

11 に答える 11

332

ron が投稿したコメントをフォローアップすると、ここに詳細な解決策があります。次のような保留中の意図を持つ繰り返しアラームを登録したとします。

Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                                      intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 1);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent);

アクティブかどうかを確認する方法は次のとおりです。

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_NO_CREATE) != null);

if (alarmUp)
{
    Log.d("myTag", "Alarm is already active");
}

ここでのキーはFLAG_NO_CREATE、javadoc で説明されている which です: if the described PendingIntent **does not** already exists, then simply return null(新しいものを作成する代わりに)

于 2012-03-05T23:14:51.640 に答える
61

レシーバーを使用した実際の例 (一番の答えはアクションのみでした)。

//starting
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getActivity(), MyReceiver.class);
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//my custom string action name
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap

//and stopping
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up
alarmManager.cancel(pendingIntent);//important
pendingIntent.cancel();//important

//checking if alarm is working with pendingIntent
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
boolean isWorking = (PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag
Log.d(TAG, "alarm is " + (isWorking ? "" : "not") + " working...");

言及する価値があります:

後で作成アプリケーション (プロセス) が同じ種類の PendingIntent (同じ操作、同じインテント - アクション、データ、カテゴリ、コンポーネント、フラグ) を再取得する場合、それがまだ有効な場合は同じトークンを表す PendingIntent を受け取ります。したがって、 cancel() を呼び出して削除できます。

つまり、PendingIntent には、それを制御するための同じ機能 (操作とインテントの構造) が必要です。

于 2015-01-21T20:23:40.280 に答える
11

私は2つのアラームを持っています。イベントを識別するために、アクションの代わりに追加のインテントを使用しています。

Intent i = new Intent(context, AppReciever.class);
i.putExtra("timer", "timer1");

問題は、差分エクストラを使用すると、意図 (およびアラーム) が一意にならないことです。したがって、どのアラームがアクティブかどうかを識別できるようにするために、diff requestCode-sを定義する必要がありました。

boolean alarmUp = (PendingIntent.getBroadcast(context, MyApp.TIMER_1, i, 
                    PendingIntent.FLAG_NO_CREATE) != null);

アラームの作成方法は次のとおりです。

public static final int TIMER_1 = 1;
public static final int TIMER_2 = 2;

PendingIntent pending = PendingIntent.getBroadcast(context, TIMER_1, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);
pending = PendingIntent.getBroadcast(context, TIMER_2, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);
于 2013-02-24T00:06:24.543 に答える
9

別の解決策を見つけたところ、うまくいくようです

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);

boolean isWorking = (PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_NO_CREATE) != null);
if (isWorking) {Log.d("alarm", "is working");} else {Log.d("alarm", "is not working");}

if(!isWorking) {
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    int timeNotif = 5 * 60 * 1000;//time in ms, 7*24*60*60*1000 for 1 week
    Log.d("Notif", "Notification every (ms): " + timeNotif);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), timeNotif, pendingIntent);
    }
于 2016-07-25T23:18:22.473 に答える
1
    Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    sqlitewraper.context, 0, intent,
                    PendingIntent.FLAG_NO_CREATE);

FLAG_NO_CREATE は保留中のインテントを作成しないため、ブール値は false になります。

            boolean alarmUp = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_NO_CREATE) != null);

            if (alarmUp) {
                System.out.print("k");

            }

            AlarmManager alarmManager = (AlarmManager) sqlitewraper.context
                    .getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(), 1000 * 60, pendingIntent);

AlarmManager が Pending Intent の値をチェックした後、AlarmManager が Pending Intent のフラグを更新するため、true になります。

            boolean alarmUp1 = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_UPDATE_CURRENT) != null);
            if (alarmUp1) {
                System.out.print("k");

            }
于 2015-08-19T13:07:13.440 に答える
0

これを行う方法はないという印象を受けていますが、それはいいことです。

Alarm_last_set_time をどこかに記録し、 On_boot_starter BroadcastReciever:BOOT_COMPLETED を設定することで、同様の結果を得ることができます。

于 2011-01-31T01:34:43.657 に答える