2013-04-30 3 views
1

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

Что я делаю, так это то, что когда приходит уведомление, я нажимаю на него и нажимаю кнопку отмены, которую я установил для запуска 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? – jaibatrik

+0

onClick атрибут activity_main.xml – Piddien

ответ

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

Я ищу андроид: launchMode = "singleInstance" теперь для манифеста, может быть, лучше. Я проверю это потом – Piddien

+0

в любом случае, в моем коде, я отменяю тот же PendingIntent. Я сохранил его в поле. Это не должно быть проблемой, если это так? – Piddien

+0

Хорошо. это работает. Но почему я не могу хранить его в поле и повторно использовать? – Piddien

Смежные вопросы