- 根据代码的类型组织包结构

1. 界面 com.hb.mobilesafe.activities

2. 服务 com.hb.mobilesafe.services

3. 业务逻辑 com.hb.mobilesafe.engine

4. 数据库 com.hb.mobilesafe.db

5. 数据库增删改查 com.hb.mobilesafe.db.dao

6. 工具类 com.hb.mobilesafe.utils

7. 自定义view com.hb.mobilesafe.ui

###3.splash界面的作用

1. 展现产品的logo,提升产品的知名度.

2. 初始化应用程序的数据.

3. 连接服务器,查找可更新的版本,自动更新

4. 用户操作指南

5. 新版本特性提醒

4.布局文件的命名规则

SplashActivity--->activity_spalsh.xml

XxxActivity---> activity_xxx.xml

###5.获取应用程序版本号

//用PackageManager拿到PackageInfo,PackageInfo中的versionName

PackageInfo packinfo = context.getPackageManager().getPackageInfo(

context.getPackageName(), 0);

String version = packinfo.versionName;

###6.源代码版本控制

- 安装VisualSVN Server——SVN服务器,一直下一步即可

- 导入仓库到服务器

1.在Repositories处右键,选择Import Existing Repository

2.选择Copy repository from another location,下一步

3.点击Browse,选择仓库路径,"代码/代码仓库/Repository/mobilesafe",点击下一步

4.点击Import

5.点击Finish,导入完成

- 安装TortoiseSVN——SVN客户端,一直下一步即可

1.在想要检出代码的地方右键,选择SVN Checkout

2.URL of repository处填https://127.0.0.1/svn/mobilesafe/,地址也可以从SVN服务器的mobilesafe处右键选择Copy URL to clipboard拷贝

3.Checkout directory出填写检出代码要放的位置,然后点击OK

4.完成代码的检出

- 将代码更新到指定版本

1.mobilesafe文件夹出右键,选择Update to version

2.点击show log

3.点击左下角的show all

4.选择要更新的版本,点击OK

5.版本更新完成

###7.应用自动更新的逻辑图

