Не удается остановить службу, запущенную с alarmManager - PullRequest
3 голосов
/ 30 сентября 2011

У меня проблемы с отменой будильника, и с него запущена служба.

Я установил будильник в активности:

public class AlarmStarter extends Activity {

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

      Intent locationPollerIntent = new Intent(this, LocationPoller.class);     
      PendingIntent pendingIntent = PendingIntent.getBroadcast
                (getApplicationContext(), REQUEST_CODE, locationPollerIntent, 0);

      alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
      alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                             SystemClock.elapsedRealtime(), 6000, pendingIntent);
    }
}

Намерение LocationPoller запустит службу для определения местоположения устройства. Поэтому я использую alarmManager, чтобы повторять этот поиск с определенной частотой.

После этого, когда я получаю свое местоположение на BroadcastReceiver, я вызываю другое действие, чтобы показать местоположение и запускаю уведомление.

В настоящее время я хотел бы прекратить поиск местоположения. Поэтому я пытаюсь отменить AlarmManager.

public class Notifier extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alarm_notifier);

        findViewById(R.id.btTurnOffAlarm).
                               setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intentToStop = new Intent(this, LocationPoller.class);
                PendingIntent pendingIntentToStop = PendingIntent.getBroadcast 
                       (getApplicationContext(), REQUEST_CODE, intentToStop, 0);

                AlarmManager alarmManager = (AlarmManager)
                                getSystemService(ALARM_SERVICE);
                alarmManager.cancel(pendingIntentToStop);
            }
        });
    }
}

Но это не работает, он продолжает поиск местоположения.

Есть какие-нибудь подсказки?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 30 сентября 2011

Вы должны сделать намерение уникальным.

STH похож на:

locationPollerIntent.setData((Uri.parse("YOUR UNIQUE ID FOR THIS INTENT")));

AlarmManager проверит поле данных намерения при получении правильного сигнала тревоги. просто установите уникальный Uri для данных намерения.

поэтому, когда вы вернете свою тревогу, сделайте что-то вроде:

intentToStop.setData((Uri.parse("YOUR SAME UNIQUE ID FOR THIS INTENT")));

сигнал тревоги должен быть отменен после.

1 голос
/ 30 сентября 2011

REQUEST_CODE должно быть одинаковым в обоих местах; вы не показываете, где это определено в ваших списках кодов.

Также вам не нужно getApplicationContext() здесь - this будет работать просто отлично.

0 голосов
/ 23 октября 2013

У меня была та же проблема, она не о том, чтобы иметь один и тот же экземпляр Intent "locationPollerIntent" и "intentToStop", но у вас должен быть один и тот же экземпляр для PendingIntent.

После остановки AlarmManager, службаостанавливается тоже.

    static PendingIntent instance;

public static PendingIntent getInstance(Context context) {

    if (instance == null)
    {
        Intent intent = new Intent(context, LocationPoller.class); 
        instance = PendingIntent.getService(context, REQUEST_CODE, intent, 0);
    }

    return instance;
}
0 голосов
/ 22 июня 2012

Вы должны передать один и тот же экземпляр.

public static final Uri MYURI = Uri.parse("Some_Uri");
[...]
locationPollerIntent.setData(MyClass.MYURI);
[...]
intentToStop.setData(MyClass.MYURI);

Если у вас есть две разные ссылки каждый раз, когда вы создаете намерение, оно не будет работать.

Более подробный пример здесь:

http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...