一、目标
1、自定义显示的吐司,包括内容文本格式、显示窗口格式。
2、当电话挂断、拒接等空闲状态时,自定义吐司消失。
二、代码实现
1、在“显示号码归属地”服务类(ShowPhoneAddService)中自定义吐司方法(取名myToast(String sting)),参数string为需要显示的字符串(注:本例中只需要使用自定义的吐司来显示号码归属地,其他地方不使用,因此在类中创建方法)。在自定义吐司方法中(myToast):
(1)在服务类中(ShowPhoneAddService)定义TextView对象的成员变量(取名view),再在自定义吐司方法(myToast)中通过new TextView(Context context)方法实例化,参数context为应用的上下文(getApplicationContext());
(2)通过TextView(取名textView)的各种set方法传入并美化要显示的字符串(sting);
(3)通过new WindowManager接口下的LayoutParams()对象实例化一个WindowManager.LayoutParams对象(取名params),该对象用于设置自定义的吐司的显示窗口参数;
(4)通过WindowManager.LayoutParams对象(params)的“.属性 = 值”的方式设置其各项属性:
①窗口宽、高(width、height)均为包裹内容(WindowManager.LayoutParams.WRAP_CONTENT)
②窗口的flags属性设为不获取焦点(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)、不可触摸(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)、保持屏幕开启状态(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)等值(同一个属性的多个值可用且“|”连接)
③窗口样式(format)为半透明(PixelFormat.TRANSLUCENT);
④窗口类型(type)为吐司(WindowManager.LayoutParams.TYPE_TOAST);
(5)在服务类中(ShowPhoneAddService)定义窗口管理者WindowManager对象(取名wm)的成员变量,并在创建(onCreate)方法中通过getSystemService(String name)方法实例化(参数name为窗口服务WINDOW_SERVICE),强转。再在自定义吐司方法(myToast)中通过窗口管理者WindowManager对象(wm)的addView(View view, LayoutParams params)方法加载文本视图(view)和显示窗口的各项参数(params)至窗口管理者中,用来显示。
自定义吐司方法代码:
1 public void myToast(String string){ 2 //设置吐司的显示文本内容和UI 3 TextView view = new TextView(getApplicationContext()); 4 view.setText(string); 5 view.setTextColor(Color.RED); 6 view.setTextSize(25); 7 //设置吐司的显示窗口参数 8 WindowManager.LayoutParams params = new WindowManager.LayoutParams();//创建窗口对象 9 params.height = WindowManager.LayoutParams.WRAP_CONTENT;//设置窗口高度为包裹内容10 params.width = WindowManager.LayoutParams.WRAP_CONTENT;//设置窗口宽度为包裹内容11 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE//将窗口标记为不获取焦点12 |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE//将窗口标记为不可触摸13 |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;//将窗口标记为保持屏幕开启状态14 params.format = PixelFormat.TRANSLUCENT;//窗口样式为半透明15 params.type = WindowManager.LayoutParams.TYPE_TOAST;//窗口类型为吐司16 //通过文本和窗口加载至窗口管理器中17 wm.addView(view, params);18 }
2、在服务类(ShowPhoneAddService)中的自定义的来电监听类(MyPhoneListener)中和去电服务类(OutCallReceiver)里,通过查询数据库获取号码归属地后,通过自定义的吐司方法将归属地传入便可显示。
传入代码;
1 myToast(inComingPhoneAdd);
3、当通话结束或来电拒绝时吐司消失。
(1)在自定义的电话状态监听器(MyPhoneListener)里,新增一个电话空闲状态(TelephonyManager.CALL_STATE_IDLE)的case,
(2)在该case中通过if判断加载至自定义吐司方法中加载至窗口管理者里面的View是否为空,以防止空指针异常,若不为空则通过窗口管理者WindowManager对象(wm)的removeView(View view)方法移除该View。
空闲状态代码:
1 case TelephonyManager.CALL_STATE_IDLE://电话空闲状态:电话挂断、来电拒绝2 //移除自定义吐司方法中加载至窗口管理者里面的View3 if(view !=null)4 wm.removeView(view);5 break;