![](http://i.imgur.com/EU78wXt.png)

###8.获取服务器版本号

//获取服务器地址

String path = getResources().getString(R.string.url);

URL url = new URL(path);

//创建网络连接

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setRequestMethod("GET");

conn.setConnectTimeout(5000);

//发出请求,获得返回码

int code = conn.getResponseCode();

if(code ==200){

//获取服务器返回的流并进行解析

InputStream is = conn.getInputStream();

String result = StreamTools.readStream(is);

//转化为json并解析出版本号

JSONObject json = new JSONObject(result);

String serverVersion = json.getString("version");

Log.i(TAG,"服务器版本:"+serverVersion);

}

###9.将流转化为字符串

public static String readStream(InputStream is) throws IOException{

//ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型数组的缓冲区,缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString()获取数据

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while((len = is.read(buffer))!=-1){

baos.write(buffer, 0, len);

}

is.close();

return baos.toString();

}

###10.弹出对话框

1.使用AlertDialog.Builder

2.设置标题、信息、点击事件等

3.调用show方法显示出来,调用dismiss方法消失

###11.下载apk

1.使用开源框架xUtils

2.使用HttpUtils的download方法,填入三个参数:服务器下载地址,手机中的存储位置、回调事件

3.回调事件中有三个常用的方法:onSuccess下载成功、onFailure下载失败、onLoading更新下载进度

xUtils补充

http://my.oschina.net/u/1171837/blog/147544 作者博客

###12.安装apk

1.调用系统的安装apk的界面,传入对应的参数

2.具体实现方式

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.DEFAULT");

intent.setDataAndType(

Uri.fromFile(fileinfo.result),

"application/vnd.android.package-archive");

startActivity(intent);

###13.应用程序的覆盖安装要满足的条件

1. 两个版本签名一致

2. 两个版本包名一致

###14.跑马灯效果的TextView

1. 系统的TextView不能获取焦点,使用自定义控件

2. 继承TextView控件,重写isFocused方法,直接返回true,让其获取焦点

3. 设置android:ellipsize="marquee"

###15.旋转的弘博logo

1. 使用系统提供的属性动画

2. 具体实现方式

ObjectAnimator oa = ObjectAnimator.ofFloat(iv_home_logo, "rotationY",

45, 90, 135, 180, 225, 270, 315);

oa.setDuration(3000);

oa.setRepeatCount(ObjectAnimator.INFINITE);

oa.setRepeatMode(ObjectAnimator.RESTART);

oa.start();

贴上对应的源码:

1 packagecom.hb.mobilesafe.activities;2

3 importjava.io.File;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.io.InputStream;7 importjava.net.HttpURLConnection;8 importjava.net.URL;9

10 importorg.json.JSONObject;11

12 importandroid.app.Activity;13 importandroid.app.AlertDialog;14 importandroid.app.AlertDialog.Builder;15 importandroid.app.ProgressDialog;16 importandroid.content.DialogInterface;17 importandroid.content.DialogInterface.OnClickListener;18 importandroid.content.Intent;19 importandroid.content.SharedPreferences;20 importandroid.content.res.AssetManager;21 importandroid.net.Uri;22 importandroid.os.Bundle;23 importandroid.os.Environment;24 importandroid.os.Handler;25 importandroid.os.Message;26 importandroid.os.SystemClock;27 importandroid.view.Window;28 importandroid.widget.TextView;29 importandroid.widget.Toast;30

31 importcom.hb.demo_mobilesafe.R;32 importcom.hb.mobilesafe.utils.GetVersonName;33 importcom.hb.mobilesafe.utils.ReadStrem;34 importcom.lidroid.xutils.HttpUtils;35 importcom.lidroid.xutils.exception.HttpException;36 importcom.lidroid.xutils.http.ResponseInfo;37 importcom.lidroid.xutils.http.callback.RequestCallBack;38

39 public class SplashActivities extendsActivity {40 protected static final int SUCCESS = 1;41 protected static final int ERROR = 2;42 privateTextView tv_splash_version;43 privateString localVersion;44 privateString serviceVerson;45 privateString apkpath;46 privateString descritoin;47 private Handler handler=newHandler(){48 public voidhandleMessage(android.os.Message msg) {49 switch(msg.what) {50 caseSUCCESS:51 //判断出的版本号不一样进行升级

52 builderLoading();53 break;54

55 caseERROR:56 Toast.makeText(SplashActivities.this, "错误信息:"+msg.obj, 0).show();57 loadUI();58 break;59 }60 }61

62

63 };64

65 @Override66 protected voidonCreate(Bundle savedInstanceState) {67 super.onCreate(savedInstanceState);68 requestWindowFeature(Window.FEATURE_NO_TITLE);69 setContentView(R.layout.activity_splash);70 tv_splash_version =(TextView) findViewById(R.id.tv_splash_version);71 SharedPreferences sp=getSharedPreferences("config", MODE_PRIVATE);72 //获取开关状态判断是否进行升级提示

73 boolean tag = sp.getBoolean("update", true);74 if(tag){75 initDate();76 }else{77 newThread(){78 public voidrun() {79 SystemClock.sleep(1500);80 loadUI();81 };82 }.start();83 }84 localVersion = GetVersonName.version(this);85 tv_splash_version.setText("版本号:"+localVersion);86 //初始化导入数据库到手机

87 importDataBase("antivirus.db");88

89 }90 //初始化导入数据库到手机

91 private voidimportDataBase(String fileName) {92 File file=newFile(getFilesDir(), fileName);93 if(file.exists() && file.length()>0){94 return;95 }96 try{97 AssetManager assets =getAssets();98 InputStream is=assets.open(fileName);99 FileOutputStream fs=newFileOutputStream(file);100 int len=-1;101 byte [] arr=new byte[1024];102 while ((len =is.read(arr))!=-1) {103 fs.write(arr, 0, len);104 }105 fs.close();106 is.close();107 } catch(IOException e) {108 //TODO Auto-generated catch block

109 e.printStackTrace();110 }111 }112

113 private voidinitDate() {114

115 newThread(){116

117 private longstart;118 privateMessage message;119 public voidrun() {120 String path=getResources().getString(R.string.path);121

122 try{123 URL url = newURL(path);124 HttpURLConnection conn =(HttpURLConnection) url.openConnection();125 conn.setConnectTimeout(5000);126 conn.setRequestMethod("GET");127 int code =conn.getResponseCode();128 if(code == 200){129 InputStream stream =conn.getInputStream();130 String json =ReadStrem.readSreamUtil(stream);131 JSONObject ob=newJSONObject(json);132 serviceVerson = ob.getString("verson");133 descritoin = ob.getString("descritoin");134 apkpath = ob.getString("apkpath");135 start=SystemClock.currentThreadTimeMillis();136 /**

137 * 进行本地版本与服务器版本的对比138 */

139 if(localVersion.equals(serviceVerson)){140 //不需要升级直接调转141 //loadUI();

142 }else{143 message = newMessage();144 message.what=SUCCESS;145 handler.sendMessage(message);146

147

148 }149 }150

151 } catch(Exception e) {152 e.printStackTrace();153 message = newMessage();154 message.what=ERROR;155 message.obj="code:404";156 handler.sendMessage(message);157

158 }finally{159 long end=SystemClock.currentThreadTimeMillis();160 long et=end-start;161 if(et>2000){162 }else{163 SystemClock.sleep(2000-et);164 }165

166 }167 }168

169

170 }.start();171 }172 /**

173 * 更新UI174 */

175 private voidloadUI() {176 Intent intent=new Intent(SplashActivities.this, HomeActivities.class);177 startActivity(intent);178 finish();179 };180 //提示用户升级

181 private voidbuilderLoading() {182 AlertDialog.Builder alert=new Builder(SplashActivities.this);183 alert.setTitle("版本升级提示");184 alert.setCancelable(false);//设置锁定其他界面点击事件

185 alert.setMessage(descritoin);186 //alert.setIcon(R.drawable.);

187 alert.setPositiveButton("立刻升级", newOnClickListener() {188

189 privateProgressDialog pd;190

191 @Override192 public void onClick(DialogInterface dialog, intwhich) {193 Toast.makeText(SplashActivities.this, "升级吧", 0).show();194 pd = new ProgressDialog(SplashActivities.this);195 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);196 pd.show();197

198 HttpUtils utils=newHttpUtils();199 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){200 //获取SD卡的对象

201 File sd=Environment.getExternalStorageDirectory();202 File file=new File(sd, SystemClock.currentThreadTimeMillis()+".apk");203 utils.download(apkpath, file.getAbsolutePath(),new RequestCallBack(){204

205 @Override206 public voidonFailure(HttpException arg0, String arg1) {207 pd.dismiss();208 }209

210 @Override211 public void onSuccess(ResponseInfoarg0) {212 pd.dismiss();213 //安装APP

214 Intent intent=newIntent();215 intent.setAction("android.intent.action.VIEW");216 intent.addCategory("android.intent.category.DEFAULT");217 intent.setDataAndType(218 Uri.fromFile(arg0.result),219 "application/vnd.android.package-archive");220 startActivity(intent);221 finish();222 }223

224 @Override225 public void onLoading(long total, longcurrent,226 booleanisUploading) {227 pd.setMax((int)total);228 pd.setProgress((int)current);229 super.onLoading(total, current, isUploading);230 }231 });232

233 }234 }235 });236 alert.setNegativeButton("下次再说", newOnClickListener() {237

238 @Override239 public void onClick(DialogInterface dialog, intwhich) {240 loadUI();241 }242 });243 alert.show();244

245 }246

