我正在尝试使用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。
sendAbort()
是我的活动中执行少量操作的方法。
有人可以指导我如何处理这个问题吗?我正在努力进行内存管理。
答案 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。
对我而言,这不再造成内存泄漏。