Android 更改屏幕方向后广播接收器崩溃且不工作

Android 更改屏幕方向后广播接收器崩溃且不工作,android,sms,broadcastreceiver,screen-orientation,Android,Sms,Broadcastreceiver,Screen Orientation,我有两个广播接收器来观看短信状态。 代码: 这两个接收器位于名为initSMS()的过程中。initSMS()在OnCreate()方法中调用一次。一切正常,但以下情况令我失望。当用户更改屏幕方向时,android抛出异常,应用程序被抑制。LogCat告诉我程序不想第二次注册BroadcastReceiver。我认为没有问题,并在OnCreate()中添加了一个布尔标志,以便下次跳过initSMS()调用。但是,即使第二次跳过initSMS()调用,第一次更改屏幕get here的方向也是Log

我有两个广播接收器来观看短信状态。 代码:

这两个接收器位于名为initSMS()的过程中。initSMS()在OnCreate()方法中调用一次。一切正常,但以下情况令我失望。当用户更改屏幕方向时,android抛出异常,应用程序被抑制。LogCat告诉我程序不想第二次注册BroadcastReceiver。我认为没有问题,并在OnCreate()中添加了一个布尔标志,以便下次跳过initSMS()调用。但是,即使第二次跳过initSMS()调用,第一次更改屏幕get here的方向也是LogCat中的一个新错误:

活动已泄漏到IntentReceiver

一旦发生这种情况,就不可能跟踪SMS的状态,接收器无法工作。但是,如果用户尝试播放并继续更改方向,则在任何情况下都不会出现错误

--

谁知道,发生了什么事? 类似于块权限的变通方法更改方向并不有趣。我需要了解这里发生了什么并解决当前的问题

LOGcat

