Android 开发入门(1)
<h2 id="0x01-准备">0x01 准备</h2><h3 id="1概述">(1)概述</h3>
<p>安卓(Android)基于 Linux 内核开发的操作系统,由 Google 等领导开发。</p>
<h3 id="2版本">(2)版本</h3>
<table>
<thead>
<tr>
<th>Android 版本号</th>
<th>API</th>
<th>发布时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>Android 14</td>
<td>-</td>
<td>2023</td>
</tr>
<tr>
<td>Android 13</td>
<td>33</td>
<td>2022.2</td>
</tr>
<tr>
<td>Android 12</td>
<td>31</td>
<td>2021.10</td>
</tr>
<tr>
<td>Android 11</td>
<td>30</td>
<td>2020.9</td>
</tr>
<tr>
<td>Android 10</td>
<td>29</td>
<td>2019.8</td>
</tr>
<tr>
<td>Android 9</td>
<td>28</td>
<td>2018.8</td>
</tr>
<tr>
<td>Android 8</td>
<td>26/27</td>
<td>2017.8</td>
</tr>
<tr>
<td>Android 7</td>
<td>24/25</td>
<td>2016.8</td>
</tr>
<tr>
<td>Android 6</td>
<td>23</td>
<td>2015.9</td>
</tr>
<tr>
<td>Android 5</td>
<td>21/22</td>
<td>2014.6</td>
</tr>
<tr>
<td>Android 4.4</td>
<td>19/20</td>
<td>2013.9</td>
</tr>
</tbody>
</table>
<p>以上可见 Android 技术迭代非常快,既体现了 Android 开发社区的活跃,也说明了面对新版本的新特性需要不断学习。</p>
<h3 id="3开发工具">(3)开发工具</h3>
<ul>
<li>集成开发工具:Android Studio</li>
<li>软件开发工具包:Android SDK</li>
</ul>
<h2 id="0x02-第一个项目">0x02 第一个项目</h2>
<h3 id="1创建项目">(1)创建项目</h3>
<ol>
<li>
<p>选择新建项目</p>
</li>
<li>
<p>选择 Phone and Tablet 下的 Empty Activity</p>
<blockquote>
<p>Activity 是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务</p>
</blockquote>
</li>
<li>
<p>设置:语言为 Java,最低 SDK 为 API 28</p>
</li>
<li>
<p>选择完成</p>
</li>
<li>
<p>暂时忽略代理连接</p>
</li>
</ol>
<h3 id="2创建内置虚拟手机">(2)创建内置虚拟手机</h3>
<ol>
<li>在右侧选项卡栏中,选择 Device Manager</li>
<li>选择 Create device</li>
<li>选择屏幕尺寸</li>
<li>选择在该设备安装 Android 11</li>
<li>完成</li>
</ol>
<blockquote>
<p>异常处理:</p>
<ul>
<li>启动模拟手机错误:the emulator process for AVD Pixel_xxx_API_xx has terminated.</li>
</ul>
</blockquote>
<h3 id="3观察-app-运行日志">(3)观察 App 运行日志</h3>
<ul>
<li><code>log.e</code>:error,错误消息,可能导致程序崩溃的异常</li>
<li><code>log.w</code>:warn,警告信息</li>
<li><code>log.i</code>:info,一般信息</li>
<li><code>log.d</code>:debug,调试信息,可把程序运行时的变量值打印出来,方便跟踪调试</li>
<li><code>log.v</code>:verbose,冗余信息</li>
</ul>
<p>举例:</p>
<pre><code class="language-java">// 在 MainActivity.java 中
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 添加下述代码
Log.d("testTags", "onCreate");
}
}
</code></pre>
<p>执行后打开 Logcat,通过筛选 Debug 信息可以发现以下信息:</p>
<p><code>202x-xx-xx xx:xx:xx.xxx 7709-7709/com.example.myapplication D/testTags: onCreate</code></p>
<h2 id="0x03-开发基础">0x03 开发基础</h2>
<h3 id="1运行环境">(1)运行环境</h3>
<ul>
<li>
<p>在虚拟手机上运行</p>
</li>
<li>
<p>在真实手机上运行</p>
<ol>
<li>
<p>在手机上执行以下操作:设置 > 关于手机 > 点击版本号(反复点击直至提示已经打开了开发者模式)</p>
</li>
<li>
<p>在开发者选项中,启动 USB 调试</p>
</li>
<li>
<p>使用 USB 将手机与电脑连接</p>
</li>
<li>
<p>在电脑上执行命令<code>adb devices -l</code>来查看已连接的设备</p>
<blockquote>
<p>adb 为 Android SDK 目录中 platform-tools 内的程序,将其设置为系统变量 adb</p>
<p>adb:Android Debug Bridge</p>
</blockquote>
</li>
</ol>
</li>
</ul>
<p>调试运行原理:</p>
<div class="mermaid">graph LR
PC--adb-->A(Android OS<br/>AVD)
A--adb-->PC
</div><h3 id="2开发语言">(2)开发语言</h3>
<ul>
<li>App 开发路线:原生开发、混合开发
<ul>
<li>原生开发包括 Java、Kotlin、C/C++、XML,性能更好</li>
<li>混合开发包括 HTML5、Flutter、React Native 等,可以跨平台</li>
</ul>
</li>
<li>Android 官方编程语言:Java、Kotlin</li>
</ul>
<h3 id="3使用数据库">(3)使用数据库</h3>
<p>Android 内置了专门的数据库—— SQLite,其语法类似于 MySQL,属于嵌入式数据库</p>
<h3 id="4工程结构">(4)工程结构</h3>
<ul>
<li>
<p>App 工程分为两个层次:项目、模块</p>
<ul>
<li>模块依附于项目,项目之下可以由多个模块</li>
<li>每个模块对应实际的 App</li>
</ul>
</li>
<li>
<p>App 项目分为两类:app、Gradle Scripts</p>
<div class="mermaid">graph TB
a(App 项目)-->b
a-->c
b(app)-->manifests
b-->java
b-->res
c(Gradle Scripts)-->build.gladle
c-->proguard-rules.pro
c-->gradle.properties
c-->settings.gradle
c-->local.properties
</div><ul>
<li>
<p>manifests:仅有 AndroidManifest.xml,是 App 的运行配置文件</p>
<table>
<thead>
<tr>
<th>application 节点属性</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>android:allowBackup</code></td>
<td>是否允许应用备份,true 或 false</td>
</tr>
<tr>
<td><code>android:icon</code></td>
<td>显示的图标</td>
</tr>
<tr>
<td><code>android:label</code></td>
<td>显示的名称</td>
</tr>
<tr>
<td><code>android:roundIcon</code></td>
<td>圆角图标</td>
</tr>
<tr>
<td><code>android:supportRtl</code></td>
<td>是否支持阿拉伯语等从右到左文字排列顺序</td>
</tr>
<tr>
<td><code>android:theme</code></td>
<td>显示风格</td>
</tr>
</tbody>
</table>
</li>
<li>
<p>java:有三个 com.example.myapp 包,第一个存放当前模块 Java 源代码,其他存放测试用</p>
</li>
<li>
<p>res:存放当前模块的资源文件</p>
<ul>
<li>drawable:存放图形描述文件和图片文件</li>
<li>layout:存放 App 页面的布局文件</li>
<li>mipmap:存放 App 的启动图标</li>
<li>values:存放常量定义文件
<ul>
<li>字符串常量:strings.xml</li>
<li>像素常量:dimens.xml</li>
<li>颜色常量:colors.xml</li>
<li>样式风格定义:styles.xml</li>
</ul>
</li>
</ul>
</li>
<li>
<p>build.gradle:分为项目级、模块级,描述 App 工程的编译规则</p>
<ul>
<li>项目级:指定了当前项目的总体编译规则</li>
<li>模块级:指定了当前模块的总体编译规则</li>
</ul>
</li>
<li>
<p>proguard-rules.pro:描述 Java 代码的混淆规则</p>
</li>
<li>
<p>gradle.properties:配置编译工程的命令行参数</p>
</li>
<li>
<p>settings.gradle:配置了需要编译哪些模块</p>
</li>
<li>
<p>local.properties:项目的本地配置文件</p>
</li>
</ul>
</li>
</ul>
<h3 id="5设计规范">(5)设计规范</h3>
<ul>
<li>
<p>XML:用于描绘应用界面,类比前端</p>
<blockquote>
<p>在 activity_main.xml 文件中操作</p>
</blockquote>
<ul>
<li>线性布局标签:<code><LinearLayout></LinearLayout></code>
<ul>
<li>命名空间:<code>xmlns:android="http://schemas.android.com/apk/res/android"</code></li>
<li>布局宽高:<code>android:layout_width</code>、<code>android:layout_height</code></li>
<li>布局位置:<code>android:gravity</code></li>
<li>填充父容器:<code>match_parent</code>,可以用于填充整个屏幕</li>
<li>布局方向:<code>android:orientation</code></li>
</ul>
</li>
<li>文本控件:<code><TextView></TextView></code>
<ul>
<li>设置 ID:<code>android:id</code></li>
<li>自适应:<code>wrap_content</code></li>
<li>文本内容:<code>android:text</code></li>
</ul>
</li>
</ul>
<pre><code class="language-xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello Android" />
</LinearLayout>
</code></pre>
</li>
<li>
<p>Java:用于控制程序逻辑,类比后端</p>
<blockquote>
<p>在 MainActivity.java 文件中操作</p>
</blockquote>
<ul>
<li>
<p>调用布局:</p>
<pre><code class="language-java">setContentView(R.layout.activity_main);
</code></pre>
</li>
<li>
<p>修改 XML 文件中文本控件中的文本内容</p>
<pre><code class="language-java">import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
TextView textView = findViewById(R.id.textView);
textView.setText("你好安卓");
}
}
</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="6activity-的创建与跳转">(6)Activity 的创建与跳转</h3>
<blockquote>
<p>可以直接右键 package(即com.example.application) 新建项目:/Activity/Empty_Activity</p>
</blockquote>
<ol>
<li>
<p>在 layout 目录下创建 XML 文件</p>
<p>创建 activity_main2.xml:</p>
<pre><code class="language-xml"><?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
</androidx.constraintlayout.widget.ConstraintLayout>
</code></pre>
<p>其中,TextView 标签中的 Text 属性值可以在 values/strings.xml 中设置:</p>
<pre><code class="language-xml"><resources>
<string name="app_name">My Application</string>
<string name="text2">Activity Main 2</string>
</resources>
</code></pre>
<p>修改 activity_main.xml,添加按钮用于跳转:</p>
<pre><code class="language-xml"><Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Skip" />
</code></pre>
</li>
<li>
<p>创建与 XML 文件对应的 Java 文件</p>
<p>创建 MainActivity2.java:</p>
<pre><code class="language-java">package com.example.myapplication;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity2 extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
</code></pre>
<p>修改 MainActivity.java,添加按钮事件:</p>
<pre><code class="language-java">package com.example.myapplication;
import // ...
import android.content.Intent;
import android.widget.Button
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MainActivity2.class);
startActivity(intent);
}
});
}
}
</code></pre>
</li>
<li>
<p>在 AndroidManifest.xml 中注册页面配置</p>
<p>在 application 标签下添加新 activity 标签:</p>
<pre><code class="language-xml"><activity android:name=".MainActivity2"></activity>
</code></pre>
</li>
</ol>
<hr>
<p><strong>点我进入下一节</strong></p>
<hr><br><br>
来源:https://www.cnblogs.com/SRIGT/p/17233904.html
頁:
[1]