247

248 }

布局文件:

android:id="@+id/tv_splash_version"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="15dip"android:textSize="16sp"android:text="版本号:1.0" />

给上这个项目中所需的所有权限不懂的可以百度一下:

java手机杀毒_Android项目实战_手机安全卫士splash界面相关推荐

  1. java手机杀毒_Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  2. 计算机在线给手机杀毒,怎么用电脑给手机杀毒(如果手机中病毒了怎么办)

    现在的手机病毒越来越多,比如下载什么软件或者进入了什么木马网站都有可能导致手机中毒的发生,那么手机中毒了怎么办呢?手机中毒的情况分很多种的,比如说比较好杀的毒,可以安装杀毒软件进行扫描.杀毒,如果是不 ...

  3. 计算机在线给手机杀毒,如何用电脑给手机杀毒

    如何用电脑给手机杀毒 在我们给手机杀毒的时候,我们的电脑上要安装杀毒软件,我这里使用的是360度杀毒.首先,我们要打开360杀毒.在打开360度杀毒后,我们用鼠标的左键点击自定义杀毒.下面是jy135 ...

  4. Java EE Web开发与项目实战_【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第一节)...

    312334546574820.jpg 序 前一段时间有很多朋友来问我各种问题,比如java怎么学,c,c++,c#,java,还有php等等,到底学哪个好,哪个好就业?其中不乏刚毕业找不到工作的学生 ...

  5. Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags 2. 0000 0000 0000 0000 0000 0000 ...

  6. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析 1.界面 1.1 黑名单列表界面 1.2 添加黑名单界面 2.功能 2.1 黑名单的添加.删除 2.2 拦截电话 2.3 拦截短信 ###2.黑名单数据库的创建 1.分析需 ...

  7. Android开发实战《手机安全卫士》——12.“手机杀毒”模块实现 病毒数据库

    文章目录 1.高级工具--程序锁(细节完善) 2.手机杀毒--界面分析 3.手机杀毒--病毒数据库查询过程 4.手机杀毒--初始化旋转动画 5.手机杀毒--遍历所有应用 & 判断是否为病毒 1 ...

  8. 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析

    Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...

  9. 如何用计算机给手机杀毒,怎么用手机给u盘杀毒

    很多人表示很迷茫,手上有手机,也有u盘,但不知道如何把这两者放在一起使用,或者给u盘杀毒,那么,怎么用手机给u盘杀毒呢?哪些移动存储设备可以传播病毒呢?今天我们就跟随佰佰安全网一起来了解关于这方面的网 ...

