У меня проблема с настройкой моего будильника, который должен отправить уведомление о предстоящем событии. Я называю это из моего класса с этих строк кода (до сих пор он начинается через 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, но я не мог найти ответ, который бы исправить его. Я хочу, чтобы мои уведомления запускались даже после перезагрузки устройства, но к этому я хочу перейти позже, после того, как мне удастся отобразить их сразу после убийства самого приложения.
Спасибо заранее, Джон
Утечка приемник не «отмена» будильника. У вас есть неправильное 'имя' для' 'в манифесте. Он должен соответствовать действию, которое вы создаете «Intent»; то есть, «ALARM_ACTION», в этом случае. Кроме того, вы пропускаете этот приемник, потому что вы регистрируете его экземпляр динамически - с помощью 'registerReceiver()' call - который вам не нужно делать. И если вы хотите сбросить будильник после перезагрузки, вам понадобится настройка Receiver для трансляции BOOT_COMPLETED. –
Я скорректировал но что вы хотите изменить с помощью registerReceiver()? Теперь он работает, но я все еще получаю эту ошибку. –
Я имею в виду, что вам это не нужно, поскольку вы регистрируете класс Receiver в манифесте. Динамически зарегистрированный экземпляр получателя протекает, потому что вы никогда его не регистрируете, но вам это действительно не нужно, поэтому вы можете просто удалить этот раздел кода. –