从初中就开始接触编程,初中的时候就利用iapp写出过很多有意思的小软件,后面才知道iapp仅仅是偌大编程世界里小的不能再小的一个小语言罢了,现在学了JAVA的一些皮毛了,感觉可以挑战一下利用Android Studio开发一个软件了,我会从零开始开发一个小储云的APP,今天是第一天,我准备做一个启动页面~
Android Studio的环境已部署。
Android Studio中项目的结构
在研究了一上午的Android Studio后总算初步掌握了Android Studio中的各个文件夹是干嘛的了
加入一个Lottiefile文件
导入lottie包
点击 Sync Project with Gradle File
Android Studio就会自动下载依赖包
然后在res目录中新建一个raw目录
将从lottiefile上下载的特效的json拖入raw
注:raw文件中的文件名只能为小写字母,否则会报错(踩过坑)
这是我找的特效,挺配的
然后在主界面添加一个lottie的控件
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation"
android:layout_width="300dp"
android:layout_height="300dp"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/data"/>
<!-- rawres这里填特效文件的名字就行了 -->
控件的使用和布局
之前玩过IAPP所以对Android的开发还是有些经验的,线性布局这些感觉用起来还是很顺手的,于是很容易的就写出一个开屏页面的
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/theScreenBack"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/color"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/Logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/shop" />
<TextView
android:id="@+id/shopName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="@string/app_name"
android:textStyle="bold"
android:textSize="50sp"/>
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation"
android:layout_width="300dp"
android:layout_height="300dp"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/data"/>
<!-- rawres这里填特效文件的名字就行了 -->
</LinearLayout>
</LinearLayout>
</FrameLayout>
事件的编写
下面就是写逻辑代码的时候了,我准备用一个网页端来控制APP中的公告和验证APP是否被篡改,我现在还没学过javaweb就只有用php暂时来写网页端,而且现在还是初期,主要是为了学软件开发,所以PHP就写得简单点。
<?php
$website1 = $_GET["website"];
// 后端以后再做
// 数据库我也没建
// 先直接用个判断来获取数据
if ($website1 == "0001") {
// code...
$data = array('siteName' => '流光商城','version' => '1.0',"appbc" => "这是APP公告~后面会用", "background" => "http://url");
$info = array('status' => '0','data' => $data);
echo json_encode($info);
}
?>
JAVA的json还没有接触过,所以在网上学习了下,发现导入一个阿里的json工具包就可以进行一些基础的json操作了和导入lottie的包一样,在Gradle中插入一行 implementation 'com.alibaba:fastjson:1.2.59'
然后就可以使用了。
然后又发现一个很重要的问题,我JAVA的IO流也没学过,所以就在网上找了个HTTPRequest的工具类,代码如下
package com.lg.shoptest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
public class HttpRequest {
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
}
但是我在运行后发现http请求都是失败,就发现了一个很坑的东西,那就是软件联网需要权限
这两行都得加到AndroidManifest.xml,上面的就是申请网络权限,下面那个为什么要True由网上得来的信息如下
android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。
写过IAPP的就知道要发送HTTP请求的话就得新建一个线程,正好前几天刚刚好学习了线程,恰好可以用得上。
new Thread(new Runnable() { // 匿名类的Runnable接口
@Override
public void run() {
String test = HttpRequest.sendGet("http://blog.ooxuan.com/app.php","website=" + getString(R.string.app_id));
JSONObject data = JSONObject.parseObject(test);
JSONObject theData = JSONObject.parseObject(data.getString("data"));
Log.v("调试信息", data.getString("status"));
if (data.getString("status").equals("0")) {
Log.v("调试信息", "Internet connection success");
if (theData.getString("siteName").equals(getString(R.string.app_name))){
Log.v("调试信息", "app name verification succeeded");
}else{
Log.v("调试信息", "app名字不匹配!");
}
}else {
Log.v("调试信息", "网络连接失败,请检查网络是否异常!");
}
}
}).start();
这是一个多线程的匿名方法,也是之前没学过的,今天见到感觉很神奇,好了,开屏页就很不错的实现了个人感觉还是不错的~