手机卫士05_背景资源_listview优化_进程查看

1.1添加黑名单的ui

拦截类型修改为一组RadioGroup,里面三个RadioButton,RadioGroup可以指定排列方式

其它的都简单,记得定义好ID,顺便抽取点样式就可以了,最后两个Button可以设置状态选择器.

如果不确定LinearLayout有多高,就设置为0dp,权重为1,这样它会自己去填充空白,而不是覆盖.

1.2 电话号码的文本输入框

1.2.1安卓下特殊的图片资源 .9.png 图片

安卓自带的工具:sdk-tools-draw0-pathch

如果是在两侧选定黑点,竖向依据黑点间像素块拉伸,上下选择黑点,水平方向就依据这两个黑点链接的像素块.

一般9-patch 就拉伸四个角落,保存就是.9.png图形.即便图片被拉伸,也不会出现很奇怪的变形.

1.2.2 ,通过XML文件定义背景资源

帮助文档>>Develop>>Resource Type>>Drawable>>Shape Drawable

实际上是一个xml文件.根节点为:shape,最常用的属性是shape=”rectangle”//矩形

查看文档可以看到shape中所有的子节点.

Corners子节点,四个角的弧度.//传说中的圆角

Graient 子节点,渐变色 属性startColor,endColor,开始,结束的颜色

Padding:内容据边框的距离

Siez:一般资源文件都可以自动拉伸,不会去配置它

Solid:固定颜色,跟Graint相互冲突.

Stork:图形的边框,可以指定Color颜色,边框宽度width,dashGap:虚线间空白的宽度,dashwidth:虚线本身的宽度.

不过一般还是要美工来做//废话.

1.2.3 文本输入框的样式修改:修改它的背景资源

点击输入内容之后,边框会变色//获取到了焦点之后,失去焦点也会变色.

参照上面的shape子节点做出来获取焦点时候的背景,失去焦点的背景两个XML文件.

//蓝配红,大傻蛋

//其实获取焦点,失去焦点,就是状态选择器,定义一个状态选择器包含这两个XML文件即可.

如果只有一个文本输入框,它默认就是一直获取焦点的状态.

1.2.4 添加界面的业务逻辑

①radiogroup.getCheckedRadioButtonId()//获取选中的单选框的id

Checkbutton 属性,默认选中.

点击保存就添加进数据库,判断是否添加成功,并把这个结果返回上级页面.

黑名单号码是不能重复的,//查询,判断返回结果即可

②在显示列表页面中,重写onAcrivityResult方法,判断返回的结果,并显示在页面上(其实这个结果显示也可以放在添加页,不过在显示列表页更加符合用户的使用习惯,也可以通过结果来获取list集合(所有黑名单用户)再次重置适配器)

1.2.5, 显示所有黑名单号码的页面业务逻辑

①在dao类中添加一个获取所有黑名单用户的功能,findAll(),同时要创建一个业务ben(方便储存)

②然后db.query,遍历cursor 结果集添加进集合中即可. 最后记得cursor.close(),db.close()

③在显示页面自定义适配器,把list集合里所有元素放到适配器里(代码略)

④创建一个item的样式文件

参考样式

1.2.4 数据ui显示细节

①centerVertical  控件竖直居中显示

②点击垃圾箱删除当前号码(获取当前的电话号码即可)

③判断删除的结果,删除完之后,移除listview绑定集合里面的数据lv.remove(list)

也可以重新获取一次所有数据,不过这样可能会比较耗时(要放到子线程之类)

同时adapter.notifyDataSetChange()//通知适配器更新数据

④当黑名单列表里一条内容都没有的时候,显示一个图片或文本信息都可以

这里不通过帧布局,而是相对布局,也有visibile的效果.

//在适配器中获取条目的数量的时候判断是否为0,来作为显示图片的依据.

1.2.5 ListView的优化(重要)

①复用convertView//判断是否为空

②ListView快速滚动,定义属性fastScrollEnabled=true即可

③findViewByID()查找View中的控件,会遍历所有的子控件的id,比较消耗时间.

定义一个类ViewHolder //用来存储子控件的容器

Class ViewHolder{

控件1的引用

控件2的引用

控件3的引用

}

用法:如果convertView为空,创建它的时候,同时也创建ViewHolder对象.

然后在把其中的成员属性赋值,找到对应的控件.

