• 服务中电话状态的监听


    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();
        }
    }
  • 相关阅读:
    HTML5: HTML5 Video(视频)
    HTML5: HTML5 Geolocation(地理定位)
    HTML5: HTML5 拖放
    HTML5: HTML5 MathML
    HTML5: HTML5 内联 SVG
    HTML5: HTML5 Canvas
    HTML5: HTML5 新元素
    HTML5: 浏览器支持
    HTML5: HTML5 介绍
    HTML5: 目录
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/6309462.html
Copyright © 2020-2023  润新知