> 10-15 20:08:20.863: ERROR/ActivityThread(452): Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$3@40531880 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.863: ERROR/ActivityThread(452):
> android.app.IntentReceiverLeaked: Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$3@40531880 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:799)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:575) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:839) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:833) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.initSMS(MySoft.java:473) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.onCreate(MySoft.java:263) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.access$1500(ActivityThread.java:132) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.os.Handler.dispatchMessage(Handler.java:99) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.os.Looper.loop(Looper.java:143) 10-15 20:08:20.863:
> ERROR/ActivityThread(452): at
> android.app.ActivityThread.main(ActivityThread.java:4268) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> java.lang.reflect.Method.invokeNative(Native Method) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> java.lang.reflect.Method.invoke(Method.java:507) 10-15 20:08:20.863:
> ERROR/ActivityThread(452): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> dalvik.system.NativeStart.main(Native Method) 10-15 20:08:20.873:
> ERROR/ActivityThread(452): Activity com.example.android.Dima.MySoft
> has leaked IntentReceiver com.example.android.Dima.MySoft$4@40531f08
> that was originally registered here. Are you missing a call to
> unregisterReceiver()? 10-15 20:08:20.873: ERROR/ActivityThread(452):
> android.app.IntentReceiverLeaked: Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$4@40531f08 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:799)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:575) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:839) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:833) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.initSMS(MySoft.java:511) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.onCreate(MySoft.java:263) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
> ....
>10-15 20:08:20.863:错误/活动线程(452):活动
>com.example.android.Dima.MySoft泄漏了IntentReceiver
>com.example.android.Dima.MySoft$3@40531880原来是这样
>在这里注册。是否缺少对unregisterReceiver()的调用?10-15
>20:08:20.863:错误/活动线程(452):
>android.app.IntentReceiverLeaked:活动
>com.example.android.Dima.MySoft泄漏了IntentReceiver
>com.example.android.Dima.MySoft$3@40531880原来是这样
>在这里注册。是否缺少对unregisterReceiver()的调用?10-15
>20:08:20.863:错误/活动线程(452):位于
>LoadedApk$ReceiverDispatcher。(LoadedApk.java:799)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.app.LoadedApk.getReceiveDispatcher(LoadedApk.java:575)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.app.ContextImpl.registerReceiver(ContextImpl.java:839)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.app.ContextImpl.registerReceiver(ContextImpl.java:833)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
>10-15 20:08:20.863:错误/活动线程(452):在
>com.example.android.Dima.MySoft.initSMS(MySoft.java:473)10-15
>20:08:20.863:错误/活动线程(452):位于
>com.example.android.Dima.MySoft.onCreate(MySoft.java:263)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.app.ActivityThread.access$1500(ActivityThread.java:132)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
>10-15 20:08:20.863:错误/活动线程(452):在
>android.os.Handler.dispatchMessage(Handler.java:99)10-15
>20:08:20.863:错误/活动线程(452):位于
>android.os.Looper.loop(Looper.java:143)10-15 20:08:20.863:
>错误/活动线程(452):位于
>android.app.ActivityThread.main(ActivityThread.java:4268)10-15
>20:08:20.863:错误/活动线程(452):位于
>java.lang.reflect.Method.Invokenactive(本机方法)10-15
>20:08:20.863:错误/活动线程(452):位于
>java.lang.reflect.Method.invoke(Method.java:507)10-15 20:08:20.863:
>错误/活动线程(452):位于
>com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
>10-15 20:08:20.863:错误/活动线程(452):在
>com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)10-15
>20:08:20.863:错误/活动线程(452):位于
>dalvik.system.Nativestar.main(本机方法)10-15 20:08:20.873:
>错误/ActivityThread(452):Activity com.example.android.Dima.MySoft
>已泄漏IntentReceiver com.example.android.Dima.MySoft$4@40531f08
>原来是在这里注册的。你是不是错过了一个电话
>取消注册接收器()?10-15 20:08:20.873:错误/活动线程(452):
>android.app.IntentReceiverLeaked:活动
>com.example.android.Dima.MySoft泄漏了IntentReceiver
>com.example.android.Dima.MySoft$4@40531f08原来是这样
>在这里注册。是否缺少对unregisterReceiver()的调用?10-15
>20:08:20.873:错误/活动线程(452):在
>LoadedApk$ReceiverDispatcher。(LoadedApk.java:799)
>10-15 20:08:20.873:错误/活动线程(452):在
>android.app.LoadedApk.getReceiveDispatcher(LoadedApk.java:575)10-15
>20:08:20.873:错误/活动线程(452):在
>android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
>10-15 20:08:20.873:错误/活动线程(452):在
>android.app.ContextImpl.registerReceiver(ContextImpl.java:839)10-15
>20:08:20.873:错误/活动线程(452):在
>android.app.ContextImpl.registerReceiver(ContextImpl.java:833)10-15
>20:08:20.873:错误/活动线程(452):在
>android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
>10-15 20:08:20.873:错误/活动线程(452):在
>com.example.android.Dima.MySoft.initSMS(MySoft.java:511)10-15
>20:08:20.873:错误/活动线程(452):在
>com.example.android.Dima.MySoft.onCreate(MySoft.java:263)10-15
>20:08:20.873:错误/活动线程(452):在
>android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
>10-15 20:08:20.873:错误/活动线程(452):在
>android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
> ....
也混淆了
> 10-15 20:08:20.863: ERROR/ActivityThread(452): Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$3@40531880 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.863: ERROR/ActivityThread(452):
> android.app.IntentReceiverLeaked: Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$3@40531880 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:799)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:575) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:839) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:833) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.initSMS(MySoft.java:473) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.onCreate(MySoft.java:263) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread.access$1500(ActivityThread.java:132) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> android.os.Handler.dispatchMessage(Handler.java:99) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> android.os.Looper.loop(Looper.java:143) 10-15 20:08:20.863:
> ERROR/ActivityThread(452): at
> android.app.ActivityThread.main(ActivityThread.java:4268) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> java.lang.reflect.Method.invokeNative(Native Method) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> java.lang.reflect.Method.invoke(Method.java:507) 10-15 20:08:20.863:
> ERROR/ActivityThread(452): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
> 10-15 20:08:20.863: ERROR/ActivityThread(452): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 10-15
> 20:08:20.863: ERROR/ActivityThread(452): at
> dalvik.system.NativeStart.main(Native Method) 10-15 20:08:20.873:
> ERROR/ActivityThread(452): Activity com.example.android.Dima.MySoft
> has leaked IntentReceiver com.example.android.Dima.MySoft$4@40531f08
> that was originally registered here. Are you missing a call to
> unregisterReceiver()? 10-15 20:08:20.873: ERROR/ActivityThread(452):
> android.app.IntentReceiverLeaked: Activity
> com.example.android.Dima.MySoft has leaked IntentReceiver
> com.example.android.Dima.MySoft$4@40531f08 that was originally
> registered here. Are you missing a call to unregisterReceiver()? 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:799)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:575) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:852)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:839) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ContextImpl.registerReceiver(ContextImpl.java:833) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.initSMS(MySoft.java:511) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> com.example.android.Dima.MySoft.onCreate(MySoft.java:263) 10-15
> 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
> 10-15 20:08:20.873: ERROR/ActivityThread(452): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)
> ....