2016-06-01 6 views
-1

Я зарегистрировал SMS_RECIEVEDbroadcastreceiver в CustomWebView. Я позаботился о регистрации и отмене регистрации получателя на жизненном цикле деятельности. Все работает хорошо до изменения ориентации.Утечка IntentReciever при изменении ориентации

Я попытался размещения регистр/незарегистрированный приемник при различных состояниях WebView как onAttachedToWindow()/onDetachedFromWindow(), onPause()/onResume() (явного вызова от активности onPause()-х/onResume()), onStart()/onStop(). Но ничто не мешает IntentReceiver утечкам при изменении ориентации.

Вот код, я пробовал:

CustomWebView.java

public class CustomWebView extends WebView { 

    BroadcastReceiver reciver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       final Bundle bundle = intent.getExtras(); 
       try { 
        if (bundle != null) { 
         final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
         Log.v(tag, "Got PDUS Obj [" + pdusObj + "]"); 
         } 
        } 

       } catch (Exception e) { 
        Log.e(tag, "Exception smsReceiver" + e); 
       } 
      } 
     }; 

    -------------------- 
    -------------------- 
    some code 
    -------------------- 

    @Override 
    public void onResume() { 
     try { 
      IntentFilter intents = new IntentFilter(
        "android.provider.Telephony.SMS_RECEIVED"); 
      getContext().registerReceiver(reciver, intents); 
      Log.i(tag, "Webview sms reciever registered"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     try { 
      getContext().unregisterReceiver(reciver); 
      Log.i(tag, "Webview sms reciever unregistered"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     super.onPause(); 
    } 



    // Tried this one too 
    /* @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     Log.i(tag, "Billdesk onAttach to window called"); 
     try { 
      IntentFilter intents = new IntentFilter(
        "android.provider.Telephony.SMS_RECEIVED"); 
      getContext().registerReceiver(reciver, intents); 
      Log.i(tag, "Webview sms reciever registered"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     Log.i(tag, "Billdesk onDetach From window to window called"); 
     try { 
      getContext().unregisterReceiver(reciver); 
      Log.i(tag, "Webview sms reciever unregistered"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } */ 

} 

MainActivity.java

public class MainActivity extends FragmentActivity{ 

----------- 
----------- 
----------- 

@Override 
    protected void onPause() { 
     if (this.customWebView != null) 
      this.customWebView.onPause(); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     if (this.customWebView != null) 
      this.customWebView.onResume(); 
     super.onResume(); 
    } 

} 

Я получаю следующее сообщение об ошибке, когда ориентация изменяется:

Activity com.abcd.xyz.ActivityClass has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 

Заранее спасибо.

+0

В какой строке возникает проблема? –

+0

Почему вы не создаете такие методы, как registerReceiver/unregisterReceiver в CustomWebView, а затем вызываете его из родителя onResume/onPause ... также является частью CustomWebView макета Activity или макета фрагмента? – Selvin

+0

@ ρяσѕρєяK Я получаю сообщение об ошибке при вызове getContext(). RegisterReceiver (reciver, intents); на CustomWebView после изменения ориентации – Bhupesh

ответ

0

Эта проблема происходит из-за поворота экрана устройства ...

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

И ваш ресивер был зарегистрирован на последнем объекте или экземпляре активности. Таким образом, решение сохраняет объект приемника ...

Вы можете сохранить любой объект, переопределив общедоступный объект onRetainNonConfigurationInstance() и вызвав getLastNonConfigurationInstance() в методе onCreate.

@Override 
public Object onRetainNonConfigurationInstance() { 
// Save the reciever obj here 

return data; 
} 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    data = getLastNonConfigurationInstance(); 
} 

Надеюсь, это поможет вам.