黑马Android76期学习笔记--02手机安全卫士--day01-分包、版本、去标题头、获取版本号,流转字符串、网络上获取json文件,导入开源库,生成apk文件

day01源码下载

1.分包

按照组件划分

组件类型包名
界面com.itheima.mobilesafe.activity
自定义UIcom.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);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 黑马qt公开课是一套为5天的课件,主要介绍了Qt框架的基础知识和应用。Qt框架是一个跨平台的开发工具,可以方便地进行应用程序的设计、开发和调试,被广泛应用于图形界面开发、嵌入式系统和移动应用等领域。 在5天的课程中,学习者将对Qt框架的整体架构有一个全面的认识,包括Qt及其常用的概念、功能和用法,也学会了如何使用Qt Designer进行界面设计和基于信号与槽的事件编程。 此外,课程还将介绍Qt中常用的编程模式和技术,如MVC架构、文件操作、网络编程等,并通过实例让学习者深入理解和应用这些概念和技术。 5天的课件中还提供了大量的实践操作,让学习者通过编写实际案例,深入理解所学知识,并更好地掌握Qt框架的基础和应用,为以后的工作打下坚实的基础。 总之,如果你想快速入门Qt框架的基础知识和应用,那么黑马qt公开课—5天的课件,将是一个非常好的选择。 ### 回答2: 黑马qt公开课的课件共分为5天,内容涵盖了Qt的基础知识、UI设计、绘图系统、多线程编程和网络编程等方面。通过这5天的学习,学员可以全面掌握Qt的开发技能和应用场景,具备开发Qt应用程序的能力。 第一天课程主要介绍了Qt的基础知识,包括Qt窗口和控件、信号与槽机制、事件处理、布局和样式等内容。通过这些基础知识的学习,学员可以了解Qt的基本工作原理和操作方法。 第二天的课程主要讲解了Qt的UI设计,包括UI设计器的使用、自定义控件和样式等内容。学员可以从中学习到如何设计美观、直观的用户界面。 第三天的课程则主题为Qt的绘图系统,包括2D和3D绘图、动画效果和图形转换等内容。在这一天的课程中,学员可以学习到如何使用Qt进行图形绘制和界面效果的优化。 第四天的课程主要介绍了Qt的多线程编程,包括线程的创建和管理、互斥锁和信号量等内容。学员可以从中学习到如何在Qt中实现多线程应用程序。 第五天的课程则主题为Qt的网络编程,包括socket编程、HTTP协议和Web服务等内容。学员可以从中学习到如何使用Qt进行网络编程,实现客户端和服务器的互通。 总体来说,黑马qt公开课的5天课程涵盖了Qt的核心知识点,让学员能够全面掌握Qt的开发技能和应用场景。通过这些课程的学习,学员可以成为一名合格的Qt开发工程师。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值