手机卫士_360手机卫士 - CSDN
  • Android项目实战--手机卫士01--启动界面 http://www.apkbus.com/android-143111-1-1.html Android项目实战--手机卫士02--与服务器交互 http://www.apkbus.com/android-143112-1-1.html Android项目实战--...

     

    Android项目实战--手机卫士01--启动界面
    http://www.apkbus.com/android-143111-1-1.html

    Android项目实战--手机卫士02--与服务器交互
    http://www.apkbus.com/android-143112-1-1.html


    Android项目实战--手机卫士03--完成app更新的逻辑和主界面
    http://www.apkbus.com/android-143113-1-1.html

    Android项目实战--手机卫士04--自定义图片
    http://www.apkbus.com/android-143114-1-1.html

    Android项目实战--手机卫士05--自定义对话框与拨打电话来启动activity
    http://www.apkbus.com/android-143115-1-1.html

    Android项目实战--手机卫士06--GridView的优化与修改Button的显示样式
    http://www.apkbus.com/android-143119-1-1.html




    Android项目实战--手机卫士07--设置向导
    http://www.apkbus.com/android-143123-1-1.html

    Android项目实战--手机卫士08--获取手机联系人
    http://www.apkbus.com/android-143142-1-1.html

    Android项目实战--手机卫士09--防盗逻辑以及设置向导的完成
    http://www.apkbus.com/android-143143-1-1.html

    Android项目实战--手机卫士10--GPS定位与发送短信指令
    http://www.apkbus.com/android-143144-1-1.html


    Android项目实战--手机卫士11--锁屏操作与恢复出厂模式
    http://www.apkbus.com/android-143146-1-1.html

    Android项目实战--手机卫士12--手机号码归属地查询界面
    http://www.apkbus.com/android-143147-1-1.html




    Android项目实战--手机卫士13--手机号码归属地的逻辑和数据库的压缩
    http://www.apkbus.com/android-143156-1-1.html

    Android项目实战--手机卫士14--接电话时显示电话归属地
    http://www.apkbus.com/android-143157-1-1.html




    Android项目实战--手机卫士15--设置手机归属地的样式以及显示位置
    http://www.apkbus.com/android-143159-1-1.html

    Android项目实战--手机卫士16--电话黑名单的增删改查
    http://www.apkbus.com/android-143160-1-1.html

    Android项目实战--手机卫士17--拦截黑名单以及响一声电话的处理
    http://www.apkbus.com/android-143162-1-1.html

    Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
    http://www.apkbus.com/android-143168-1-1.html

    Android项目实战--手机卫士19--短信的恢复
    http://www.apkbus.com/android-143169-1-1.html


    Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
    http://www.apkbus.com/android-143170-1-1.html



    Android项目实战--手机卫士21--运行应用以及美化PopupWindow
    http://www.apkbus.com/android-143108-1-1.html



    Android项目实战--手机卫士22--卸载和分享功能的完成以及用户及系统应用的切换
    http://www.apkbus.com/android-143215-1-1.html
    2013.10.14更新
    Android项目实战--手机卫士23--程序锁界面
    http://www.apkbus.com/android-143529-1-1.html


    Android项目实战--手机卫士24--程序锁的实现以及逻辑
    http://www.apkbus.com/android-143557-1-1.html


    Android项目实战--手机卫士25--监听任务栈实现程序的锁定
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149305

    Android项目实战--手机卫士26--内容提供者与内容观察者
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149309


    Android项目实战--手机卫士27--拿到剩余内存以及正在运行的进程数
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149435


    Android项目实战--手机卫士28--读取进程的信息并显示出来
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149433


    Android项目实战--手机卫士29--杀死后台进程
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149885


    Android项目实战--手机卫士30--读取应用的权限以及自定义Toast
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149888


    Android项目实战--手机卫士31--注册广播事件自动杀死进程
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149889


    Android项目实战--手机卫士31--注册广播事件自动杀死进程
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149889


    Android项目实战--手机卫士32--给清理进程添加一个Widget
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149896


    Android项目实战--手机卫士33--ExpandableListView的使用
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149901


    Android项目实战--手机卫士34--流量管理
    http://www.apkbus.com/forum.php?mod=viewthread&tid=149902
    最近更新

    Android项目实战--手机卫士35--清除程序缓存

    http://www.apkbus.com/forum.php?mod=viewthread&tid=154869

    原文地址:点击打开链接

    展开全文
  • Android之手机卫士

    2019-01-09 20:56:23
    代码组织结构 根据业务逻辑划分 办公软件 出差 com.itheima.travel 工资 com.itheima.money 会议 com.itheima.meeting ...根据功能模块划分(Android开发推荐此方法...

    代码组织结构

    • 根据业务逻辑划分

      • 办公软件

        • 出差 com.itheima.travel

        • 工资 com.itheima.money

        • 会议 com.itheima.meeting

      • 网盘

        • 上传 com.vdisk.upload

        • 下载 com.vdisk.download

        • 分享 com.vdisk.share

    • 根据功能模块划分(Android开发推荐此方法)

      • Activity com.itheima.mobilesafe.activty

      • 后台服务 com.itheima.mobilesafe.service

      • 广播接收者 com.itheima.mobilesafe.receiver

      • 数据库 com.itheima.mobilesafe.db.dao

      • 对象(java bean) com.itheima.mobilesafe.domain/bean

      • 自定义控件 com.itheima.mobilesafe.view

      • 工具类 com.itheima.mobilesafe.utils

      • 业务逻辑 com.itheima.mobilesafe.engine

    项目创建

    应用名称、项目名称、包名
    在这里插入图片描述
    版本选择:

    • minimum SDK 要求最低的安装版本, 安装apk前,系统会判断当前版本是否高于(包含)此版本, 是的话才允许安装

    • maxSdkVersion 要求最高的安装版本(一般不用)

    • Target SDK 目标SDK, 一般设置为开发时使用的手机版本, 这样的话,系统在运行我的apk时,就认为我已经在该做了充分的测试, 系统就不会做过多的兼容性判断, 从而提高运行效率

    • Compile With 编译程序时使用的版本

    Activity创建

    1、闪屏页面(SplashActivity)

    • 展示logo,公司品牌

    • 项目初始化

    • 检测版本更新

    • 校验程序合法性(比如:判断是否有网络,有的话才运行)

    1) 根据功能模块创建/修改包名,activity名称
    2) 编辑闪屏的布局文件
    背景图片
    android:background="@drawable/launcher_bg"
    显示版本号,居中
    android:layout_centerHorizontal="true" android:layout_centerVertical="true"
    显示进程图标,版本号正下方,居中
    android:layout_below="@+id/tv_Version"

    3) 界面内容编程
    获取版本号信息
    在activity文件中新创建方法getVersionName()–获取版本信息的方法
    再在OnCreate()方法中调用该方法

        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
            tvVersion = (TextView) findViewById(R.id.tv_Version);    
            tvVersion.setText("版本号:"+getVersionName());
        }
        
        private String getVersionName(){
            PackageManager packageManager = getPackageManager();
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
                //版本名称&版本号
                //android:versionCode="1"
                //android:versionName="1.0"
                int versionCode = packageInfo.versionCode;
                String versionName = packageInfo.versionName;
                return versionName;
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return "";
        }		

    4) 细节界面处理

    • 使手机最上面的主题条不显示
    在清单文件中,将主题进行修改 原始为:
    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >

    修改为:

    <application
    	android:theme="@android:style/Theme.Black.NoTitleBar" 
    • 字体加阴影
      一般需要给显示字体指定颜色,英文不同版本默认颜色不同;同时还有大小;最终效果见上面的图。
    <TextView
            android:id="@+id/tv_Version"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:shadowColor="#f00"
            android:shadowDx="1"    
            android:shadowDy="1"
            android:shadowRadius="1"
            android:textColor="#000"
            android:text="版本号" />
            <!-- 包括阴影颜色、偏移、半径;其中"#f00"代表红色,代表"#000"白色-->

    2、网络获取json数据及解析 并弹窗提示更新

    流程图:
    在这里插入图片描述
    将会涉及到的内容:

    • 获取项目自身版本信息 PackageManagerPackageInfo
    • 网络获取数据 URLHttpsURLConnection(需要INTERNET权限)
    • 解析Json JSONObject
    • 子线程使用 Thread
    • Handler处理,& Message
    • 更新对话框弹出 showUpdateDailog

    网络获取数据(网络存在延时,需要引用子线程处理,否则导致主线程等待时间长或不确定)得到最新版本信息,与项目自身版本信息比较,判断是否需要更新,更新则弹出对话框给用户(对话框不能放在子线程中处理,又引用Handler来处理,其中消息用Message传递)
    从网络获取到的信息需要转换 InputStream->String,此转换按功能模块分类放在工具类Utils中

    服务器:Apache.Tomcat

    和服务器进行数据交互的大部分都是json格式
    { “name” : “value”,
    “name2” : “value2” }

    (1) json数据放入服务器
    (2) 开启服务器,利用网址连接可访问服务器
    将APP的版本信息编辑成Json格式(update.json),存入安装目录的.\webapps\ROOT下面,通过网址http://localhost:8080/update.json可以访问内容

    {
    	"versionName":"2.0",
    	"versionCode":2,
    	"description":"NB功能,赶快体验",
    	"downloadURL":"http://localhost:8080/update.json"
    }
    养成良好的编程习惯
    - 快捷键:
    	* Ctrl + 1	弹出相关提示,可以将变量改成全局编程
    	* Ctrl + 2 ,L	自动创建变量类型及名称
    - 命名:(首字母适当大写)
    	* 布局文件中的控件名称采用形如 **tv_描述**  的格式命名
    	* 在activity.java文件中,对应控件采用形如 **tv描述** 的格式命名
    	* 全局变量采用形如 **m描述** 的格式命名
    

    1)从服务器获取最新版本信息(网络获取数据,解析Json)

    参考blog:Java通过URL 从web服务端获取数据

    (1)问题:未将网络获取数据程序段以子线程运行时,报如下错误:

    在这里插入图片描述
    Android之NetworkOnMainThreadException异常 的理解与处理
    主要内容如下:
    官宣:从Honeycomb SDK(3.0)开始,google不再允许(禁止)网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,因为直接在UI线程进行网络操作,会阻塞UI、用户体验相当bad!
    So 解决方案

    • 和network有关比较耗时的操作放到一个子线程里,然后用Handler消息机制与主线程通信。(本文采用)
    • 使用异步机制如:asynctask,这个举个简单的加载网络图片的例子
    • 直接在main Thread 进行网络操作的方法:在发起Http请求的Activity里面的onCreate函数里面添加相关代码(可参考blog,但也不推荐使用)
    	//简单的启动子线程异步加载数据
    	new Thread(){
    		public void run() {
    	     		...
    	     	}
    	 }.start();
    (2)网络获取数据,解析Json,版本对比,子线程处理等编写在同一个方法中

    代码如下,结合上下文一起更好理解。

    private void checkVersion() {
       //启动子线程异步加载数据
       new Thread(){
           public void run() {
               Message message = Message.obtain();
               HttpURLConnection httpURLConnection = null;
               try {
                   //连接服务端
                   URL url = new URL("http://10.0.2.2:8080/update.json");
                   //把HttpURLConnection与HttpsURLConnection搞错了
                   httpURLConnection = (HttpURLConnection) url.openConnection();
                   httpURLConnection.setRequestMethod("GET");
                   httpURLConnection.setConnectTimeout(5000);
                   httpURLConnection.setReadTimeout(5000);
                   httpURLConnection.connect();
    
                   int responseCode = httpURLConnection.getResponseCode();
                   if (responseCode==200) {
                       //响应成功,获取输入流
                       InputStream inputStream = httpURLConnection.getInputStream();
                       //利用自己编写的工具类将输入流转换成String
                       String result = StreamUtils.readStream(inputStream);
    
                       //利用Json解析
                       JSONObject jsonObject = new JSONObject(result);
                       mVersionName = jsonObject.getString("versionName");
                       mVersionCode = jsonObject.getInt("versionCode");
                       mDescription = jsonObject.getString("description");
                       mDownloadURL = jsonObject.getString("downloadURL");
    
                       System.out.println("description:"+mDescription);
    
                       //判断是否需要更新
                       if (mVersionCode>getVersionCode()) {
                           //需要更新,弹出更新对话框
                           //使用Handler机制,将message.what设置不同属性值,下面else以及各种异常同理
                           message.what = CODE_UPDATE_DIALOG;                              
                       }
                       else {
                           //不需要更新,保持原来页面or进入主页面
                           message.what = CODE_ENTER_HOME;
                       }   
                   }                   
               } catch (MalformedURLException e) {
                   // URL错误
                   message.what = CODE_URL_ERROR;
                   e.printStackTrace();
               } catch (IOException e) {
                   //连接错误
                   message.what = CODE_NET_ERROR;
                   e.printStackTrace();
               } catch (JSONException e) {
                   // json解析错误
                   message.what = CODE_JSON_ERROR;
                   e.printStackTrace();
               }finally{
                   //将message发送到Handler
                   mHandler.sendMessage(message);
                   //关闭网络
                   if (httpURLConnection != null) {
                       httpURLConnection.disconnect();
                   }
               }
           };
       }.start();
    }

    2)Handler消息机制处理

    软件自动补充的mHandler对象的代码如下:
    但注意:这是java.util.logging.Handler; 下的Handler,我们需要用的是android.os.Handler;下的Handler

    private Handler mHandler = new Handler() {
     
     @Override
     public void publish(LogRecord record) {
      // TODO Auto-generated method stub
      ......
     }
     
     @Override
     public void flush() {
      // TODO Auto-generated method stub
      ......
     }
     
     @Override
     public void close() {
      // TODO Auto-generated method stub
      ......
     }
    };

    大致编写代码如下:

    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message message) {
            // TODO Auto-generated method stub
            switch (message.what) {
            case CODE_UPDATE_DIALOG:
                //弹出升级对话框
                break;
            case CODE_ENTER_HOME:
                //进入主页面
    
                break;
            case CODE_URL_ERROR:
                //弹出吐司:网址错误
    
                break;
            case CODE_NET_ERROR:
                //弹出吐司:网络出错
    
                break;
            case CODE_JSON_ERROR:
                //弹出吐司:数据解析错误
    
                break;
            default:
                break;
            }
        };
    };

    3)对话框处理

    private void showUpdateDailog() {
       AlertDialog.Builder uBuilder = new AlertDialog.Builder(this);
       uBuilder.setTitle("更新版本:"+mVersionName);
       uBuilder.setMessage(mDescription);
       uBuilder.setPositiveButton("立马更新", new OnClickListener() {
    
           @Override
           public void onClick(DialogInterface dialog, int which) {
               // TODO Auto-generated method stub
               System.out.println("立马更新");	
       		......
           }
       });
       uBuilder.setNegativeButton("以后再说", new OnClickListener() {
    
           @Override
           public void onClick(DialogInterface dialog, int which) {
               // TODO Auto-generated method stub
               System.out.println("以后再说");
       		......
           }
       });
       uBuilder.show();
    }
    展开全文
  • 手机卫士-12

    千次阅读 2015-04-07 18:41:20
    手机卫士-12 课1 手机杀毒模块 杀毒原理: 1、什么是病毒:特殊的程序,存在在硬盘里面。 - 如何定义计算机病毒: 1、侵犯用户的隐私,偷窃你的私隐数据 2、盗号,偷钱。(特洛伊,木马)灰鸽子 3、恶意...
    
    

    手机卫士-12

    课1

    手机杀毒模块

    杀毒原理:

    1、什么是病毒:特殊的程序,存在在硬盘里面。 - 如何定义计算机病毒:

    1、侵犯用户的隐私,偷窃你的私隐数据
    2、盗号,偷钱。(特洛伊,木马)灰鸽子
    3、恶意程序,危害设备
    

    前提:在用户不知情的情况下安装,在特殊的情况下出发。

    红蜘蛛,灰鸽子

    2、如何杀毒?

    把硬盘上的病毒程序,文件删除掉
    删除问题:
    1、不知道哪个文件是病毒。
    2、无法清除。互相守护。A.exe B.exe C.exe 
    

    3、杀毒软件的工作

    1、找到病毒
    2、删除病毒
    3、修复系统。
    

    研究一个项目的流程:1、起源、2、Demo、3、成型项目

    王江民:反病毒专家 kv20--->江民杀毒软件

    江民炸弹:逻辑炸弹(非常恶意的病毒)。报复盗版: mbr:硬盘的引导区 逻辑炸弹就是破坏mbr,导致电脑启动不了。


    4、杀毒软件工具的原理

    1、识别应用程序的特征码
        什么是特征码?
    


    5、新建工程:获取特征码

    项目使用到的算法
        SHA1
        MD5
    
    项目逻辑:
        1、获取一个数字摘要器
        2、循环的读取文件的每一个byte,获取每个byte的数字签名
    
    获取到了文件的用MD5或SHA1加密的数字摘要
    如果我们改变了文件里面的内容,那么文件的数字摘要就改变了。
    

    6、早起的杀毒软件工作的原理就是:

    1、手机常见病毒的特征码,把特征码存放在数据库(病毒库)
    2、遍历所有的系统文件,计算他们的特征码,跟病毒数据库进行对比
    3、根据比对的结果确定文件是否是病毒。卡巴斯基:非常安全,因为病毒库很庞大,但是读取数据库数据量太大,占用cpu资源,卡。
    

    7、杀毒的问题:

    1、如何搜集这么多的病毒:蜜罐,互联网云查杀(把用户的电脑变成蜜罐)
    2、病毒库太大了,效率怎么办。(杀毒引擎,优化后的数据库查询算法)
    缺陷
    
        1、根据数据库查杀,只能查杀已知的病毒,不能查杀未知的病毒。
    

    8、新技术:主动防御

    1、根据软件的行为,判断软件是否是病毒
        1.看门狗:后台while死循环,监视系统
        2.拦截系统API:SystemService.jar,主动提醒用户是否允许行为
    把金山的病毒数据库复制过来
    


    我们杀毒的逻辑:遍历系统的文件,查看文件的特征码,并比对病毒数据库的特征码。

    看雪论坛:


    主动防御技术,安卓注入术

    课2

    乌云网:查漏洞

    社会工程学:设密码的习惯

    程序员设密码的讲究

    1、钱
    2、社交
    3、下载一下
    

    实现手机杀毒的功能

    金山杀毒界面:


    新建AntiVirusActivity.java+清单

    <activity
        android:name="com.itheima.mobile47.AntiVirusActivity"
        android:configChanges="orientation|screenSize|keyboardHidden" >
    </activity>
    

    MainActivity+case 5 手机杀毒

    布局:activityantivirus.xml

    activityantivirus.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            style="@style/textview_title_style"
            android:text="病毒查杀" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <FrameLayout
                android:layout_width="80dip"
                android:layout_height="80dip" >
    
                <ImageView
                    android:layout_width="80dip"
                    android:layout_height="80dip"
                    android:src="@drawable/ic_scanner_malware" />
    
                <ImageView
                    android:id="@+id/iv_scan"
                    android:layout_width="80dip"
                    android:layout_height="80dip"
                    android:src="@drawable/act_scanning_03" />
            </FrameLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="80dip"
                android:gravity="center"
                android:orientation="vertical" >
    
                <TextView
                    android:id="@+id/tv_scan_status"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="扫描状态"
                    android:textSize="20sp" />
    
                <ProgressBar
                    android:id="@+id/pb_scan"
                    android:layout_width="fill_parent"
                    android:layout_height="15dip"
                    android:layout_marginLeft="20dip"
                    android:layout_marginRight="20dip"
                    android:indeterminateOnly="false"
                    android:progressDrawable="@drawable/progress_horizontal" />
            </LinearLayout>
        </LinearLayout>
    
        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
    
            <LinearLayout
                android:id="@+id/ll_container"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical" >
            </LinearLayout>
        </ScrollView>
    
    </LinearLayout>
    


    布局:主要是雷达动画和进度条


    给scanning的ImageView图片加上旋转的动画 图片沿着自己的中心点旋转:

    iv_scan = (ImageView) findViewById(R.id.iv_scan);
    RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    ra.setRepeatCount(Animation.INFINITE);
    ra.setDuration(2000);
    iv_scan.startAnimation(ra);
    

    给病毒数据库新建数据库dao(分析下数据库:)


    sql查询语句:

    select desc from datable where md5 = "2222"  --->空:不存在病毒   有:存在病毒
    

    AntiVirusdao.java

    public class AntiVirusDao {
        private static final String path ="/data/data/com.itheima.mobile47/files/antivirus.db";
    
        /**
         * 查询病毒数据库,
         * @param md5 应用程序的特征码 
         * @return 不为空是病毒描述,null不是病毒
         */
        public static String find(String md5){
            String desc = null;
            SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
            Cursor cursor = db.rawQuery("select desc from datable where md5=?", new String[]{md5});
            if(cursor.moveToNext()){
                desc = cursor.getString(0);
            }
            cursor.close();
            db.close();
            return desc;
        }
    }
    

    AntiVirusActivity.java-->scanVirus();//杀毒 把MD5Util工具类写好

    1、拿到系统里所有应用的包数据集合
    2、遍历他们,并配合上一节课的示例代码:获取特征码
    3、获取某个路径文件的MD5值(特征码)
    4、那该md5值和数据库做对比(空:不是病毒,不空:是病毒)
        for循环发现如果是病毒:画面的变化
    

    MD5Util.java

    public class MD5Util {
    
        public static String encode(String result) {
            try {
                StringBuilder sb = new StringBuilder();
                // 设置加密摘要
                MessageDigest digest = MessageDigest.getInstance("md5");
                byte[] digests = digest.digest(result.getBytes());
                for (byte b : digests) {
                    // 获取到低八位
                    int number = b & 0xff;
                    String hex = Integer.toHexString(number);
    
                    if (hex.length() == 1) {
                        sb.append("0" + hex);
                    } else {
                        sb.append(hex);
                    }
                }
                return sb.toString();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return "";
        }
    
        /**
         * 获取某个路径文件的md5值
         * 
         * @param path
         *            文件路径
         * @return md5值
         */
        public static String getFileMd5(String path) {
            try {
                // 1.获取一个数字摘要器
                MessageDigest digest = MessageDigest.getInstance("md5");
                File file = new File(path);
                FileInputStream fis = new FileInputStream(file);
                // 2.循环的读取文件的每一个byte,获取每个byte的数字签名
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fis.read(buffer)) != -1) {
                    digest.update(buffer, 0, len);
                }
                fis.close();
                StringBuffer sb = new StringBuffer();
                byte[] result = digest.digest();
                for (byte b : result) {
                    // 获取到低八位
                    int number = b & 0xff;
                    String hex = Integer.toHexString(number);
    
                    if (hex.length() == 1) {
                        sb.append("0" + hex);
                    } else {
                        sb.append(hex);
                    }
                }
                return sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
    
        }
    }
    

    AntiVirusActivity.java

    public class AntiVirusActivity extends Activity {
        protected static final int ISVIRUS = 1;
        protected static final int NOVIRUS = 2;
        protected static final int FINISH = 3;
        private ImageView iv_scan;
        private ProgressBar pb_scan;
        private PackageManager pm;
        private LinearLayout ll_container;
        private TextView tv_scan_status;
        private Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case ISVIRUS:
                    tv_scan_status.setText("正在扫描");
                    PackageInfo packinfo = (PackageInfo) msg.obj;
                    TextView tv1 = new TextView(getApplicationContext());
                    tv1.setTextColor(Color.RED);
                    tv1.setText("发现病毒:"+packinfo.applicationInfo.loadLabel(pm));
                    ll_container.addView(tv1, 0);
                    break;
                case NOVIRUS:
                    tv_scan_status.setText("正在扫描");
                    PackageInfo packinfo2 = (PackageInfo) msg.obj;
                    TextView tv2 = new TextView(getApplicationContext());
                    tv2.setTextColor(Color.GREEN);
                    tv2.setText("扫描安全:"+packinfo2.applicationInfo.loadLabel(pm));
                    ll_container.addView(tv2,0);
                    break;
                case FINISH:
                    iv_scan.clearAnimation();
                    tv_scan_status.setText("扫描完毕");
                    break;
                }
            };
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            pm = getPackageManager();
            setContentView(R.layout.activity_anti_virus);
            iv_scan = (ImageView) findViewById(R.id.iv_scan);
            pb_scan = (ProgressBar) findViewById(R.id.pb_scan);
            ll_container = (LinearLayout) findViewById(R.id.ll_container);
            tv_scan_status = (TextView) findViewById(R.id.tv_scan_status);
            RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            ra.setRepeatCount(Animation.INFINITE);
            ra.setDuration(2000);
            iv_scan.startAnimation(ra);
            scanVirus();
        }
        //耗时的操作
        private void scanVirus() {
            new Thread(){
                public void run() {
                    PackageManager pm = getPackageManager();
                    //添加一个flag 把系统所有的文件都扫描出来 包括哪些没有卸载干净的 还保留有数据的应用程序
                     List<PackageInfo>  packinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
                     pb_scan.setMax(packinfos.size());
                     int progress = 0;
                     for(PackageInfo packinfo:packinfos){
                         String path = packinfo.applicationInfo.sourceDir;
                         String md5 = MD5Util.getFileMd5(path);
                         System.out.println(md5);
                         String desc = AntiVirusDao.find(md5);
                         Message msg = Message.obtain();
                         if(desc!=null){
                             //是病毒
                             msg.what = ISVIRUS;
                         }else{
                             //扫描安全
                             msg.what = NOVIRUS;
                         }
                         msg.obj = packinfo;
                         handler.sendMessage(msg);
                         progress++;
                         pb_scan.setProgress(progress);
                         try {
                            Thread.sleep(30);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                     }
                     Message msg = Message.obtain();
                     msg.what =FINISH;
                     handler.sendMessage(msg);
                };
            }.start();
    
        }
    }
    


    课3

    实现查杀出来的病毒文件的删除

    给scanVirus();来个线程睡眠,让杀毒不要杀得太快。 显示在查杀病毒时横竖屏切换所显示的bug:横竖屏切换又重新来查杀一遍(因为这样使Activity重新创建了一遍):修改清单文件

    <activity
        android:name="com.itheima.mobile47.AntiVirusActivity"
        android:configChanges="orientation|screenSize|keyboardHidden" >
    </activity>
    

    更新病毒库功能:


    在金山的病毒数据库里有一个version的表:


    更新的流程:

    1、首先连接服务器匹配服务器的数据库版本号和金山的病毒数据库里version的表的版本号是否一样 2、不一样的话,就从服务器下载json数据,然后把里面的对象数据导出来,使用更新SQL语句:更新到我们的数据库中。

    activitysettingcenter.xml

    <TextView
        android:onClick="updateVirusDB"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@drawable/list_selector"
        android:clickable="true"
        android:enabled="true"
        android:focusable="true"
        android:text="更新病毒数据库"
        android:textSize="24sp" />
    

    SettingCenterActivity.java里updateVirusDB()//更新病毒数据库

    /**
     * 更新病毒数据库。
     * @param view
     */
    public void updateVirusDB(View view){
        //1.获取本地病毒数据库的版本号
        //获取subcnt
    
        //2.联网获取服务器的配置信息。
        //serversubcnt
    
        //3.比对 serversubcnt 和 本地subcnt的大小。
    
        //4.如果服务器端serversubcnt 比 本地subcnt要大 说明有新的病毒信息需要更新。
    
    
        //5.计算本地版本和服务器版本的差异大小, 假设相差5个版本号 
    
        //6.带着这个版本号差别请求服务器 获取更新信息
        //压缩后的sql语句。
    
        //7.解压sql语句,添加数据到数据到本地数据库。 
    }
    

    实现病毒卸载的功能:在查到的前提下,也不实现了

    解决手机卫士的边边角角的小问题

    1、屏幕适配问题:


    AppManagerActivity.java--->popupWindow 我们编程时用像素编程:那么会有各种手机屏幕不适配的问题:那么我们的像素单位要讲究:

    view.getLocationInWindow(location);// 获取了view对象在窗体上的位置
    //50 px  像素,注意: 在代码里面写的所有的长度单位 全部都是像素
    //dp dip 像素密度。屏幕宽高和像素的一个比例值。
    int dip = 50;
    int px = DensityUtil.dip2px(getApplicationContext(), dip);
    System.out.println(px);
    popupWindow.showAtLocation(parent, Gravity.LEFT
            + Gravity.TOP,px , location[1] - 15);
    

    拷贝了一个DensityUtil的工具类:

    DensityUtil.java

    public class DensityUtil {
        /**
         * 根据手机的分辨率从 dip 的单位 转成为 px(像素)
         */
        public static int dip2px(Context context, float dpValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        }
    
        /**
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
         */
        public static int px2dip(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        }
    }
    

    处理像素后:


    2、水平低的程序员写出的项目中的死循环中打印的log太多,可能泄露用户信息。


    我们变成时需要约定一个方式来打印log,那么不同人接触项目时可以自由地开启或禁用掉log LogUtil.java

    public class LogUtil {
    
        public static final boolean mode = true;
    
        public static void d(Object obj,String msg){
            if(mode){
                Log.d(obj.getClass().getSimpleName(), msg);
            }
        }
    }
    

    3、开发周期短时市面上的app一般测试版上线或带病上线怎么办

    SettingCenterActivity.java模拟空指针异常:


    这是应用还没发布是的小问题 如果这种问题已经随同app一起上线了,怎么办?

    在app里加一个功能:收集用户问题 新建MobileSafeApplication.java继承Applition+配置清单文件,这样去抓取异常出现时弹出的系统终止框的信息,这样可以获取用户体验app时出现问题时获取问题的信息

    重写用户app的异常处理器

    MobileSafeApplication.java

    /**
     * 注意:一定要记得在清单文件中配置
     * @author Administrator
     *
     */
    public class MobileSafeApplication extends Application {
        //Called when the application is starting当应用程序被开启的时候调用
        //before any other application objects have been created
        @Override
        public void onCreate() {
            //老母子的方法。 基地
            //重新系统的异常处理器
            Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander());
            super.onCreate();
        }
    
        private class MyExceptionHander implements UncaughtExceptionHandler{
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                //留下了 留下遗嘱的时间
                System.out.println("发生了异常,但是被我们给捕获了。。");
                try {
                    StringWriter wr = new StringWriter();
                    PrintWriter pw = new PrintWriter(wr);
                    ex.printStackTrace(pw);
                    File file = new File(Environment.getExternalStorageDirectory(),"error.log");
                    FileOutputStream fos = new FileOutputStream(file);
                    fos.write(wr.toString().getBytes());
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //专注自杀的方法,就是杀死自己的进程, 早死早超生
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        }
    }
    


    这过程可以把异常捕获到后写到了sd卡里的log文件里,这样可以让用户反馈回来给我们调错排错。


    然后考虑到用户体验:加入以下代码:


    课4

    介绍目前市面上公司的盈利模式

    公司盈利模式+

    1、做自己的产品

    1.互联网公司  30%
    2.传统行业(想通过互联网让客户更多,跨界)
    3.游击队(什么赚钱搞什么,一般老板不懂技术,有钱,风险投资vc),占50%,为什么占这么多?
    

    以下是为什么游击队生产模式占app市场份额这么大

    App类型:

    1、App付费:在中国行不通,破解,可以发布到欧美市场,go桌面。
    
    2、App内付费:腾讯天天跑酷。
    
    3、免费应用带免费广告:cnbeta.com
        广告类型:
            1、cpm: 有效展现率 千次展现1块5。和派传单的原理差不多
            2、cpc: 有效点击率(点进了网页)  1毛钱~3毛钱
            3、cpa:有效行动(进了淘宝连接并且真的买了里面的东西) 5毛~几十块
    
    一个App如果有20万的用户:20万的下载量,两年内,30%保有量:20万其中的6万用户,小游戏。30分钟过关,这么多人就一共120分钟 * 3 (3代表展现广告的次数) = 3600000展现 
    一天就1670元。所以一个活跃的app每天5000上下没问题。黑马学生(刘福双):600万谷歌下载量,3000美金1天。
    


        蓝海:app找到了一个新开发的需求领域,现实生活中别人没人干过的事情。
    
        红海:懂得操作,csdn蒋涛:看哪个游戏火就做哪个,其中可能就火了。
    
        移动互联网思维:对红海的反思维,哪些需求赚钱就逆其道而行之,百度一下,有趣!
    
    App赚钱需求:
        1、女人爱美类
    
        2、男人好色类
    
        3、婴幼儿教育类:国外
    
        4、老人类软件。Eg:BigLauncher
    
        5、特殊人群:魔兽攻略,lol攻略之类。
    

    2、外包公司 软通动力 博廖科技

    1.外包人
    2.外包项目:带来问题,被一层一层外包,不用心
    如何在app里嵌入广告 
    

    百度上搜:移动广告平台,很多广告接口提供 百度移动联盟:老师推荐 有米:老师推荐

    植物大战僵尸项目:对我们找工作帮助不大,但是对我们了解开发游戏开发app有帮助。

    课5

    谷歌市场对中国程序员开放了


    老师植入广告挣钱效果


    演示在项目中植入广告

    有米网



    1、下载sdk


    2、把文档里的jar包烤进来


    3、读开发者文档:需要配置的权限


    4、配置广告的组件:


    5、加标签:


    6、MainActivity里植入代码:


    MainActivity.java

    AdManager.getInstance(this).init("847377901819a2fb", "f2c5d51b6066058c", true);
    setContentView(R.layout.activity_main);
    initView();
    sp = getSharedPreferences("config", MODE_PRIVATE);
    // 实例化广告条
    AdView adView = new AdView(this, AdSize.FIT_SCREEN);
    
    // 获取要嵌入广告条的布局
    LinearLayout adLayout=(LinearLayout)findViewById(R.id.adLayout);
    
    // 将广告条加入到布局中
    adLayout.addView(adView);
    


    7、调用方法:


    具体方法查开发者文档。

    8、activity_main.xml和MainActivity加入代码(布局和方法):


    测试:


    如何发布app


    体力活:需要拍照,身份证认证,两三天的审核,上传应用,平台检查apk是否带广告

    想办法推广。软玩推广,

    打品牌:减少别人山寨的几率。逆向助手:抄布局,抄代码,反编译

    怎么防止反编译。(重要)

    解决方案:

    百度apk防止反编译:
    


    项目中的project.properties,混淆代码来保护apk隐私


    把路径下的文件复制到项目中,并修改代码:


    然后发布app,这app就是加密了的apk了。但是我们项目里的有米代码已经混淆过了,所以以下步骤


    可以避免我们项目加密过程的报错


    混淆:动态的全局替换类名方法名和变量名


    课6

    混淆后的apk不一定好用

    测试:如果app里面含有一些特殊的逻辑,那么apk可能有问题


    资料下载

    展开全文
  • 教程名称:Android项目手机卫士视频video 目标:快速积累开发经验,具备中级Android工程师能力。如遇到难以理解的逻辑或功能,可以先将程序打断点观察程序的执行逻辑。第一章项目简介:欢迎界面、主界面第二章手机...
  • 360手机安全卫士源码 实现自己的Android手机卫士包括手机防盗,病毒查杀,软件管理,高级设置,流量监控等9大功能模块
  • 手机卫士-听课笔记-1

    2016-05-24 07:34:00
    代码组织结构 根据功能模块划分Activity Service Broadcast Receiver Database JavaBean Custom View Utils 业务逻辑 代码的组织结构分为三大组件(框架层)数据层和自定义界面层。这样分割的原因是安卓软件并不负责...

    代码组织结构

    • 根据功能模块划分

      • Activity
      • Service
      • Broadcast Receiver
      • Database
      • JavaBean
      • Custom View
      • Utils
      • 业务逻辑

    代码的组织结构分为三大组件(框架层)数据层和自定义界面层。这样分割的原因是安卓软件并不负责复杂的逻辑业务处理,而是重在任务处理。所以一般根据功能模块划分。

    项目的创建过程
    在导入项目中显示出渲染错误

    在项目的创建过程中有这种错误,错误产生的原因是由于选定的SDK和编译器的SDK版本不同所致。解决办法是选择渲染所需要的版本如下图所示
    这里写图片描述

    经过上面的步骤我们已经完成了程序的基本创建,下面我们来做闪屏页面

    闪屏页面的作用可以分为以下

    • 展示logo
    • 项目初始化
    • 检测版本更新
    • 校验程序合法性

    在AndroidStudio中Ctrl +Alt + V 自动补全方法并生成返回变量。

    Tomcat 服务器的安装

    下载并安装服务器

    把服务器内的需要的资源放在ROOT目录下。

    查看本机的IP地址

    ipconfig | findstr IPv4

    展开全文
  • 360手机卫士经典案例分析

    千次阅读 2017-02-09 15:20:04
    对360手机卫士在保持和吸引顾客方面的独特之处进行了研究,从360手机卫士产品本身,到与产品有关的一系列渠道、定价和促销的营销组合,分析360手机卫士给顾客传递和传播的价值,并结合顾客感知价值这一个分析框架,...
  • 黑马android项目手机卫士视频教程 黑马android项目手机卫士视频教程
  • Android 手机卫士开篇

    2017-09-13 21:34:55
    接下来一段时间,我将会拿一个手机卫士练练手【毕竟好久没写了】,途中有所心得体会之处我会分享给大家!可能有一些初学者,还不是很清楚如何开发,用什么开发! 不用着急,我会从开发环境的搭建着手进行讲解~现在...
  • 仿360手机卫士的实现的目的更多的是出于对常用知识点的一个巩固吧,比较适合像我这种接触没多久的学习者在学习之余拿来练手保持写代码的感觉的的一个不错的小项目。   涉及的技术:  都是些非常常用的android...
  • 关于黑马手机卫士的学习总结

    千次阅读 2017-02-26 10:32:37
    经过一个多月的不懈努力,终于完成了这个手机卫士的项目。时间都是挤出来的,不容易啊。现在稍稍的总结一下,分享给大家http://pan.baidu.com/s/1jIhtrIu (一)splash界面 1,网络访问数据  HttpUtils 异步...
  • 基于Android的手机卫士开发-毕业论文
  • 近日来,我在倒腾360手机卫士的时候,发现,你无论是把他数据清空,还是把它强行停止以后,甚至是把它卸载以后,它的service都没有被Android的系统干掉,依然是岿然不动了。我就感到了纳闷了,后来和群里的大牛讨论...
  • 传智播客_Andorid_Android项目手机卫士视频video_手机卫士第9天视频修正.zip
  • 手机卫士源码分享

    2020-07-23 23:30:35
    手机卫士源码分享 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
  • 该项目涵盖了市场上主流手机卫士的主要功能,同时,该项目也是对Android应用程序开发知识的综合应用。通过对案例的解析,使Android应用开发人员在实际开发中少走弯路,快速而轻松地积累实战项目经验。
  • 简单手机卫士源码.zip

    2020-03-23 23:33:03
    简单手机卫士源码带服务器端是一款模仿安全卫士的源码,功能包括程序进程管理、手机防盗、联系人备份换号、软件管理、下载管理和流量管理等部分还有一个鸡肋的天气查询功能。  
  • ## 手机卫士Day02 ## - 主页面GridView搭建    android:layout_width="match_parent"    android:layout_height="50dp"    android:text="功能列表"    android:background="#8866ff00"    android:t
  • 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话。 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多高手喜欢...
  • 高仿360手机卫士——Android源码

    千次阅读 2015-09-01 09:20:30
    高仿360手机卫士界面android源码,左右滑动效果,超炫。
1 2 3 4 5 ... 20
收藏数 7,721
精华内容 3,088
关键字:

手机卫士