2016-06-01 15 views
-1

Ich habe SMS_RECIEVEDbroadcastreceiver in CustomWebView registriert. Ich habe mich um die Registrierung und Aufhebung der Registrierung des Empfängers im Lebenszyklus der Aktivität gekümmert. Alles funktioniert gut, bis sich die Ausrichtung ändert.IntentReciever Leck bei Orientierungsänderung

Ich habe versucht Platzierung Register/unregister Empfänger unter verschiedenen Zuständen der Webansicht wie onAttachedToWindow()/onDetachedFromWindow(), onPause()/onResume() (hiermit ausdrücklich von Aktivität des onPause()/onResume() Aufruf), onStart()/onStop(). Aber nichts scheint IntentReceiver Leck bei Orientierungsänderung zu verhindern.

Hier ist der Code, den ich versucht habe:

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(); 
    } 

} 

ich folgende Fehlermeldung erhalten, wenn, wird Ausrichtung geändert:

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

Vielen Dank im Voraus.

+0

Bei welcher Linie bekommen Problem? –

+0

Warum erstellen Sie keine Methoden wie registerReceiver/unregisterReceiver in CustomWebView und rufen sie dann von übergeordneten onResume/onPause ... ist auch der CustomWebView Teil der Aktivität Layout oder Fragment Layout? – Selvin

+0

@ ρяσѕρєяK Ich bekomme den Fehler beim Aufruf von getContext(). RegisterReceiver (reciver, Intents); auf CustomWebView nach der Orientierung Änderung – Bhupesh

Antwort

0

Dieses Problem tritt aufgrund Gerät Bildschirm-Rotation ...

Wenn das Telefon dreht und der Bildschirm ändert Orientierung, Android in der Regel die Anwendung der bestehenden Aktivitäten und Fragmente zerstört und erschafft sie. Android tut dies, damit Ihre Anwendung Ressourcen basierend auf der neuen Konfiguration neu laden kann.

Und Ihr Empfänger war Register auf Aktivität letzte Objekt oder Instanz. Die Lösung ist also das Speichern des Empfängerobjekts ...

Sie können jedes Objekt speichern, indem Sie das öffentliche Objekt onRetainNonConfigurationInstance() überschreiben und getLastNonConfigurationInstance() in Ihrer onCreate-Methode aufrufen.

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

return data; 
} 

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

    data = getLastNonConfigurationInstance(); 
} 

Hoffe, dass diese Ihnen helfen.