2016-11-16 3 views
0

Je ne peux pas arrêter le gestionnaire d'alarme ou le récepteur de diffusion. Une idée pour résoudre ça?Le gestionnaire d'alarme et le récepteur de diffusion ne s'arrêtent pas

Merci beaucoup à l'avance. En passant, j'utilise le bouton de l'interrupteur pour activer/désactiver l'alarme.

Voici mon code;

MainActivity.class

public void setAlarm(Calendar alarmCalender) 
{ 
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), REQUEST_CODE, intent, 0); 
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent); 

} 

public void cancelAlarm() 
{ 

    AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
    PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    aManager.cancel(pIntent); 
    stopService(intent); 
} 

bouton Switch:

bolme1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean aktiflestirmisse) 
      { 
       if(aktiflestirmisse) 
       { 
        setAlarm(calSet); 
        btn1.setBackgroundColor(getResources().getColor(R.color.aktifdurum)); 
        Toast t= Toast.makeText(MainActivity.this,"Bölme 1 aktif hale getirildi.",Toast.LENGTH_SHORT); 
        t.show(); 
       } 

       else 
       { 
        cancelAlarm(); 
        btn1.setBackgroundColor(getResources().getColor(R.color.pasifdurum)); 
        Toast t = Toast.makeText(MainActivity.this, "Bölme 1 pasif hale getirildi.", Toast.LENGTH_SHORT); 
        t.show(); 
       } 

En tout cas, voici mon AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver { 
NotificationManager manager; 
private final int NOTIFICATION_ID =1; 
@Override 
public void onReceive(Context context, Intent intent) { 

    NotificationManager mng=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification.Builder nb=new Notification.Builder(context); 
    nb.setContentTitle("Hatırlatma"); 
    nb.setContentText("İlgili bölmenin vakti ilaç vakti geldi!"); 
    nb.setSmallIcon(R.drawable.alarm_uyari); 
    nb.setTicker("Bildiriminiz var."); 
    nb.setAutoCancel(true); 
    PendingIntent pi=PendingIntent.getActivity(context,NOTIFICATION_ID,intent,0); 
    nb.setContentIntent(pi); 
    Notification not=nb.getNotification(); 
    not.vibrate=new long[]{500,500,500,500}; 
    mng.notify(NOTIFICATION_ID,not); 

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    if (alarmUri == null) 
    { 
     alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    } 
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri); 
    ringtone.play(); 
}} 

Répondre

0

J'ai utilisé ce code pour ma propre application:

Créer l'intention dans l'attente et enveloppez notre intention:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

//get the alarm manager 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
if (android.os.Build.VERSION.SDK_INT >= 23) 
{ 
     alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent); 
} 
else if (android.os.Build.VERSION.SDK_INT >= 19) 
{ 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent); 
} 
else alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent); 

Annuler:

private void cancelAlarm(long id) 
{ 
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), (int)id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager.cancel(sender); 
} 

Donc dans votre cas cette volonté probablement travailler pour régler l'alarme

Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent); 
+0

Le premier bloc est pour setAlarm non? –

+0

ouais, il s'assure aussi que l'appareil se réveille sur guimauve, c'est difficile avec doze – PrisonMike

+0

Mais j'ai une erreur sur la variable 'id'. Je veux dire, je vais appeler cancelAlarm (0) ou (1)? –

0

Essayez ceci pour votre bouton d'annulation d'alarme:

public void cancelAlarm() { 
 
     Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
 
     final PendingIntent pIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE, 
 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
 
     AlarmManager aManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
 
     aManager.cancel(pIntent); 
 
}

Il n'y a pas besoin de la stopservice; Une fois que vous passez .cancel à l'AlarmManager, il annulera le service via la diffusion. Pour vérifier qu'il est annulé, lancez le terminal 'adb shell dumpsys alarm' puis recherchez par votre nom de paquet. Parfois, l'utilisation de findstr ou similaire à la recherche de l'alarme dans le terminal ne montrera pas l'alarme réelle, mais seulement l'historique des alarmes/wakeups.

Faites-moi savoir si cela fonctionne! :)

+0

Je suppose que je devrais définir public final int REQUEST_CODE = 1 dans AlarmReceiver? –

+0

Oui, vous pouvez le définir comme un identifiant –

+0

Un nombre quelconque? devrais-je définir final int REQUEST_CODE = 1 ou 0? –