Java 服务泄漏了最初在此处注册的IntentReceiver。是否缺少对unregisterReceiver()的调用?
我正在使用一个前台AndroidJava 服务泄漏了最初在此处注册的IntentReceiver。是否缺少对unregisterReceiver()的调用?,java,android,android-service,android-broadcastreceiver,Java,Android,Android Service,Android Broadcastreceiver,我正在使用一个前台Android服务通过RESTAPI请求一个资源,作为每60秒一次的计时器。这样的服务也运行在与应用程序不同的进程中,这是必要的,这样Android就不会在进入打瞌睡模式时终止它 public class ResourceService extends Service { ... private BroadcastReceiver mReceiver; @Override public void onCreate() { super.o
服务
通过RESTAPI请求一个资源,作为每60秒一次的计时器。这样的服务也运行在与应用程序不同的进程中,这是必要的,这样Android就不会在进入打瞌睡模式时终止它
public class ResourceService extends Service {
...
private BroadcastReceiver mReceiver;
@Override
public void onCreate() {
super.onCreate();
// create mReceiver (BroadcastReceiver)
// create intentFilter (IntentFilter)
registerReceiver(mReceiver, intentFilter);
}
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// main logic
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
}
当我注销应用程序时,调用了onDestroy()
方法,因此也调用了unregisterReceiver()
。应用程序按预期进入登录活动,服务成功停止。但是,logcat会出现以下例外情况:
09-18 09:30:06.627 849-849/foo.mycompany.es.myapp:externalProcess E/ActivityThread: Service foo.mycompany.es.myapp.resources.ResourcesService has leaked IntentReceiver foo.mycompany.es.myapp.resources.ResourcesService$2@7c90278 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Service foo.mycompany.es.myapp.resources.ResourcesService has leaked IntentReceiver foo.mycompany.es.myapp.resources.ResourcesService$2@7c90278 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1222)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:993)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1348)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1328)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1322)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:630)
at foo.mycompany.es.myapp.resources.ResourcesService.registrarReceptor(ResourcesService.java:104)
at foo.mycompany.es.myapp.resources.ResourcesService.onCreate(ResourcesService.java:74)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3534)
at android.app.ActivityThread.-wrap6(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1732)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
09-18 09:30:06.627 849-849/foo.mycompany.es.myapp:externalProcess E/ActivityThread:Service foo.mycompany.es.myapp.resources.resources服务已泄漏IntentReceiver foo.mycompany.es.myapp.resources.resources服务$2@7c90278原来是在这里注册的。是否缺少对unregisterReceiver()的调用?
android.app.IntentReceiver泄漏:Service foo.mycompany.es.myapp.resources.resources服务已泄漏IntentReceiver foo.mycompany.es.myapp.resources.resources服务$2@7c90278原来是在这里注册的。是否缺少对unregisterReceiver()的调用?
在android.app.LoadedApk$ReceiverDispatcher(LoadedApk.java:1222)
在android.app.LoadedApk.getReceiveDispatcher(LoadedApk.java:993)上
在android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1348)
位于android.app.ContextImpl.registerReceiver(ContextImpl.java:1328)
位于android.app.ContextImpl.registerReceiver(ContextImpl.java:1322)
位于android.content.ContextWrapper.registerReceiver(ContextWrapper.java:630)
在foo.mycompany.es.myapp.resources.ResourcesService.RegistrReceptor(ResourcesService.java:104)上
在foo.mycompany.es.myapp.resources.ResourcesService.onCreate(ResourcesService.java:74)
位于android.app.ActivityThread.handleCreateService(ActivityThread.java:3534)
位于android.app.ActivityThread.-wrap6(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1732)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6776)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1496)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
我已经看到了一个关于这个主题的讨论,但它涉及到活动。这样的回答说明unregisterReceiver()
应该放在onPause()
方法中,但是Service
超类中没有我可以覆盖的方法
有人知道上述错误的原因吗
提前感谢您。在onstartcommand中调用unregisterReceiver(locationReceiver)在调用super.ondestory()之前,请尝试取消注册receiver
你是怎么解决的?我还没有:-(
@Override
public void onDestroy() {
unregisterReceiver(mReceiver);
super.onDestroy();
}