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 blocke.printStackTrace();}return "";}
4) 细节界面处理
- 使手机最上面的主题条不显示
在清单文件中,将主题进行修改 原始为:
<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >
修改为:
<applicationandroid:theme="@android:style/Theme.Black.NoTitleBar"
- 字体加阴影
一般需要给显示字体指定颜色,英文不同版本默认颜色不同;同时还有大小;最终效果见上面的图。
<TextViewandroid: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数据及解析 并弹窗提示更新
流程图:
将会涉及到的内容:
- 获取项目自身版本信息 PackageManager、PackageInfo
- 网络获取数据 URL 、HttpsURLConnection(需要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();//利用自己编写的工具类将输入流转换成StringString 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发送到HandlermHandler.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() {@Overridepublic void publish(LogRecord record) {// TODO Auto-generated method stub......}@Overridepublic void flush() {// TODO Auto-generated method stub......}@Overridepublic void close() {// TODO Auto-generated method stub......}
};
大致编写代码如下:
private Handler mHandler = new Handler() {public void handleMessage(android.os.Message message) {// TODO Auto-generated method stubswitch (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() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubSystem.out.println("立马更新"); ......}});uBuilder.setNegativeButton("以后再说", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubSystem.out.println("以后再说");......}});uBuilder.show();
}
Android之手机卫士相关推荐
- Android之手机卫士涉及的知识点总结
手机卫士涉及的知识点总结 Splash界面 splash: 溅,洒 展现产品的logo提升产品的知名度 初始化操作(创建数据库,读取配置文件) 连接服务器检查软件授权 连接服务器检查软件的更新 自动更 ...
- Android 《手机卫士》随听笔记
<手机卫士>随听笔记: 防止子控件抢占父控件焦点: android:descendantFocusability="blocksDescendants" 加layout ...
- android 百度手机卫士 卸载,百度卫士卸载方法汇总
很多用户比较习惯使用360杀毒软件,一些用户也下载安装使用百度卫士了,但总觉得没有360杀毒软件好用,安装有两个软件那肯定是非常不爽的.那要怎么卸载百度卫士呢?下面小编 介绍百度卫士卸载方法汇总. 方 ...
- 专访刘刚:360手机卫士的性能监控与优化
作为一款移动端产品,除了要保证安全性之外,手机卫士还需要考虑尽量减少对手机资源的消耗,而要做到这些,360手机卫士对于自身的性能优化.性能监控,以及对不同产品的适配问题,有哪些改进之处值得我们借鉴呢? ...
- 金山android 杀毒软件,金山手机卫士
金山手机卫士正式版是款专门为安卓手机安全所打造的手机保护工具.金山手机卫士最新版中通过检查系统漏洞,扫描风险软件,检查扣费记录等解除您的手机安全隐患,保证Android手机及话费安全.金山手机卫士同时 ...
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码...
Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...
- android确认密码代码,Android手机卫士之确认密码对话框
本文接着实现"确认密码"功能,也即是用户以前设置过密码,现在只需要输入确认密码 布局文件和<Android 手机卫士--设置密码对话框>中的布局基本类似,所有copy一 ...
- android 360旋转动画,ANDROID——仿360手机卫士的旋转打分控件
简介 灵感源自360手机卫,主要功能就是实现显示评分或等级的效果.并稍微改良了一下,有更好的实用性和扩展性. 因为主要用途就是显示"分数","评价",所以暂且叫 ...
- android 短信位置,浅析Android手机卫士之手机实现短信指令获取位置
推荐阅读: 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreate()方法,服务创建的时候回调 重写onDestroy ...
最新文章
- 月薪30K+的程序员都会啥,通过3000字告诉你……
- 管理系统中计算机应用知识总结,自考《管理系统中计算机应用》章节知识点复习:管理信息...
- SQL语句行列转换两种方法 case ...when 和pivot函数应用
- 二值神经网络(Binary Neural Networks)最新综述
- Spring Security(四) —— 核心过滤器源码分析
- Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)...
- ubuntu14.04安装tensorflow-gpu
- GC Roots 是什么?哪些对象可以作为 GC Root
- android dagger2 原理,Dagger2 系列(四)Dagger2.Android基本原理
- studio 3T 使用
- 微信 商户号证书申请 微信支付系统部署
- 雪狐密码箱PwdBox记录导出
- CodeForces - 106C Buns (多重背包二进制优化)
- cmd怎么实现隐藏DOS窗口运行程序
- ASEMI整流二极管MR754参数,MR754图片,MR754应用
- 块数据传输程序:将由src单元开始的20个字,转存到由dst开始的单元中(带详细注释)
- 深入浅出Java线程池:理论篇
- 机器人电焊电流电压怎么调_电焊电流的调节技巧
- 融云即时通讯后续:产品需求与融云的碰撞
- 中国实验室管理系统行业研究与未来预测报告(2022版)
热门文章
- 蓝桥杯单片机省赛第三届初赛试题 自动售水机
- CVPR2021 - Inception Convolution with Efficient Dilation Search
- simply-ellipsis简单易用,功能强大的tooltip工具
- 论文笔记006-《Bootstrapping Entity Alignment with Knowledge Graph Embedding》
- Android View系统分析之二View与ViewGroup
- 改IP(谷歌翻译器国内用不了)修改host,亲测有效
- 免费推广B2C独立站的技巧
- 数理逻辑蕴含_彻底弄懂充要,必要,充分但不必要,必要但不充分以及数理逻辑中的蕴含...
- 03_TemplateMethod-笔记
- 10亿赌局,雷军输了。