标签:
1._widget入门:
查看帮助文档>>Developrs>>API Guides>>App Widgets
实际上是一个迷你的应用程序VIew视图,嵌入在另外一个应用程序视图.
标准的android和兼容widget的手机才能显示,被修改过的系统是无法显示的.
实现步骤:
①创建类继承APPWidgetProvider//一个方便的帮助类,用来实现一个appwidget
它继承了广播接收者,实现原理也是通过广播实现的,特殊的广播接收者.
②在清单文件里配置广播接收者,拷贝帮助文档的配置数据,修改receiver的name属性,和meta-data中的resource属性
③meta-data文件内容,拷贝帮助文档的内容即可.其中initialLayout 为widget的样式.
额外:带有桌面小空间Widget的应用被安装在sd卡中,是扫描不到的.
①修改清单文件中的安装位置,②卸载原程序.
可以考虑拷贝金山的相关样式,会比较好看(反编译获取到所有资源文件.)
2.更新 widget中的信息.
因为widget是嵌入再别的应用程序中的,桌面应用中有一个appwidgetManager的小控
件管理器,通过这个管理器就可以去更新数据.
①创建一个服务类,因为需要在后台运行更新所以需要定义计时器和计时器任务
定义两个变量:Timer计时器,TImerTask计时器执行的任务.
Timer.schedule(任务,0(开始时间),3000(循环时间)).
②创建一个小控件管理器AppWidgetManager awm = AppwidgetManager.getInstance(this)
awm.updateAppWidget(provider,RomteViews);
RomteViews是一个实现了Parcelable的接口(或seriazable接口)
由于更新的是桌面进程里的远程View对象,所以要把手机卫士里面的View传递过来,并且这个View是可以被序列化.
RomteViews views = new RomteViews(包名,布局文件);
//设置其中的文本,远程view不能直接findViewById
views.setTextViewText(id,文本);
getApplicationContext()//获得应用程序的上下文.s
③组件名ComponentName provider = new (上下文,组件.class);
④widget的生命周期方法
onEnabled(context)//widget被创建了 在创建的时候开启更新数据服务
onDisabled(context)//widget 被销毁了,在销毁的时候取消更新数据服务
3 Widget 的点击事件
①RomteViews views中
views.setOnClickPending(id,pendingIntent);//相当于view对象的onClickListener
PendingIntent是一个描述,描述的是一个intent要执行的动作,可以用来发送广播,开启服务.把一个PendingIntent给另外一个应用程序.
表示的是一个引用,让另外一个进程帮我们执行想要执行的意图.
PendingIntent(延期的意图) pendingintent = PedingIntent.getBroadCast(context,请求码为0即可,intent(意图),flags(执行一次,新的覆盖旧的等))//发送一个广播的延期意图
Intent.setAction(“com.zzx.mobilesage.killapp”);//指定一个发送广播动作,可自定义
②创建一个广播接收者,指定过滤器中的 Action,就是上面自定义的Action.
接收到了广播之后创建进程管理器,然后拿到所有进程的包名,全部kill掉
(在服务类会自动定时更新数据,这里就不用再更新了)
4,流量统计(模拟器的流量是假的,获取不到,真实手机获取的数据可靠)
①创建一个新的activity:TrafficManagerActivity.
②抽屉控件的使用
在布局文件中,新的节点:SlidingDrawer//可以滑动的抽屉
SlidingDrawer必须要有子节点,背景和样式
重要属性:handler = “@+id/名字” //拖动的把手
Content=”@+id/内容” //抽屉的内容
在SlidingDrawer中的子控件中
id属性为id=”@id/handler”//如果是把手的样式就指定把手的id
//报错,content作为一个内容也必须要有一个子控件继承id
额外:指定抽屉的方向orientation属性,可以从右向左拖动//后面会谈到自定义控件,就能从左往右或从上往下拖动.
③界面:
用一个帧布局包括抽屉,可以显示抽屉没抽出之前的布局(后面的布局会覆盖前面的)
不要给整个SlidingDrawer设置背景颜色,要给内容的设置,不然颜色很蛋疼的
④流量相关api
TrafficStats.getTotalTxBytes(); //获取全部的translate的byte,获取上传的全部流量.
TrafficStats.getTotalRxBytes(); //获取全部的下载的流量
全部流量 = 全部上传 + 全部下载
TrafficStats.getMobileRxBytes(); //获取移动网络下载的总数据
TrafficStats.getMobileTxBytes(); //获取移动网络上传的总数据
移动网络 = 移动全部上传 + 移动全部下载
单个应用程序的流量信息获取
TrafficStats.getUidRxBytes(uid);
TrafficStats.getUidTxBytes(uid);
//获取应用程序的用户id
通过包管理器中的所有包信息的集合,每一个包信息对应的应用程序info可以看到uid. uid如果是1000,三位数开始的,一般就是内核应用.
5,TrafficStats 流量统计的实现原理
Linux系统,Windows系统都有一个配置文件去记录流量统计数据(必须要真实手机才看得到)
在adb的DOS命令中查看真实手机
adb - s 手机名 shell
ls 查看文件夹结构
Proc 目录(系统配置和运行信息)下>>uid_stat 用户id状态目录>>对应的文件夹名就是对应的应用程序uid,开头为-号就代表文件>>tcp_rcv,tcp_snd,接收和上传的数据>>cat 文件名,可以看到里面的具体数据.
市面上的自动校准流量就是发送流量查询短信给运营商(10086,10000)获得返回解析.
流量监控,统计每一天的流量信息(每一天凌晨获取一次数据,每隔XX时间获取一次数据,进行计算之后,保存在数据库,然后显示在页面上即可).
6,手机杀毒功能
杀毒软件工作的原理:基于特征码进行杀毒(本质上还是一段指令或代码)
MD5唯一串.
SHA1,数字摘要,特征码,校验文件是否被修改过,被修改过,特征码也会变.
①获取特征码的步骤
创建文件输入流.
创建MessageDigest = MessageDigest.getInstances(“SHA1”);
//如果文件比较大,把输入流分段
Byte[]arr = new byte[]{1024};
Int len = 0;
while循环读取数据,读取一次,digest.update(arr,0,len);//提取数据摘要
Byte[] resultt =digest.digest();//把读取的数据拿取出来
创建StringBuffer sb//遍历byte数组转换成字符串操作
Byte a&0xff,转换成int,再转换成十六进制数.然后sb.append()添加,最后toString().
//判断是否是一位还是两位.一位就加个0,让格式好看一些.也更容易解读一些.
文件名或路径发生变化,不会影响SHA1,数字摘要,当内容发生变化就不一样.
杀毒原理,获取到每一个文件的数字摘要,匹配病毒数据库即可.
金山的病毒数据库antivirus.db,解包它的apk文件可以得到,查看数据库文件内容可以看到,
7,病毒查杀页面的ui
圆盘查杀进度,本质是一个圆盘图片上覆盖一个阴影图片,这个阴影图片随着查杀进度改变自身的位置(或者说是动画.)覆盖图片用帧布局比较方便.
旋转动画:RotateAnimation,从0到360,根据图片设置中心位.
设置播放时间,播放次数,循环次数,如果觉得旋转状态不好看,把角度设小一点或者大一点.
参考ui:
下面空白部分就是一个LinearLayout的控件,用来显示扫描的条目
8,扫描系统里每个应用程序的特征码:
①把病毒特征码数据库存放在资产目录,splash界面把数据库通过io 流保存到私有文件夹下.
可以考虑把数据库拷贝动作,做成一个工具类,目标文件夹和资产目录始终不变,变的只有文件名.
②定义查杀病毒的方法,参考名scanVirus();
扫描每个应用程序会比较耗时,可以考虑放到子线程中
③遍历每一个应用程序的apk,获取它的特征码.
获取包管理器,获取所有包信息,通过应用程序信息.sourceDis//获取每个应用程序的文件路径.
把路径转换为文件对象,(根据不同的算法,MD5,还是SHA1得到数据摘要值.MessageDigest)
④获取摘要值,查询数据库是否有这一条记录.//通过SQLiteDataBase.openDataBase()打开数据库.
之后就是查询,判断结果,记得对比数据库中的列名,用户想看到的只有病毒描述列.
每扫面一个应用程序就打印一次结果:应用程序的Label + 结果 的提示效果
⑤动态更新ui的LinearLayout显示文本和进度条.
显示进度 略
额外:①显示文本,扫描一条就给LinearLayout增加一个文本控件.
由于是在子线程,所以要通过handler发送到主线程更新或增加控件
②addView(view,0)//增加控件到第一个位置上,效果更好.
扫描完之后圆盘动画停止clearAnimation.(或者隐藏掉阴影),进度条上的TextView文本也发生改变
③扫描结果可以上下拖动,ScrollView包裹LinearLayout,它的进度条不好看,设置属性为gone
android:scrollbars="none"
标签:
原文地址:http://www.cnblogs.com/adventurer/p/5602139.html