バックラウンド スレッドで * コールバック メソッドに対して PhoneStateListener を実行しようとすると問題が発生します。これが私がこれまでにしたことです:
まず、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;
}
}
}
最後に、a の中からService
新しいものを開始し、そのルーパーにHandlerThread
my をアタッチします。PhoneStateHandler
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
のルーパーで呼び出されるにもかかわらず (予想どおり)、MyPhoneStateListener.onCallStateChanged()
が UI スレッドで呼び出されることです。
私のコードの何が問題なのか手がかりはありますか?
ありがとう