0

我试图在PhoneStateListener来电触发时通知我的应用程序以执行某些操作。我注册我PhoneStateListeneronResume()活动方法如下。

    @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;
     }

我的传入类被定义为同一活动中的内部类,如下所示:

    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 的内存泄漏。

内存泄漏

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

有人可以指导我如何解决这个问题吗?我在内存管理上苦苦挣扎。

4

1 回答 1

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。

对我来说,这不再造成内存泄漏。

于 2016-12-21T10:14:36.777 回答