使用PhoneStateListener时内存泄漏

时间:2016-12-21 06:59:57

标签: android memory memory-leaks phone-state-listener leakcanary

我正在尝试使用PhoneStateListener在来电被触发时通知我的应用程序以执行某些操作。我在我的活动的PhoneStateListener方法中注册我的onResume(),如下所示。

    @Override
    protected void onResume() {
     super.onResume();
     tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     incomingCallListener=new IncomingCallListener();
     tmgr.listen(incomingCallListener, phoneStateListener.LISTEN_CALL_STATE);
    }

onPause()我的活动方法我使用以下代码删除了监听器。

     @Override
     protected void onPause() {
       super.onPause();
        incomingCallListener=null;
        tmgr.listen(incomingCallListener, PhoneStateListener.LISTEN_NONE);
        tmgr=null;
     }

My Incoming类被定义为同一活动中的内部类,如下所示:

    public class IncomingCallListener extends PhoneStateListener {

      public IncomingCallListener() {
      }

      @Override
      public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            if (qInProgress) {
                if (qSource.equals(Loading.TYPE_FUN) || (qResumable)) {
                    //Allow to Resume
                } else {
                    //Break and send abort
                    sendAbort();
                }
            }

        }
      }
   }

我正在使用LeakCanary lib检查内存泄漏,我的活动内存泄漏量为6.1Mb。

Memory Leak

sendAbort()是我的活动中执行少量操作的方法。

有人可以指导我如何处理这个问题吗?我正在努力进行内存管理。

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方案,它不再造成内存泄漏。

private static PhoneStateListener phoneStateListener=new PhoneStateListener(){

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            if (st_qScreen.qInProgress) {
                if (st_qScreen.qSource.equals(Loading.TYPE_FUN) || (st_qScreen.qResumable)) {
                    //Allow to Resume
                } else {
                    //Break and send abort
                    st_qScreen.sendAbortQ();
                }
            }

        }
    }
};

这里st_qScreen是当前类的一个实例。

@Override
protected void onResume() {
    super.onResume();
     tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     tmgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}


@Override
protected void onPause() {
    super.onPause();
    tmgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
    tmgr=null;
}

我在onDestroy方法中将phoneStateListener设置为null。

对我而言,这不再造成内存泄漏。