这样复用convertView的时候就不用重新寻找子孩子了.

covertView.setTag(ViewHolder)//把子控件容器保存在covertView中

④当convertView不为空的时候,可以通过getTag()获取子控件容器ViewHolder对象.

2.优化应用程序的用户体验

①当黑名单列表的用户非常多的时候(这个场景在显示所有网站用户,或者后台管理,或者日常事务之类有大量数据要显示在页面上时都可以参考)所以,需要把这个耗时操作放到子线程中,用runUiThead()去更新适配器(适配器看做更新ui的操作)

创建一个LinearLayout,放置一个图片和一个文本,获取信息的时候就设置为可见,获取完就设置可见.

②优化了之后,添加黑名单也会卡一段时间,因为从数据库中重新获取了数据

添加页面返回结果的时候intent携带一个黑名单的封装对象,然后在显示页面直接添加到集合里.

③同理,删除的时候也可以做这样的优化

3.应用程序优化的概念和原则

①本质上是拆东墙补西墙,时间,空间互换

时间换时间:例如电脑开机启动项,禁用了开机启动项虽然开机快了,但是打开程序的时候时间慢了.

空间换时间:(空间小,时间慢),例如网络歌曲,不永久保存在本地硬盘上,但是访问网络读数据需要时间.

图库:开机和sd卡装载的时候遍历sd卡,把路径保存在数据库.

空间换空间:(一块空间给另一个空间使用)参考电脑的虚拟内存,把内存中一部分暂时未使用的数据保存在硬盘上,使用的时候,或内存充足的时候提取出来.

ramdisk软件:把内存空间当做硬盘空间使用,速度要比固态硬盘还快(但是贵啊)

时间换空间:(时间快,空间大)io流中,流对接的byte数组,byte数组越大,占的空间越大,执行速度越快.

4.骚扰拦截的业务逻辑

原理:监听电话和短信,需要长期在后台运行,所以需要创建服务

①创建一个服务,并配置清单文件

②在服务创建的时候,创建一个电话监听器TelephonyManager = getSystemService(XXX);

Tm.listener(监听器,监听状态(通话数据,通话状态,手机信号等等));

监听电话:PhoneStateListener.LISTEN_CALL_STATE

自定义监听器.重写onCallStateChange(int state,String)//当呼叫状态发生改变的时候调用

判断呼叫状态tm.Call_STATE_IDIE空闲状态

tm.CALL_STATE_RINGING//响铃状态

tm.CALL_STATE_OFFHOOK://接通状态

在响铃的时候就获取电话(参数上的String),匹配数据库中的数据,查询是否为黑名单号码,符合拦截模式.

③服务注销的时候,取消注册tm.listener(listener,tm.listener_NONE);

Listener= null //把监听器快速回收

④在设置界面里要允许用户是否开启监听器.

通过自定义view的状态来判断是否开启服务

开启服务:startService(intent);

关闭服务:stopService(intent);

额外①:通过服务的状态回显开关效果(保存sp也可以,不过不严谨),获取服务的运行状态工具类创建

ServiceStateUtils 检查服务运行状态的工具类

//serviceFullName服务类的全路径

创建方法isServiceRunning(String serviceFullName,Context context){

//获取手机上的进程管理器

ActivityManager am = context.getSystemService(XXX);

//得到系统里正在运行的服务

List(RunningService) lists= am.getRunningService(获取正在运行的服务最大的数量,200以内)

遍历集合, list.service(得到正在运行服务的主键名).getClassName(得到服务的类全名称);

判断是否存在传入的serviceFullName集合,

}

时间: 2024-08-01 20:33:01

手机卫士05_背景资源_listview优化_进程查看的相关文章

手机卫士10_widget_流量统计_手机杀毒

1._widget入门: 查看帮助文档>>Developrs>>API Guides>>App Widgets 实际上是一个迷你的应用程序VIew视图,嵌入在另外一个应用程序视图. 标准的android和兼容widget的手机才能显示,被修改过的系统是无法显示的. 实现步骤: ①创建类继承APPWidgetProvider//一个方便的帮助类,用来实现一个appwidget 它继承了广播接收者,实现原理也是通过广播实现的,特殊的广播接收者. ②在清单文件里配置广播接收者

手机卫士04_ 手机定位_超级管理员_数据库

