Уведомления и AlarmManager - отмена будильника, который я установил

1

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

Что я делаю, так это то, что когда приходит уведомление, я нажимаю на него и нажимаю кнопку unset, которую я установил для запуска unsetAlarm(). Но он продолжает беспокоить меня каждую минуту.

Как остановить уведомления? Может ли быть так, что деятельность каким-то образом дублируется? Если это так, как я могу обеспечить только один экземпляр MainActivity?

Класс MainActivity

package no.perandersen.notifyontimeexample;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

    private AlarmManager alarmManager;
    private PendingIntent notifyIntent;
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    }


    public void setAlarm(View v) {
        Intent myIntent = new Intent(MainActivity.this,
                NotificationService.class);

        notifyIntent = PendingIntent.getService(MainActivity.this, 0,
                myIntent, 0);
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, 1);
        Log.v(TAG, "time for alarm trigger:" + calendar.getTime().toString());
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 1 * 60 * 1000, notifyIntent);
    }

    public void unsetAlarm(View v) {
        alarmManager.cancel(notifyIntent);
        Log.v(TAG, "cancelling notification");
    }

}

Класс NotificationService

package no.perandersen.notifyontimeexample;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

public class NotificationService extends Service {

    private NotificationManager nm;
    private static final String TAG = "NotificationService";
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.v(TAG, "on onCreate");

    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Log.v(TAG, "on onStartCommand");
        Intent mainActivityIntent = new Intent(this, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, mainActivityIntent, 0);

        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("bothering you")
                .setContentText("Just bothering you from example code")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentIntent(pIntent)
                .build();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notification.defaults|= Notification.DEFAULT_LIGHTS;
        nm.notify(0, notification); 

        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}
  • 0
    Откуда звонят setAlarm и unsetAlarm?
  • 0
    Атрибут onClick для Activity_main.xml
Теги:
android-activity
notifications
alarmmanager

1 ответ

4
Лучший ответ

Проблема заключается в том, что для отмены Alarm вам нужно воссоздать PendingIntent точно, как вы его создали, когда вы устанавливаете будильник. Поэтому измените unsetAlarm() на

  public void unsetAlarm(View v) {
     Intent myIntent = new Intent(MainActivity.this,
            NotificationService.class);
    notifyIntent = PendingIntent.getService(MainActivity.this, 0,
            myIntent, 0);  // recreate it here before calling cancel

    alarmManager.cancel(notifyIntent);
    Log.v(TAG, "cancelling notification");
} 
  • 0
    Я смотрю в Android: launchMode = "singleInstance" сейчас для манифеста, может быть, лучше. Я проверю это потом
  • 0
    В любом случае, в моем коде я отменяю, используя точно такой же PendingIntent. Я сохранил это в поле. Это не должно быть проблемой, не так ли?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню