6

我在尝试在后台线程中运行 PhoneStateListener on* 回调方法时遇到问题。这是我到目前为止所做的:

首先,我编写了我的 PhoneStateListener 实现。类似的东西:

public MyPhoneStateListener extends PhoneStateListener {
    private TelephonyManager mTelephonyManager;

    public MyPhoneStateListener(Context context) {
        mTelephonyManager = (TelephonyManager) context.getSystemServices(Context.TELEPHONY_SERVICE);
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) { ... }

    public void startListening() {
        mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
    }
}

然后我创建了一个 Handler 类:

public PhoneStateHandler extends Handler {
    private Context mContext;
    private MyPhoneStateListener mListener;

    public static final int MESSAGE_START = 0;

    public PhoneStateHandler(Context context, Looper looper) {
        super(looper);
        mContext = context;
    }

    @Override
    public void onHandleMessage(Message message) {
        if (mListener == null) {
            mListener = new MyPhoneStateListener(mContext);
        }

        switch (message.what) {
        case MESSAGE_START:
            mListener.startListening();
            break;
        }
    }
}

最后,从一个Service我开始一个新的HandlerThread并将我的附加PhoneStateHandler到它的'looper:

HandlerThread mThread = new HandlerThread("PhoneStateListenerThread");
mThread.start();
PhoneStateHandler mHandler = new PhoneStateHandler(this, mThread.getLooper());
mHandler.sendMessage(Message.obtain(mHandler, PhoneStateHandler.MESSAGE_START));

我所期望的是,诸如在线程而不是 UI 线程MyPhoneStateListener.onCallStateChanged()上执行的方法。mThread我正在利用这样一个事实,即当第一次创建 PhoneStateListener 时,它绑定到其当前线程的 Looper。这是无证的,但这就是实际发生的情况。

然而,我观察到的是,尽管该PhoneStateHandler.onHandleMessage()方法在HandlerThread's looper 中被调用(如我所料),但MyPhoneStateListener.onCallStateChanged()仍然在 UI 线程中被调用。

关于我的代码有什么问题的任何线索?

谢谢

4

0 回答 0