1.1 定位功能简介: 常见的定位方式: ①网络定位:(IP地址),拨号上网一般是动态分配,如果网吧公司,就是静态分配的. 比较有名的数据库:纯真Ip数据库,有很多公开的ip信息 根据ip地址定位.可能很准确,也可能只是一个大概的范围 ②基站定位:必须有手机卡才能基站定位 根据手机与基站联系的信号强弱+算法定位. 定位效果:可能很准确,(与基站位置相关,周围基站越多越近效果越好.) ③GPS定位:采用卫星定位 利用卫星的位置与手机GPS模块的建立联系,通过算法判断位置. 至少需要三颗卫星,获取手

手机卫士11_ 自定义控件_缓存清理_病毒库更新

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果 1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?) ①工程师发现病毒apk,获取到它的特征码发布到服务器上 通过 MD5 或者ASH1获取特征码 ②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端 (在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址) 定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点) 连接服务器:U

手机卫士13_屏幕适配_异常处理_盈利模式_混淆加密

今天是手机卫士最后一天 1,简易屏幕适配: ①使用线性,相对,帧布局,这三种常用布局在所有设备上几乎可以完整实现,多使用dp,sp,不要使用像素,dp,sp会自动适应屏幕 ②浮动窗体显示的距离问题:它show出来的距离就是像素,所以显示距离不会适应屏幕. 代码里接收的单位一般都是像素. 解决方式:把输入的数字转换成dp单位. 得到像素密度*像素 获得dp数据,根据屏幕实现的像素效果 通过工具类去转换成dp数据DesityUtils 2,应用程序的异常处理: 2.1 alpha版本:小范围的内部测

Android核心基础(手机卫士的一个知识点总结)

注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决. 这个总结涵盖了Android的一些核心的内容,如四大组建Service.ContentProvider.BroadCastReceiver.Activity,而且四大组建都必须在清单文件中注册. 还涉及了Android手机底层的一些功能,如读取联系人.短信等.还有一些看似牛别点技术,什么短息拦截,电话拦截,黑名单

手机卫士-06

手机卫士-06 课1 高级工具中归属地查询的优化 实现电话号码的查询:eg 0759 把address中的data2数据 在LocationDao.java中继续添加代码,配合数据库和正则表达式进行查询并返回值 //判断当前的电话号码是手机还是座机:1.如果是手机电话号码1[3\5\7\8]9,2.电话区号0,还有110之类,使用switch来判断位数,以此对号码进行分类查询 需要使用正则表达式来匹配手机号码的规则 老师资料里有正则表达式的资料 手机电话号码1[3\5\7\8]9前三位的出现的情

手机卫士12_软件锁,应用程序相关

1,软件锁(功能描述:当软件处于以加锁的列表中时,打开这个软件会跳转到密码输入界面,输入正确会跳转到软件界面,否则密码错误) ①ui参考 不使用fragment,采用布局叠加隐藏,点击一个文本,就显示一个界面(列表ListView),另一个布局界面隐藏起来(frameLayout帧布局实现). ②程序未加锁界面的展现 找到所有关心的控件,默认把所有的应用程序未加锁界面列表中. 参考条目ui 额外:加锁的小图标带有状态选择器,点击变换图片 横线可以考虑加个宽度为1的imageView; ③点击条目

手机卫士01

开题:手机卫士这样的一个项目可以很好的复习基础所学的知识点,因为它覆盖面广,用来做安卓深入学习是一个很好的选择. 1,开始一个项目 写一个好的代码不仅是看功能是否实现,而且代码具有较高的可读性 1.1 代码组织方式: ①采用业务逻辑模块组织代码,以小米阅读为例: 功能一:阅读器reader com.xiaomi.reader 功能二:分享 share com.xiaomi.share 功能三:便签 note com.xiaomi.note 按功能划分包,即使一部分功能被移除了,另外的功能也不会受

手机卫士-11

手机卫士-11 课1 看门狗WatchDogService程序优化 程序锁不断打开关闭打开关闭,有时还是有界面没及时切换过来 有一瞬间还看见程序的界面,隐私还是保护得不够好 原因是看门狗里WatchDogService.java里死循环,整个死循环的周期有一定的事件,所以会产生多次打开程序锁而界面没切换过来 那是因为应用程序还不够优化 //该标志符用来控制是否不断刷新 flag = true; new Thread() { //其实该service所做的事件就是创建一个死循环,不断查看tempS