沉尘臣 發表於 2023-3-19 18:37:00

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>在手机上执行以下操作:设置 &gt; 关于手机 &gt; 点击版本号(反复点击直至提示已经打开了开发者模式)</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--&gt;A(Android OS&lt;br/&gt;AVD)
A--adb--&gt;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 项目)--&gt;b
a--&gt;c
b(app)--&gt;manifests
b--&gt;java
b--&gt;res
c(Gradle Scripts)--&gt;build.gladle
c--&gt;proguard-rules.pro
c--&gt;gradle.properties
c--&gt;settings.gradle
c--&gt;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>&lt;LinearLayout&gt;&lt;/LinearLayout&gt;</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>&lt;TextView&gt;&lt;/TextView&gt;</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">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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"&gt;
   
    &lt;TextView
      android:id="@+id/textView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello Android" /&gt;

&lt;/LinearLayout&gt;
</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">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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"&gt;

    &lt;TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/app_name" /&gt;

&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;
</code></pre>
<p>其中,TextView 标签中的 Text 属性值可以在 values/strings.xml 中设置:</p>
<pre><code class="language-xml">&lt;resources&gt;
    &lt;string name="app_name"&gt;My Application&lt;/string&gt;
    &lt;string name="text2"&gt;Activity Main 2&lt;/string&gt;
&lt;/resources&gt;
</code></pre>
<p>修改 activity_main.xml,添加按钮用于跳转:</p>
<pre><code class="language-xml">&lt;Button
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Skip" /&gt;
</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">&lt;activity android:name=".MainActivity2"&gt;&lt;/activity&gt;
</code></pre>
</li>
</ol>
<hr>
<p><strong>点我进入下一节</strong></p>
<hr><br><br>
来源:https://www.cnblogs.com/SRIGT/p/17233904.html
頁: [1]
查看完整版本: Android 开发入门(1)