码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-06-21 00:00:45      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:

1._widget入门:

查看帮助文档>>Developrs>>API Guides>>App Widgets

实际上是一个迷你的应用程序VIew视图,嵌入在另外一个应用程序视图.

标准的android和兼容widget的手机才能显示,被修改过的系统是无法显示的.

实现步骤:

①创建类继承APPWidgetProvider//一个方便的帮助类,用来实现一个appwidget

它继承了广播接收者,实现原理也是通过广播实现的,特殊的广播接收者.

②在清单文件里配置广播接收者,拷贝帮助文档的配置数据,修改receivername属性,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(); //获取全部的translatebyte,获取上传的全部流量.

TrafficStats.getTotalRxBytes(); //获取全部的下载的流量

全部流量 = 全部上传 + 全部下载

TrafficStats.getMobileRxBytes(); //获取移动网络下载的总数据

TrafficStats.getMobileTxBytes(); //获取移动网络上传的总数据

移动网络 = 移动全部上传 + 移动全部下载

 

单个应用程序的流量信息获取

TrafficStats.getUidRxBytes(uid);

TrafficStats.getUidTxBytes(uid);

//获取应用程序的用户id

通过包管理器中的所有包信息的集合,每一个包信息对应的应用程序info可以看到uid.  uid如果是1000,三位数开始的,一般就是内核应用.

 

5,TrafficStats 流量统计的实现原理

Linux系统,Windows系统都有一个配置文件去记录流量统计数据(必须要真实手机才看得到)

adbDOS命令中查看真实手机

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,0360,根据图片设置中心位.

设置播放时间,播放次数,循环次数,如果觉得旋转状态不好看,把角度设小一点或者大一点.

参考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"

 技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/adventurer/p/5602139.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!