#android #sms #broadcastreceiver #screen-orientation
#Android #sms #broadcastreceiver #ориентация экрана
Вопрос:
У меня было 2 BroadcastReceivers для просмотра статуса SMS. Код:
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
...................
...................
}, new IntentFilter(SENT));
//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
...................
...................
}, new IntentFilter(DELIVERED));
Эти два приемника находятся в процедуре, называемой initSMS (). initSMS () вызывается один раз в методе onCreate () . Все работает нормально, но следующая ситуация меня разочаровывает. Когда пользователь меняет ориентацию экрана, Android выдает исключение, приложение подавляется. LogCat показывает мне, что программа не хочет регистрировать BroadcastReceiver во второй раз. Я подумал, что проблем нет, и добавил логический флаг, чтобы пропустить вызов initSMS () в следующий раз в onCreate (). Но даже если во второй раз вызов initSMS () пропущен, при первом изменении ориентации экрана появляется новая ошибка в 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)
> ....
Также путает следующую фразу из LOGCat
Вы пропустили вызов unregisterReceiver()?
… почему это происходит?
Ответ №1:
Когда пользователь меняет ориентацию экрана, Android выдает исключение, приложение подавляется.
Вы должны отменить регистрацию приемников, скажем, onPause()
и зарегистрировать их onResume()
. Таким образом, когда Android уничтожает и воссоздает действие для изменения конфигурации, у вас все равно будут настроены приемники.
Комментарии:
1. Что делать, если приемник объявлен в manifest.xml файл не зарегистрирован программно?
2. @RaviYadav: Извините, но я не понимаю вашего вопроса. Поскольку этот конкретный вопрос и ответ очень старые, я рекомендую вам задать новый вопрос.