0

繰り返しアラームを登録しましたが、動作します。しかし、キャンセルしようとすると、キャンセルされません。これらの投稿で解決策を試しました: post1 post2 アクティビティの oncreate():

private void init() {
        btToggleLocationService = (Button) findViewById(R.id.btToggleLocationService);
        btToggleLocationService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(LocatorAlarmManager.isRegistered(MainActivity.this)){
                    Log.d(TAG, "onClick() Alarm  registered, stopping...");
                    LocatorAlarmManager.stopAlarm(MainActivity.this);
                    updateServiceButton();
                }else{
                    Log.d(TAG, "onClick() Alarm not registered, registreing...");
                    LocatorAlarmManager.registerAlarm(MainActivity.this);
                    updateServiceButton();
                }

            }
        });
        updateServiceButton();
    }

そして、私の LocationAlarmManager クラス:

public class LocatorAlarmManager {
    private static final String TAG = LocatorAlarmManager.class.getSimpleName();
    public static final int REQUEST_CODE = 99321;

    /**
     * Registers the Location alarm. Will ignore call if its already registerd.
     */
    public static void registerAlarm(Context context) {
        if (isRegistered(context)) {
            Log.i(TAG, "already Registred alarmt");
            return;
        }
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 3 * 1000;

        SharedPreferences sPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);
        AlarmManager am = (AlarmManager) context
                .getSystemService(Activity.ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
                LocaterSettings.getSendLocationInterval(sPrefs) * 1000L,
                getSendLocationIntent(context, 0));
        Log.i(TAG, "registerAlarm() Registred alarmt");

    }

    /**
     * Checks if the Location alarm has been registered or not.
     * 
     * @return true if its registed, false if not.
     */
    public static boolean isRegistered(Context context) {
        boolean alarmUp = getSendLocationIntent(context,
                PendingIntent.FLAG_NO_CREATE) != null;

        if (alarmUp) {
            Log.d(TAG, "isRegistered() Alarm is already active");
            return true;
        } else {
            Log.d(TAG, "isRegistered() Alarm is NOT active");
            return false;
        }
    }

    public static void stopAlarm(Context context) {
        Log.d(TAG, "stopAlarm() Stopping alarm");
        AlarmManager alarmManagerstop = (AlarmManager) context
                .getSystemService(Activity.ALARM_SERVICE);
        try {
            alarmManagerstop.cancel(getSendLocationIntent(context, 0));
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.d(TAG, "stopAlarm() Stopped alarm");
    }

    private static PendingIntent getSendLocationIntent(Context context, int flag) {
        return PendingIntent.getBroadcast(context, REQUEST_CODE, new Intent(
                context, LocationReciever.class), flag);

    }

ログ:

Button Click start alarm
05-23 21:35:29.780: D/LocatorAlarmManager(16329): isRegistered() Alarm is NOT active
05-23 21:35:29.780: D/MainActivity(16329): onClick() Alarm not registered, registreing...
05-23 21:35:29.780: D/LocatorAlarmManager(16329): isRegistered() Alarm is NOT active
05-23 21:35:29.790: I/LocatorAlarmManager(16329): registerAlarm() Registred alarmt
05-23 21:35:29.790: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active

Button Click stop alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active
05-23 21:35:59.203: D/MainActivity(16329): onClick() Alarm  registered, stopping...
05-23 21:35:59.203: D/LocatorAlarmManager(16329): stopAlarm() Stopping alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): stopAlarm() Stopped alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active

問題はログの最後の行です。キャンセルする必要がありますが、キャンセルした後、再度チェックすると、「既に登録されています」と表示されます。アラーム停止アクションの何が問題なのか知りたいです。前もって感謝します。

4

2 に答える 2

1

アラームをキャンセルした後、PendingIntent もキャンセルする必要があります。

try {
    alarmManagerstop.cancel(getSendLocationIntent(context, 0));
    getSendLocationIntent(context, 0).cancel();
} catch (Exception e) {
    e.printStackTrace();
}

これで問題が解決します。

于 2013-05-24T06:23:20.317 に答える
-1

PendingIntentsを作成するときはPendingIntent.FLAG_UPDATE_CURRENT、最後の引数として使用します。

return PendingIntent.getBroadcast(context, REQUEST_CODE, new Intent(context, 
    LocationReciever.class), PendingIntent.FLAG_UPDATE_CURRENT);
于 2013-05-24T01:44:27.403 に答える