2016-08-06 2 views
0

У меня проблема с настройкой моего будильника, который должен отправить уведомление о предстоящем событии. Я называю это из моего класса с этих строк кода (до сих пор он начинается через 10 секунд после того, как приложение было запущено, только для целей тестирования):Антенный будильник отменяется при выключении приложения. 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); 
    } 

Я также имеет функцию createNotification, которая работает отлично.

Теперь я добавил следующую строку в Android Manifest:

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

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

Что происходит, когда я выйти из приложения, прежде чем десять секунд передать это следующий код ошибки:

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) 

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

Спасибо заранее, Джон

+0

Утечка приемник не «отмена» будильника. У вас есть неправильное 'имя' для' 'в манифесте. Он должен соответствовать действию, которое вы создаете «Intent»; то есть, «ALARM_ACTION», в этом случае. Кроме того, вы пропускаете этот приемник, потому что вы регистрируете его экземпляр динамически - с помощью 'registerReceiver()' call - который вам не нужно делать. И если вы хотите сбросить будильник после перезагрузки, вам понадобится настройка Receiver для трансляции BOOT_COMPLETED. –

+0

Я скорректировал но что вы хотите изменить с помощью registerReceiver()? Теперь он работает, но я все еще получаю эту ошибку. –

+0

Я имею в виду, что вам это не нужно, поскольку вы регистрируете класс Receiver в манифесте. Динамически зарегистрированный экземпляр получателя протекает, потому что вы никогда его не регистрируете, но вам это действительно не нужно, поэтому вы можете просто удалить этот раздел кода. –

ответ

0

Try используя AlarmManager, как это, он работает для меня:

 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); 
     } 
Смежные вопросы