首页 > 代码库 > 服务中电话状态的监听

服务中电话状态的监听

public class AddressService extends Service {    public static final String tag = "AddressService";    private TelephonyManager mTM;    private MyPhoneStateListener mPhoneStateListener;    private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();    private View mViewToast;    private WindowManager mWM;    private String mAddress;    private TextView tv_toast;    private Handler mHandler = new Handler(){        public void handleMessage(android.os.Message msg) {            tv_toast.setText(mAddress);        };    };    private int[] mDrawableIds;        @Override    public void onCreate() {        //第一次开启服务以后,就需要去管理吐司的显示        //电话状态的监听(服务开启的时候,需要去做监听,关闭的时候电话状态就不需要监听)        //1,电话管理者对象        mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        //2,监听电话状态        mPhoneStateListener = new MyPhoneStateListener();        mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);        //获取窗体对象        mWM = (WindowManager) getSystemService(WINDOW_SERVICE);                super.onCreate();    }        class MyPhoneStateListener extends PhoneStateListener{        //3,手动重写,电话状态发生改变会触发的方法        @Override        public void onCallStateChanged(int state, String incomingNumber) {            switch (state) {            case TelephonyManager.CALL_STATE_IDLE:                //空闲状态,没有任何活动(移除吐司)                Log.i(tag, "挂断电话,空闲了.......................");                //挂断电话的时候窗体需要移除吐司                if(mWM!=null && mViewToast!=null){                    mWM.removeView(mViewToast);                }                break;            case TelephonyManager.CALL_STATE_OFFHOOK:                //摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话                break;            case TelephonyManager.CALL_STATE_RINGING:                //响铃(展示吐司)                Log.i(tag, "响铃了.......................");                showToast(incomingNumber);                break;            }            super.onCallStateChanged(state, incomingNumber);        }    }    @Override    public IBinder onBind(Intent arg0) {        return null;    }        public void showToast(String incomingNumber) {        final WindowManager.LayoutParams params = mParams;        params.height = WindowManager.LayoutParams.WRAP_CONTENT;        params.width = WindowManager.LayoutParams.WRAP_CONTENT;        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE//                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE    默认能够被触摸                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;        params.format = PixelFormat.TRANSLUCENT;        //在响铃的时候显示吐司,和电话类型一致        params.type = WindowManager.LayoutParams.TYPE_PHONE;        params.setTitle("Toast");                //指定吐司的所在位置(将吐司指定在左上角)        params.gravity = Gravity.LEFT+Gravity.TOP;                //吐司显示效果(吐司布局文件),xml-->view(吐司),将吐司挂在到windowManager窗体上        mViewToast = View.inflate(this, R.layout.toast_view, null);        tv_toast = (TextView) mViewToast.findViewById(R.id.tv_toast);                //从sp中获取色值文字的索引,匹配图片,用作展示        mDrawableIds = new int[]{                R.drawable.call_locate_white,                R.drawable.call_locate_orange,                R.drawable.call_locate_blue,                R.drawable.call_locate_gray,                R.drawable.call_locate_green};        int toastStyleIndex = SpUtil.getInt(getApplicationContext(), ConstantValue.TOAST_STYLE, 0);        tv_toast.setBackgroundResource(mDrawableIds[toastStyleIndex]);                //在窗体上挂在一个view(权限)        mWM.addView(mViewToast, params);                //获取到了来电号码以后,需要做来电号码查询        query(incomingNumber);    }        private void query(final String incomingNumber) {        new Thread(){            public void run() {                mAddress = AddressDao.getAddress(incomingNumber);                mHandler.sendEmptyMessage(0);            };        }.start();    }    @Override    public void onDestroy() {        //取消对电话状态的监听(开启服务的时候监听电话的对象)        if(mTM!=null && mPhoneStateListener!=null){            mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);        }        super.onDestroy();    }}

 

服务中电话状态的监听