黑马程序员之手机卫士第五天

时间:2023-02-19 21:54:44
电话归属地在手机窗体上悬浮显示1,悬浮在手机上(悬浮框不停留在手机卫士应用(界面)中,所以需要去开启一个服务,在服务中去管理toast代码逻辑)1.点击是否开启归属地显示的自定义组合控件SettingItemView(开启:开启服务,服务中管理吐司的显示关闭:关闭服务,不需要显示吐司)2.只有在来电的时候(响铃状态)显示吐司,挂断电话的时候,吐司移除掉
3.电话状态的监听(服务开启的时候,需要去做监听,mTM = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);mPhoneStateListener = new MyPhoneStateListener();mTM.listen(mPhoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);关闭的时候电话状态就不需要监听)if(mTM!=null && mPhoneStateListener!=null){mTM.listen(mPhoneStateListener,PhoneStateListener.LISTEN_NONE);}4,是否开启来电归属地显示的判断条件(服务正在运行==来电归属地开启服务关闭==来电归属地关闭)

2,toast显示是不依赖于activity,但是现有展示效果需要自定义吐司才可实现1.看吐司源码
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;3,吐司背景颜色选择(透明,橙色,蓝色,灰色,绿色)1.在弹出选择样式的对话框后,选择某种样式,并且将其所在数组中的索引值存储sp中2.选中的样式,回显在SettingActivity3.吐司在显示的时候,关联相同颜色的图片,作为背景
4,电话号码归属的方格,可以跟随手势去做移动1.在设置界面添加一个可点击条目,点击此条目弹出activity(半透明)2.双击居中的view,和描述文字处在不同的竖直(上下)区域3.限制view的可拖拽范围4.view双击居中
5,弹出单选框,修改toast展示背景色
6,指定吐司的所在位置,并且记录

7,双击事件两次点击的时间戳做差<5008,多击事件最后一次点击的时间戳 - 第一次点击的时间戳<500
数组的拷贝多次点击事件时间戳存储

## Day06 ##- 来电监听
创建后台服务 AddressService public void onCreate() {listener = new MyPhoneListener();tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);};
@Overridepublic void onDestroy() {super.onDestroy();tm.listen(listener, PhoneStateListener.LISTEN_NONE);listener = null;}
class MyPhoneListener extends PhoneStateListener {
@Overridepublic void onCallStateChanged(int state, StringincomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_RINGING:String address =NumberAddressDao.getAddress(incomingNumber);Toast.makeText(AddressService.this, address,Toast.LENGTH_LONG).show();break;default:break;}super.onCallStateChanged(state, incomingNumber);}}
设置页面新增勾选框,点击后启动或停止service
- 判断服务是否在后台运行,更新checkbox
public static boolean isServiceRunning(String serviceName,Context ctx) {ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);List runningServices =am.getRunningServices(100);//获取所有后台运行的服务for (RunningServiceInfo runningServiceInfo : runningServices){String className =runningServiceInfo.service.getClassName();if (className.equals(serviceName)) {return true;}}return false;}
- 去电监听
- 静态注册广播
                                       
注意添加权限:  问题: 当开关关闭时,仍然能显示去电地址信息
- 动态注册广播
当启动后台服务时,注册广播,服务停止后,注销广播,这样的话,来电和去电的位置显示都可以由一个开关来控制
- 自定义Toast- Toast原理分析查找transient_notification文件,查看布局样式,在values/themes中搜索toastFrameBackground,查看背景图片toast_frame.9.png
分析Toast源码, 创建自定义Toast
private void showToast(String address) {view = new TextView(this);view.setText(address);view.setTextColor(Color.RED);final WindowManager.LayoutParams params = newWindowManager.LayoutParams();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_TOAST;params.setTitle("Toast");wm.addView(view, params);}
监听电话状态, 如果电话处于空闲状态,就从WindowManager中删除Viewcase TelephonyManager.CALL_STATE_IDLE:if (wm != null && view != null) {wm.removeView(view);}break;
- 金山手机卫士
演示金山手机卫士归属地样式, 模仿其样式进行开发. 解压金山手机卫士apk,获取相关资源文件. 注意:相关图片在drawable目录下, 而非drawable-hdpi
- 自定义Toast样式
1. 布局文件电话图标: @android:drawable/ic_menu_call
2. 自定义SettingClickView, 类似SettingItemView
去掉自定义属性,保留setDesc和setTitle两个方法
3. 初始化SettingClickView, 设置点击事件,弹出单选Dialog// 选择归属地样式的弹窗AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);int style = sp.getInt("address_style", 0);builder.setSingleChoiceItems(items, style,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {sp.edit().putInt("address_style", which).commit();scvStyle.setDesc(items[which]);dialog.dismiss();}});
builder.setNegativeButton("取消", null);builder.show();4. 选择相应样式,保存在sp中5. 从sp中读取样式,在AddressService中更改背景图片
SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE);int style = sp.getInt("address_style", 0);int[] bgs = 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};view.setBackgroundResource(bgs[style]);
- 修改归属地显示位置
定义DragViewActivity
1. 布局文件:  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"