1.分包
按照组件划分
组件类型 | 包名 |
---|---|
界面 | com.itheima.mobilesafe.activity |
自定义UI | com.itheima.mobilesafe.ui |
业务逻辑代码 | com.itheima.mobilesafe.engine |
数据库持久化 | com.itheima.mobilesafe.db, com.itheima.mobilesafe.db.dao |
广播接收者 | com.itheima.mobilesafe.receiver |
长期在后台运行 | com.itheima.mobilesafe.service |
公用的api工具类 | com.itheima.mobilesafe.utils |
2.版本类
versionname的含义
versionname=1.2.3
最后一位:代表修复原有版本bug
倒数第二位:更新部分功能
第一位:项目重大更新(代码重构,大部分功能添加,界面整体修改)
3.一系列骚操作
去标题头
高版本下不起作用
requestWindowFeature(Window.FEATURE_NO_TITLE);
或
清单文件中设置
android:theme="@android:style/Theme.Light.NoTitleBar">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@android:style/Theme.Light.NoTitleBar">
<activity android:name=".Activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
以上两者都有问题,以下为终极做法
在style.xml中配置item
true
ps:这个需要activity继承自Activity
4.获取版本号
androidStudio中应用的版本号是在build.gradle中获取,包括最大版本号,最小版本号,同事还需要在清单文件中设置版本号
清单文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fengray.ex088safety"
android:versionCode="2"
android:versionName="2.0.0">
build.gradle文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.fengray.ex088safety"
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
java文件
获取版本名称及版本号的逻辑
/**
*获取版本好:清单文件中
* @return 应用版本名称 返回0代表异常
*/
private int getVersionCode() {
//创建包管理者对象
PackageManager packageManager = getPackageManager();
//从管理者对象中,获取指定包名的基本信息
try {
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(),0);
int version_code=packageInfo.versionCode;
return version_code;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
*获取版本名称:清单文件中
* @return 应用版本名称 返回null代表异常
*/
private String getVersionName() {
//创建包管理者对象
PackageManager packageManager = getPackageManager();
//从管理者对象中,获取指定包名的基本信息
try {
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(),0);
String version_name=packageInfo.versionName;
Log.d("TAG", "getVersionName: "+version_name);
return version_name;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
5.独立的流转字符串的操作
package com.fengray.ex088safety.Utils;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamUtil {
/**
*流转换成字符串
* @param is 流对象
* @return 流转换成的字符串
*/
public static String stream2String(InputStream is) {
//在读取的过程中,将读取的内容存储在缓存中,然后一次性的转换成字符串返回
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//读取流操作,读到没有为止
//创建字符数组,用于作为缓存最小单元
byte[] buffer=new byte[1024];
//记录读取内容的临时变量
int temp=-1;
try {
//一直读到结束,从流is中读取buffer大小的内容,赋值给temp,如果不为-1,则没有读完
while ((temp=is.read(buffer))!=-1){
//输出流从0开始写,写到temp的位置,每次写入buffer
bos.write(buffer,0,temp);
}
//返回读取的数据
return bos.toString();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
is.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
6.从网络上获取jason文件解决
1、首先解决访问互联网权限的问题
清单文件添加Internet权限
<uses-permission android:name="android.permission.INTERNET"/>
由于android9以后不再建议方位http协议,而倾向于访问https协议,所以要在清单文件中添加对http协议的访问
a、在res文件夹中创建xml文件夹,并在其中创建network_security_config.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
b、在清单文件application标签中加入
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>
或者,直接在清单文件的application标签中加入
android:usesCleartextTraffic="true"
2、开启新线程访问网络文件
private void checkVerion() {
//在新的线程中进行耗时操作
new Thread(){
@Override
public void run() {
try {
//发送请求获取数据,10.0.2.2:8080仅仅限于模拟器访问tomcat
//URL url=new URL("10.0.2.2:8080/AndroidPhone/update.json");
URL url=new URL("http://192.168.1.64:8080/AndroidPhone/update.json");
//开启一个连接
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
//设置常见请求参数
connection.setConnectTimeout(2000);//请求超时
connection.setReadTimeout(5000);//读取超时
//默认为get请求
//connection.setRequestMethod("GET");//设置请求方式
//获取响应码
if (connection.getResponseCode()==200){
//以流的形式,将数据获取下来
InputStream is=connection.getInputStream();
//将从服务器上读取的流,转换成字符串(工具类来封装)
String json= StreamUtil.stream2String(is);
//但因网上的json文件
Log.d("TAG", "run: "+json);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
打印:
2020-08-28 21:10:53.021 10051-10051/com.fengray.ex088safety D/TAG: getVersionName: 1.0.0
2020-08-28 21:10:53.023 10051-10051/com.fengray.ex088safety D/TAG: initData: versioncode:1
2020-08-28 21:10:53.117 10051-10089/com.fengray.ex088safety D/TAG: run: {
“downloadUrl”: “http://www.sssxxx.com/xxx.apk”,
“versionCode”: “2”,
“versionDes”: “2.0版本发布了,这个版本很厉害”,
“versionName”: “2.0”
}
7.导入开源的XUtils库(xUtils2.6.14和xUtils3)
1、解压出xUtils2.6.14.jar,拷贝进app文件夹中的libs文件夹
2、对着jar文件右键add As library
参考如下网址
https://blog.csdn.net/wangsidadehao/article/details/50757211
使用xutils中的HttpUtils下载网络上的文件
private void downloadApk() {
Log.d("TAG", "downloadApk: 进入downloadapk----");
//点击下载apk,放置apk的所在路径
//1、判断sd卡是否可用,是否挂载上了
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d("TAG", "downloadApk: sd卡已经挂载");
//2、获取sd卡路径
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator+"EX088Safety.apk";
//3、发送请求,获取apk,并且放置到指定路径
HttpUtils httpUtils=new HttpUtils();//这个HttpUtils来自于开源库XUtils
//发送请求,传递参数(下载地址,下载所在的位置,)
httpUtils.download(downloadUrl, path, new RequestCallBack<File>() {
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {//下载成功
//下载过后的放在sd开中的apk
Log.d("TAG", "onSuccess: 下载成功");
File file=responseInfo.result;
}
@Override
public void onFailure(HttpException e, String s) {//下载失败
Log.d("TAG", "onFailure: 下载失败");
}
//开始下载
@Override
public void onStart() {
Log.d("TAG", "onStart: 刚刚开始下载");
super.onStart();
}
//正在下载,参数一:下载的总大小,当前的下载位置,是否正在下载
@Override
public void onLoading(long total, long current, boolean isUploading) {
Log.d("TAG", "onLoading: 下载中----,total:"+total+"---current:"+current);
super.onLoading(total, current, isUploading);
}
});
}
}
8.android Stuio生成一个apk文件
https://blog.csdn.net/zhaojie911272507/article/details/104794435/
9.安装一个apk文件
private void installAPK(File file) {
// 系统应用界面,找到安装apk入口即可
Intent intent=new Intent(“android.intent.action.VIEW”);
intent.addCategory(“android.intent.category.DEFAULT”);
//文件作为数据源
intent.setData(Uri.fromFile(file));
//设置安装的类型
intent.setType(“application/vnd.android.package-archive” );
startActivity(intent);
}