Android App开发基础
APP的开发特点
App开发测试的方法:
- Android Studio创建内置的模拟器
真实手机测试运行:
- 使用数据线把手机连接到计算机上
- 在计算机上安装手机的驱动程序
- 打开手机的开发者选项并启用USB调试
- 将连接的手机设为文件传输模式,并允许计算机调试
- 手机要能正常使用
APP两大技术路线
- 原生开发:在移动平台上利用官方提供的编程语言(Java、kotlin)、开发工具包(SDK)、开发环境
- 混合开发:结合原生与H5技术开发混合应用,即将部分APP页面改成内嵌的网页,这样无需升级APP只需覆盖服务器上的网页,即可动态更新APP页面
开发语言
- java:主要编程语言
- kotlin:谷歌力推,兼容java
- c/c++:前两者属于解释型语言(运行时才把程序翻译为机器语言,执行效率偏低),而c/c++属于编译型语言,执行效率更高,借助JNI(Java原生接口),Java代码可以调用c/c++程序(封装好Java方法调用即可)
- xml:可扩展标记语言,类似于html利用各种标签来表达页面元素,以及元素之间的层级关系及其排列组合。每个xml标签独立的控件对象,标签内部的属性以“android:”开头,表示标准的android属性
APP连接的数据库:android内置SQLite数据库,语法类似mysql,但实际上后端(服务器端)可以用别的数据库
APP的工程结构
App工程目录结构
分为两个层次:项目和模块,模块依附于项目,每个项目至少有一个模块,也能拥有多个模块
一般“编译运行App”指的是运行某个模块
如下图,项目为My Application,app是模块,其下又有manifest子目录(下面只有AndroidManifest.xml,app的运行配置文件)、java子目录、res子目录
gradle scripts下主要是工程的编译配置文件
- build.gradle:描述App工程的编译规则
- proguard-rules.pro:描述java代码的混淆规则
- gradle.properties:用于配置编译工程的命令行参数,一般无需改动
- settings.gradle:配置了编译哪些模块
- local.properties:项目的本地配置文件,工程编译时自动生成,用于描述开发者计算机的环境配置,包括SDK、NDK的本地路径
AndroidManifest.xml
根节点:manifest,它的package属性指定了app的包名,其下有个application节点,包含如下属性
- android:allowBackup -- 是否允许应用备份
- android:icon -- 指定App再手机屏幕上显示的图标
- android:label -- 指定App在手机屏幕上显示的名称
- android:roundIcon -- 指定App的圆角图标
- android:supportsRtsl -- 是否支持阿拉伯语/波斯语这种从右往左的文字排列顺序,true为支持
- android:theme -- 指定app的显示风格
此外还有个activity节点再application下,是活动页面的注册声明,只有正确配置其才能在运行时访问对应的活动页面
App的设计规范
xml文件描述app界面:可以很方便地预览界面效果
利用XML标记描绘应用界面:
<TextView
android:id="@+id/tv_hello"
android:layout width="wrap content"
android:layout height="wrap content"
android:text="Hello World!" />
由于TextView只是个文本视图,标签头和尾之间不会插入其他标记,所以合并,以“/>”结尾;但并非所有都可简化
根节点必须配备“xmlns:android="http://schemmas.android.com/apk/res/adnroid"”,表示指定XML内部的命名空间,有了命名空间,android studio会自动检查各节点的属性名称是否合法,若不合法就提示报错
但是使用XML无法动态刷新某个控件,表达不了复杂业务逻辑,因此需要使用Java
如下为android studio自动生成的空控件java代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 表示直接引用了布局文件的名字activity_main,可以通过调整选择展示的xml文件
}
}
添加一些Java逻辑代码,运行后文字变化
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("你好!");
}
}
App的活动页面
创建新的App页面
- 创建XML文件:layout下new-xml-layout xml file
- 创建Java代码:java目录下第一个包右键-new-java class
注册页面配置:打开AndroidManifest.xml,在application节点内部补充
<activity android:name=".java文件名"/>
快速生成法:java目录下包名右键-new-activity-empty activity,填写java类名和xml文件名,就能自动完成页面创建
跳转另一个页面
startActivity(new Intent(MainActivity.this, Main2Activity.class)); //从MainActivity跳转到Main2Activity
下面写一个实验:App启动后首页3s后跳转
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("你好!");
}
@Override
protected void onResume() {
super.onResume();
goNextPage();
}
private void goNextPage() {
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("你好!3s后起飞!");
new Handler().postDelayed(mGoNext, 3000);
}
private Runnable mGoNext = new Runnable() {
@Override
public void run() {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
};
}