最新文章

  1. 黑鲨科学计算机,科学技术篇:玩家注意黑鲨一口气发布两款重磅新品
  2. java acm 母牛的故事_acm母牛的故事 的问题
  3. Key Components and Internals of Spring Boot Framework--转
  4. ALV OO的栏位属性
  5. hdu 5419(数学期望)
  6. 移动互联网时代 浏览器不可能干掉App
  7. 在.NET中执行Async/Await的两种错误方法
  8. linux添加硬盘永久挂载,linux新增硬盘如何挂载
  9. 【C++入门】C++多态
  10. 运输问题(模型建立、表上作业法、产销平衡、产销不平衡)
  11. 微信API接口访问慢
  12. 数学神童:让天赋更自由
  13. 计算机桌面文件删除不掉是怎么了,电脑删除不了文件怎么办?教你几种好的处理方法,一学就会...
  14. system函数的详细使用
  15. HTML鼠标悬停图片的动态效果,4种超酷鼠标滑过图片过渡动画特效
  16. Just Do It!
  17. python词云生成与设计实现_python简单词云生成
  18. 热烈欢迎中国照明网总经理丁云高一行莅临新起典考察交流
  19. 以昂扬的斗志,书写青春的热血
  20. 计算机一级考试操作题知识点,计算机一级考操作题知识点归纳.doc

热门文章

  1. 修改 IE 查看源文件默认工具
  2. pipe创建匿名管道`
  3. 斐波那契数列的递归实现
  4. Head First JSP---随笔八(传统标记)
  5. LBFT跨链共识机制
  6. Android处理崩溃的一些实践
  7. Android 8.0 中如何读取内部和外部存储以及外置SDcard
  8. Android 7.0 SystemUI 之启动和状态栏和导航栏简介
  9. Binder源码分析之ServiceManager(原)
  10. JZOJ 5344. 【NOIP2017模拟9.3A组】摘果子