拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果
1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?)
①工程师发现病毒apk,获取到它的特征码发布到服务器上
通过 MD5 或者ASH1获取特征码
②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端
(在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址)
定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点)
连接服务器:Url对象,获取链接HttpUrlConnection,设置超时时间,请求方式,
获取响应码,判断结果,最后转换输入流为字符串.转换成json对象
③本地客户端解析特征码,然后保存至数据库,最后查杀病毒.
解析服务器的病毒库版本,获取本地病毒库的版本(对应的表).
如果不一致,就添加新的病毒条目到本地,并且更新版本.
额外:①添加条目的时候记得查看DDL数据模式定义,语言查看表结构
②如果要更新数据库条目和版本,记得开启数据库事务,保持一致性.
db.beginTransaction();//开始数据库事务
db.beginTransactionSuccessful();//事务执行成功
db.endTransaction()//结束事务,写在 finally里.
③要记得开启服务,放在splash里开启即可.(要判断病毒数据库是否存在)
额外:检测恶意APP还有:文件检验,行为分析等,很多查杀病毒方式.
2,横竖屏切换的生命周期
2.1横竖屏切换的时候界面重新创建activity,解决方式:
①固定横竖屏.
②不让activity重建.
2.2 自定义控件的显示样式:
查找源码>>styles样式文件,找到想要查看的显示样式
根据不同的样式节点,查看对应的xml样式文件.
进度条实际上有三层,一个背景,两个进度(大进度,小进度,参考播放器进度)
//不想写就拷贝源码中的文件,修改参数即可,把进度背景改成想显示的图片(要替换的话,三个背景图片最好都替换掉)即可.
要注意对应的属性名,不要搞错了,不然不生效。
参考背景设置xml资源
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background" android:drawable="@drawable/progress_bg">
</item>
<itemandroid:id="@android:id/secondaryProgress"android:drawable="@drawable/security_progress"> </item>
<itemandroid:id="@android:id/progress" android:drawable="@drawable/security_progress">
</item>
</layer-list>
3, 缓存清理功能
3.1 ui
①缓存清理,SD卡清理,痕迹清理(暂时不用)三个选项卡,使用Fragment碎片界面.
②主界面ui参考:
记得给这让两个小选项卡的背景变换(表示一个被选中,一个没选中.参考home界面的条目小背景,一个透明的边框线)
点击一个选项卡之后,还要记得切换它们的图标资源(醒目的和不醒目的图片,文本颜色也可以修改掉,更好看一些,吗?)记得改布局的默认颜色,不然第一次打开颜色还是黑色.
③Fragment包,存放所有碎片文件(考虑向下兼容,使用v4包)
创建类继承Fragment,重写onCreate,返回的View 代表这个碎片布局样式.
布局样式:暂无,写一个TextView的文本标记一下即可.
获取上下文:getActivity();
在Activity中
点击事件:创建Fragment 继承类对象.
获取支持FragementManager.beginxXX再获取事务.
然后ft.replace(id,对象);最后ft.commit();
额外:一开始指定一个帧布局,在打开功能页面的时候就能显示它.
3.2 清理缓存的功能
什么是缓存:临时文件的的存储,当系统资源不足的时候 会回收缓存空间
①在缓存的Fragment里,扫描所有应用程序的缓存目录,如何实现?
查找源码(看看安卓自己是怎么做的):
在设置界面的应用程序可以看到每个应用程序的缓存内容,通过这一点去找到系统源码的setting源码,
如果直接把setting源码导入工程,会报错,因为它是在框架下进行编译的,依赖框架里的api,而工程里缺少很多系统底层开发的api,所以会报错。
查询源码:查找特定字符,根据特定字符去查找源码,ctrl+H搜索
一致追寻到获取缓存信息的代码.packageStats api
②代码获取缓存数据
PackagerManage pm
pm.getPackageSizeInfo();获取包大小信息,但是这个方法被隐藏了.
通过反射获取到这个方法//获取字节码对象,获取到所有方法
//其它自己探索
额外:注意权限问题
3.3 Fragment ui布局:(可以用ListView 也可以直接用LinearLayout填充空白数据)
②在Fragment 的onStart()方法编写获取所有应用程序的缓存
//获取所有包信息,根据包名,利用反射获取缓存信息.
③记得更新界面ui,扫描进度,扫描的文本,
判断是否存在缓存,存在缓存就把有缓存的消息(有缓存的AppLiaction和缓存大小,可以考虑创建一个对象去封装这些信息)发给主线程
要让条目点击发生状态改变,设置背景资源状态选择器
显示缓存的ui优化:参考ui.
4清除某一个程序的缓存信息
4.1
查看系统源码setting中清楚缓存的按钮点击事件中的代码逻辑
pm.deleteAppliCationCacheFile()//也是被隐藏的,通过反射去调用它
额外:注意权限异常。但是这个权限只能给系统app使用,所以这个逻辑无法实现
解决方式:曲线救国,用户如果点击了单个应用的清除缓存,就跳过setting的详细页面,让用户自己去实现这个清除功能。
4.2 BUG 如果到别的页面再返回清理缓存界面,旧数据和新数据都显示在页面上。
在onStart()//界面可见的时候,添加一条逻辑,每次可见就清空一次布局中的子控件
ll.reamoveAllViews();
5,清除全部缓存:安卓系统的漏洞:让系统发送广播,硬盘空间不够用,系统回收缓存。
实现方法:发送一个消息给操作系统,我要申请一个非常大的空间。就会回收缓存了。
实现步骤①:增加一个新按钮
②找到这个控件,点击的时候申请一个非常大的空间
PackageManager>>freeStorageAndNotify(申请空间,观察者接口);
//申请一个可用空间,观察者返回的是最大可申请空间(能返回多少返回多少)
这是一个隐藏的api
申请的空间,integer.MaxValue//2G,2的31次方 为2G
权限:CLEAR_APP_CACHE//安卓的漏洞,谷歌没有检查这个权限的使用app(system).
额外:清楚完缓存之后,清楚掉下面所有的子控件,从而更新界面显示。
6.SD卡清理:
扫描SD卡中的文件(递归遍历SD卡文件夹,筛选常见缓存文件拓展名.tmp.temp)
把遍历出来的缓存文件显示在界面上,用户可以手动清空所有文件(删除掉).
额外:市面上的清理SD卡还会根据一个数据库(储存市面上常见APP的缓存目录)来判断这个缓存文件属于哪一个APP来提示用户,提高用户体验