2016-06-01 13 views
-1

私はSMS_RECIEVEDbroadcastreceiverをCustomWebViewに登録しました。私はレシーバーの登録と登録解除を世話をしました。オリエンテーションが変わるまで、すべてがうまくいく。IntentRecieverオリエンテーションの変更時にリーク

私はonAttachedToWindow()/onDetachedFromWindow()のようなのWebViewの異なる状態の下で/登録解除レシーバ、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

CustomWebViewでregisterReceiver/unregisterReceiverのようなメソッドを作成してから、それを親のonResume/onPauseから呼び出すのはなぜですか...アクティビティのレイアウトまたはフラグメントレイアウトのCustomWebViewの部分ですか? – Selvin

+0

@ρяσѕρєяKgetContext()を呼び出すときにエラーが発生します。registerReceiver(reciver、intents);オリエンテーションを変更した後のCustomWebViewで@Selvin – Bhupesh

答えて

0

この問題は...

をデバイスの画面回転により発生し、Androidは通常、アプリケーションの既存の活動とフラグメントを破壊し、それらを再作成します。 Androidは新しい設定に基づいてアプリケーションがリソースをリロードできるようにこれを行います。

あなたの受信機は、アクティビティの最後のオブジェクトまたはインスタンスに登録されています。したがって、解決策は受信者オブジェクトを保存することです...

onCreateメソッドでpublic Object onRetainNonConfigurationInstance()をオーバーライドし、getLastNonConfigurationInstance()を呼び出すことによって、任意のオブジェクトを保存できます。

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

return data; 
} 

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

    data = getLastNonConfigurationInstance(); 
} 

希望すると助かります。

関連する問題