2016-08-06 16 views
0

Ich habe ein Problem bei der Einstellung meines Alarms, der eine Benachrichtigung über ein bevorstehendes Ereignis senden soll. Ich nenne es aus meiner Klasse mit diesen Zeilen Code (bisher es beginnt 10 Sekunden nach der App gestartet wurde, nur für Testzwecke):Android-Alarm wird abgebrochen, wenn die App heruntergefahren wird. Leaked IntentReceiver

public void initNotifications(){ 
     AlarmManager alarms = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 

     BroadcastManager receiver = new BroadcastManager(); 
     IntentFilter filter = new IntentFilter("ALARM_ACTION"); 
     registerReceiver(receiver, filter); 

     Intent intent = new Intent("ALARM_ACTION"); 
     intent.putExtra("param", "My scheduled action"); 
     PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent, 0); 
     // I choose 3s after the launch of my application 
     alarms.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10000, operation) ; 
    } 

and here is the Broadcast Manager class (separate file): 

public class BroadcastManager extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     //Toast.makeText(context, intent.getStringExtra("param"),Toast.LENGTH_SHORT).show(); 
     Intent it = new Intent(context, MainActivity.class); 
     createNotification(context, it); 
    } 

I hat auch createNotification Funktion, die gut funktioniert.

Jetzt habe ich die folgende Zeile Manifest auf Android:

<receiver 
      android:name="BroadcastManager" 
      android:label="BroadcastReceiverAux"> 
      <intent-filter> 
       <action android:name="ALARM" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </receiver> 

Was passiert, wenn ich die App beenden, bevor 10 Sekunden vergehen der folgende Fehlercode ist:

Activity com.mysampleapp.MainMenu has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
                    android.app.IntentReceiverLeaked: Activity com.mysampleapp.MainMenu has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
                     at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:960) 
                     at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:761) 
                     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:2002) 
                     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1982) 
                     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1976) 
                     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:503) 
                     at com.mysampleapp.MainMenu.initNotifications(MainMenu.java:672) 
                     at com.mysampleapp.MainMenu.onCreate(MainMenu.java:133) 
                     at android.app.Activity.performCreate(Activity.java:6283) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2642) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2756) 
                     at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:145) 
                     at android.app.ActivityThread.main(ActivityThread.java:5940) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 

ich ehrlich durch Paar sah der Themen hier auf Stack, aber ich konnte die Antwort nicht finden, die es beheben würde. Ich möchte, dass meine Benachrichtigungen auch nach dem Neustart des Geräts ausgeführt werden, aber dazu möchte ich später verschieben, nachdem ich es geschafft habe, sie anzuzeigen, nachdem ich die App selbst beendet habe.

Danke im Voraus, John

+0

Der durchgesickerten Empfänger ist nicht Ihren Alarm „Abbrechen“. Sie haben den falschen 'Namen' für das' 'im Manifest. Es muss mit der Aktion übereinstimmen, mit der Sie die Absicht erstellen. h. "ALARM_ACTION", in diesem Fall. Außerdem wird der Empfänger verloren, weil Sie eine Instanz dynamisch registrieren - mit dem Aufruf 'registerReceiver()' - den Sie nicht benötigen. Wenn Sie den Alarm nach dem Neustart zurücksetzen möchten, benötigen Sie ein Receiver-Setup für die Übertragung "BOOT_COMPLETED". –

+0

Ich habe korrigiert, aber was m \ u00f6ssen Sie mit registerReceiver()? Jetzt funktioniert es, aber ich bekomme immer noch diesen Fehler. –

+0

Ich meine, Sie brauchen das nicht, da Sie die Receiver-Klasse im Manifest registrieren. Die dynamisch registrierte Empfängerinstanz ist undicht, weil Sie sie nie abmelden, aber Sie brauchen sie nicht wirklich, daher können Sie diesen Codeabschnitt einfach entfernen. –

Antwort

0

Versuchen Sie, die Alarmmanager wie diese verwenden, es funktioniert für mich:

 Intent intent = new Intent(getActivity(), BroadcastManager.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      alarmManager.setExact(AlarmManager.RTC, System.currentTimeMillis()+10000, pendingIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC, System.currentTimeMillis()+10000, pendingIntent); 
     } 
Verwandte Themen