简介:面向Android初学者的开发入门实例文档,完整演示使用Android Studio从创建空白项目到搭建主页面、关于页面、设置页面的过程。文档逐步讲解新建项目的参数配置、Activity生命周期与onCreate重写、setContentView布局加载方式,以及PreferenceFragment设置页实现和AndroidManifest导航声明,并配有可直接参考的Java示例代码,便于边学边练。压缩包内为1个PDF文件,体积仅498KB,内容紧凑,适合快速翻阅与对照操作。该资源已有444人学习下载。通过这份实例,读者可掌握Android应用的基础结构、页面构建思路与常见设置界面写法,为后续开发更完整的App打下扎实基础。
1. 拿到一份「android+studio简易app实例.pdf」,先别急着敲代码
很多人是这么开始学 Android 的:找一份标题叫「android+studio简易app实例.pdf」的教程,打开 PDF,照着第 3 页的截图新建项目,然后卡在 Gradle 同步上,一卡就是一下午。真正把界面代码敲完的人反而不多。问题不在代码,在于这份教程默认你已经把环境配好了,而 PDF 里三行带过的环境配置,恰好是新手最容易翻车的地方。
这篇笔记就顺着「简易 App 实例」这条路,把从环境准备、新建工程、写界面和交互、到打包到手机的完整流程讲清楚。PDF 里给的是结论,这里补的是为什么、参数怎么调、以及失败时先查哪里。适合刚装好 Android Studio 还没跑通第一个 App 的从业者,也适合带新人入门时当一份检查清单用。
2. 开发环境:把 JDK、SDK 与模拟器一次对清楚
做简易 App 实例,最忌讳一上来就点「New Project」。环境没对齐,模板生成的工程根本跑不起来,后面所有步骤都卡在同一个地方。这一章把环境相关的三个关键对象讲透:JDK、Android SDK、模拟器系统镜像。它们之间是协作关系,不是独立安装完就完事。
2.1 版本号匹配:JDK 与 Gradle、AGP 之间的对应关系
新建项目时 Android Studio 会帮你选好默认的 Gradle 和 Android Gradle Plugin(AGP)版本,但前提是 JDK 版本兼容。我见过最多的报错是Unsupported class file major version和Java home is invalid,本质都是 JDK 和 Gradle 对不上。
JDK 不是越新越好。Gradle 每个版本支持的 JDK 上限是固定的,AGP 也有它自己的要求。新建项目时注意看 Android Studio 的提示,一般在File > Settings > Build, Execution, Deployment > Build Tools > Gradle里能看到当前项目使用的 JDK 路径。这里有一个务实的习惯:让项目用自己的 JDK 配置,而不是全局系统 JDK。
# 查看当前 JDK 版本 java -version # 查看 Android Studio 自带的 JBR(JetBrains Runtime)位置 # macOS/Linux 通常在这个目录: /Applications/Android Studio.app/Contents/jbr/Contents/Home # Windows 通常在安装目录下的 jbr 文件夹里逻辑说明:Android Studio 自带的 JBR 是一个相对「安全」的 JDK,它和 Studio 内部版本匹配。如果你系统里装的是高版本 JDK,但项目 Gradle 版本老,编译时大概率报版本冲突。检查时不用死背兼容表,记住一个原则:优先使用 Android Studio 捆绑的 JBR,除非你有明确原因要换。
参数说明:java -version只是确认你终端里用的是哪个 JDK,它和 Android Studio 里的配置不一定一致。真正决定项目编译的是gradle-wrapper.properties里的 Gradle 版本,以及 Android Studio 里项目级 JDK 设置。
2.2 用命令行核对 SDK 与模拟器,比 GUI 菜单更可靠
Android SDK 是一套分层的组件,包含平台(Platform)、构建工具(Build Tools)、平台工具(Platform Tools)和系统镜像(System Image)。只装最新平台是不够的,因为旧项目用的 compileSdk 可能没装,同步时会自动尝试下载,一旦下载失败就报Failed to find target SDK。
我一般会直接用命令行工具sdkmanager核对已安装的 SDK 组件,它比在图形界面里逐级点开更快。
# 找到 sdkmanager 的位置 # macOS: ~/Library/Android/sdk/cmdline-tools/latest/bin/sdkmanager # Windows: %LOCALAPPDATA%\Android\Sdk\cmdline-tools\latest\bin\sdkmanager.bat # 列出已安装的 SDK 包 sdkmanager --list_installed逻辑说明:--list_installed只显示本机已装的组件,不会请求网络。看输出时重点核对三行:platforms;android-X(平台)、build-tools;X.X.X(构建工具)、platform-tools(adb)。这三个不全,Gradle 同步时就会边下边配,一旦网络超时,报错信息又长又难懂。
参数说明:如果你本地cmdline-tools目录结构不对,比如少了latest这层目录,sdkmanager 会直接报错。解决方法是保持 Android Studio 默认创建的目录结构,不要手动改路径。另外sdkmanager --list可以用来查看可安装的包,查询时注意区分「已安装」和「可安装」两个列表。
2.3 local.properties 与仓库地址:环境配置的两个隐蔽坑
新建项目后,Android Studio 会自动生成一个local.properties文件,里面写着sdk.dir。这个文件只对当前机器生效,而且是被 Git 忽略的,不需要提交到仓库。手动改过 SDK 路径的项目,最常见的错误就是sdk.dir指向了不存在的位置,导致每次同步都报错。
# local.properties 内容示例 # 注意路径里的斜杠方向,Windows 用反斜杠或转义斜杠 sdk.dir=C\:\\Android\\Sdk逻辑说明:Windows 上路径里的反斜杠需要转义,写成\\。macOS 和 Linux 用正斜杠。如果你发现同步报找不到 SDK,先看这个文件的路径对不对,再看路径下有没有platform-tools目录。另一个隐蔽坑是Gradle依赖仓库地址访问超时:项目里的settings.gradle会配置仓库地址,如果某些仓库无法访问,同步会长时间卡住。常见做法是优先用能稳定访问的镜像仓库,并把仓库顺序前置。
参数说明:sdk.dir值必须是 Android SDK 的根目录,不是cmdline-tools那层。搞混的话,Studio 能打开但同步报SDK location not found。镜像仓库地址的替换通常发生在settings.gradle的pluginManagement和dependencyResolutionManagement两个代码块里,只需要替换已有仓库,不要删除原有项。
3. 新建最小工程:看懂模板里哪些文件在干活
环境对齐之后,新建工程就只是点几下鼠标的事。但一个简易 App 实例真正跑通,靠的是知道模板生成了哪些文件、每个文件干什么、哪些能改哪些不能碰。很多人卡在「不知道改哪个文件」,于是每个文件都改一遍,最后编译错误比代码还多。
3.1 Empty Activity 模板生成的目录,哪些文件该改、哪些别碰
在 Android Studio 里选择Empty Activity模板新建工程后,项目面板里会出现一堆目录。对新手来说,需要修改的文件只有三个:MainActivity.kt(或.java)、activity_main.xml、build.gradle。其他文件保持原样,能少改就少改。
MyApplication/ ├── app/ │ ├── build.gradle # 模块级构建配置,删掉会直接无法编译 │ ├── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml # 应用入口和权限声明 │ │ ├── java/... # 源码文件 │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_main.xml # 界面布局 │ │ └── values/ │ │ ├── strings.xml # 字符串资源 │ │ └── themes.xml # 主题配置 └── build.gradle # 项目级构建配置逻辑说明:AndroidManifest.xml里application标签的android:name指向应用的 Application 类,Activity 的android:name指向启动页面。改动包名或文件名时,必须同步改清单文件里的引用,否则安装后点开就是白屏闪退。常见做法是保持模板默认结构,只改内容不改文件名。
参数说明:res/layout目录下的 XML 文件名不能大写,只能用小写字母、数字和下划线。res/values/strings.xml是字符串资源,UI 上的文字建议写在这里而不是硬编码在布局里,原因后面会提到。
3.2 解读 build.gradle 与 gradle-wrapper.properties:三大 SDK 参数
模块级的build.gradle是简易 App 实例里最值得读的文件。它里面有三个参数决定你的应用能在哪些手机上运行:compileSdk、minSdk、targetSdk。
// app/build.gradle 关键片段 plugins { id 'com.android.application' } android { namespace 'com.example.myapplication' compileSdk 34 // 编译用的 SDK 版本,影响你能用哪些 API defaultConfig { applicationId 'com.example.myapplication' minSdk 24 // 最低支持 Android 7.0 targetSdk 34 // 目标运行版本,影响系统行为表现 versionCode 1 versionName '1.0' } }逻辑说明:compileSdk决定编译时可用 API 的集合,minSdk决定代码里能不能直接用某个 API,如果调用了一个minSdk以下的 API,需要自己加版本判断。targetSdk决定系统以什么模式运行你的应用,系统版本高于目标版本时,行为兼容模式会开启。
参数说明:这三个值保持模板默认即可,不需要刻意调高。minSdk设得越低,兼容的机型越多,但需要用兼容性代码的地方也越多。对简易实例来说,minSdk 24左右是合理的。versionCode是给程序读的版本号,只能增加不能减少,versionName是给用户看的名字。
gradle-wrapper.properties是另一个容易被忽视的文件,它决定了 Gradle 本身的版本。修改它需要谨慎,因为 Gradle 主版本和 AGP 版本有对应关系,写错会导致镜像仓库下载旧版本或直接同步失败。
# gradle/wrapper/gradle-wrapper.properties distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-X.X-bin.zip逻辑说明:distributionUrl指向 Gradle 发行包。Android Studio 新建项目时这里已经填好一个和 AGP 匹配的版本,不需要改。除非你明确知道升级 Gradle 会带来什么,否则保持原样。
3.3 跑通第一个安装流程:模拟器与 Gradle 任务
工程能同步还不代表能跑。一个简易 App 要看到界面,至少要走完「构建 APK -> 启动模拟器 -> 安装 -> 启动」这条链路。我习惯用命令行触发构建,比用界面按钮更直观,报错信息也不会一闪而过。
# 在项目根目录执行,app 是模块名 ./gradlew assembleDebug # 构建完成后 APK 在这个位置: # app/build/outputs/apk/debug/app-debug.apk逻辑说明:assembleDebug会编译源码、打包资源、生成 debug 版 APK。第一次执行会下载依赖,需要一点耐心。如果构建成功但安装失败,问题通常不在 Gradle,而在模拟器或签名。
模拟器建议用 Android Studio 的 Device Manager 创建。创建时选择和你本机 SDK 平台版本匹配的系统镜像,CPU 架构选 x86_64(电脑模拟)而不是 arm64(除非你的电脑就是 ARM 架构)。启动模拟器后,用命令行安装 APK 是更接近真实调试的做法:
# 列出当前连接的设备 adb devices # 安装 APK 到模拟器 adb install app/build/outputs/apk/debug/app-debug.apk # 启动 MainActivity adb shell am start -n com.example.myapplication/.MainActivity参数说明:am start的-n参数是 包名/Activity全路径。如果你改过applicationId,这里的包名要用改过的,否则系统提示找不到 Activity。adb devices输出里出现unauthorized时,需要在模拟器上确认调试授权弹窗。
4. 简易 App 的界面与交互:从 XML 布局到 Activity 代码
跑通空的模板工程只是第一步。「简易 App 实例」的核心是有界面、有交互。这一章用一个最典型的组合讲透:一个 XML 布局文件、一个 Kotlin Activity 文件、一段点击事件代码。这个组合覆盖了 Android 开发里最常接触的三件事:写界面、找控件、响应事件。
4.1 用 LinearLayout 写一个可复现的最小界面
布局文件决定应用长什么样。对简易实例来说,LinearLayout是最容易理解和控制的布局容器,它的特性是子控件按垂直或水平方向依次排列。先看完整布局,再解释关键属性。
<?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:padding="16dp" android:gravity="center_horizontal"> <TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="20sp" android:layout_marginTop="24dp" /> <Button android:id="@+id/btnUpdate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/update_text" android:layout_marginTop="16dp" /> </LinearLayout>逻辑说明:父布局用了match_parent占满屏幕,方向是vertical,所以两个子控件从上往下排。TextView用来显示文本,Button用来接收点击。@+id/tvContent表示创建并引用一个 id,Activity 里通过这个 id 找到控件。
参数说明:wrap_content是宽高跟随内容,match_parent是填满父容器。sp是文字专用单位,会跟随系统字体缩放;dp是布局尺寸单位,不跟随字体。如果按钮在预览里显示不全,优先检查父容器有没有给足高度,而不是挪间距。
4.2 Activity 里绑定控件与事件:Kotlin 最小代码
布局写好后,需要写 Activity 把界面加载出来,并给按钮绑定一个点击行为。Kotlin 版本的代码比 Java 更简洁,下面这个例子是完整可运行的 MainActivity。
package com.example.myapplication import android.os.Bundle import android.widget.Button import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 1. 找到布局里的两个控件 val tvContent: TextView = findViewById(R.id.tvContent) val btnUpdate: Button = findViewById(R.id.btnUpdate) // 2. 给按钮设置点击监听 btnUpdate.setOnClickListener { tvContent.text = "被点击了,时间:${System.currentTimeMillis()}" } } }逻辑说明:setContentView把布局文件 id 和界面绑定。findViewById通过布局里的@+id找到控件实例。按钮的setOnClickListener接收一个函数,每次点击都会执行花括号里的代码。这里把当前时间戳写给tvContent,能看到交互确实生效了。
参数说明:R.layout.activity_main是编译后生成的布局资源引用,如果布局文件名改过,这里也要对应改。R.id.tvContent和布局里的android:id一一对应。拼写不一致会在编译阶段直接报错,这是好消息,说明问题能尽早暴露。setOnClickListener用的是 lambda 写法,花括号里的it在需要时表示被点击的 View。
4.3 参数与常用配置:字符串资源、日志与布局预览
界面代码写完后,还有三个习惯需要建立。第一个是字符串资源的使用。前面布局里写了@string/hello,这意味着strings.xml里必须有对应条目。
<!-- res/values/strings.xml --> <resources> <string name="app_name">简易实例</string> <string name="hello">你好,Android</string> <string name="update_text">点我更新文本</string> </resources>逻辑说明:所有界面文字都放进strings.xml,好处是将来做多语言时不用改布局。你可能会想「一个简例子哪需要多语言」,但当项目变大后,硬编码文字会导致改文案要翻几十个布局文件。现在的投入几乎为零。
第二个习惯是使用日志而不是用界面显示调试信息。Activity 里有现成的Log工具,可以让调试信息直接进 Logcat。参数说明:Log.d是 debug 级别,第一个参数是 tag,自己的代码用「MainActivity」这种一眼认出的 tag;第二个参数是实际内容。注意Log的调用位置在 SDK 里的android.util.Log,不要导入错包。
第三个习惯是用好布局预览。右侧预览窗口显示的还是静态效果,点击预览工具栏里的按钮可以连模拟器实时预览,省去反复安装 APK 的时间。
5. Android Studio 简易 App 实例的常见问题与排查
这一章记录的是顺手就能定位的问题。每一条都是初学者照着 PDF 教程复现时的高频卡点,按「现象 → 原因 → 解决」来写,遇到问题可以直接对应着查。
5.1 Gradle 同步一直转圈或报错
现象:新建项目后,底部状态栏一直显示Gradle sync,转圈超过 10 分钟,或者直接报Could not resolve依赖解析失败。
原因:依赖仓库地址访问超时,或证书校验失败,或本地 Gradle 缓存里残留了损坏的元数据。
解决:先打开settings.gradle,确认仓库顺序。把可用的镜像仓库放在第一个位置。然后清理缓存:执行./gradlew build --refresh-dependencies,或者用 Android Studio 的File > Invalidate Caches清除本地缓存后重启。如果还不行,检查distributionUrl指向的 Gradle 版本是否和本机 JDK 兼容。这三板斧能覆盖九成同步问题。
5.2 模拟器启动后 APK 装不上
现象:adb install提示INSTALL_FAILED_UPDATE_INCOMPATIBLE或INSTALL_FAILED_NO_MATCHING_ABIS。
原因:前者是模拟器上已经装了一个签名不一致的同包名应用;后者是 APK 的原生库指令集和模拟器 CPU 架构不匹配。
解决:INSTALL_FAILED_UPDATE_INCOMPATIBLE先adb uninstall 包名再重新安装。NO_MATCHING_ABIS去检查项目里是否引入了 so 库,简易实例通常不会引入,如果引入了,需要下载支持 x86_64 的 so 库,或者改用真机 ARM 架构的机器。我自己的习惯是:服务器端下发这样的库时,在 Gradle 里明确只打包 x86_64 和 arm64-v8a 两种指令集,避免模拟器和真机两边同时出问题。
5.3 布局在预览里正常,真机上错位
现象:Android Studio 预览窗口里界面排列整齐,安装到手机后文字被截断、按钮重叠、跑到屏幕外。
原因:预览窗口用的是固定尺寸的虚拟屏幕,而真机屏幕宽高比和系统字体缩放不同。字太小或太长的文本在窄屏上会被挤压。
解决:把布局里写死数值的地方改成权重分配。LinearLayout 里用android:layout_weight配合width=0dp让控件按比例占据宽度;文本太长的位置改用可滚动容器或换行。还要检查是不是用了绝对定位的layout_marginLeft硬凑间距。sp单位的文字会随系统字体放大,如果你在代码里把文字大小写死成像素值,也会导致显示异常。
5.4 日志里看不到自己要的输出
现象:代码里写了Log.d("MainActivity", "点击了"),打开 Logcat 却什么都看不到,或者日志刷新太快被冲掉。
原因:Logcat 的过滤条件设错了。默认过滤器可能只显示当前选中进程的日志,或者 tag 过滤把你自己的日志筛掉了。点击按钮时的日志级别是 debug,如果过滤器选的是 error 级别,自然看不到。
解决:在 Logcat 面板里把过滤器选成No Filters,关键词搜索框输入 tag 名MainActivity。确认设备选择器选中了当前模拟器。如果日志确实打印了但现在被大量同类日志淹没,可以在搜索框里用tag:MainActivity做精确过滤。调试期我通常会开两个面板:一个只过滤自己的 tag,一个不过滤看全局崩溃信息。
5.5 代码没改动,重装后旧数据还在
现象:改了代码重新安装,打开 App 发现还显示旧的文本或登录状态,明明代码里已经改掉了默认值。
原因:Android 对同包名同签名的应用升级安装时,会保留SharedPreferences、数据库和文件目录。开发者模式下的adb install -r只覆盖代码,不清理数据。
解决:如果是调试期需要干净状态,在模拟器或真机上卸载旧应用再安装。命令行方式:adb uninstall 包名 && adb install app-debug.apk。如果是在自己设备上做功能验证又不想丢掉数据,可以用测试专用的adb shell pm clear 包名只清数据,不卸载应用。这个命令会清掉应用全部私有数据,所以只适合测试环境用。
6. 把简易实例往深处走:ViewBinding 与调试习惯
6.1 一个技巧:用 ViewBinding 替换 findViewById
当布局里控件多起来后,findViewById的写法会变得很啰嗦。简易实例虽然控件少,但一开始就养成用 ViewBinding 的习惯,后面写稍大的项目会顺利得多。ViewBinding 会在编译时根据 XML 布局自动生成绑定类,让你的布局控件变成可以直接引用的属性。
// app/build.gradle 里开启 ViewBinding android { buildFeatures { viewBinding = true } }// MainActivity 使用 ViewBinding 的写法 class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.btnUpdate.setOnClickListener { binding.tvContent.text = "绑定生效:${System.currentTimeMillis()}" } } }逻辑说明:ActivityMainBinding是编译器根据activity_main.xml自动生成的类,名字由布局文件名驼峰化而来。inflate负责把布局转换为可用的视图,binding.root是布局的根节点。开启后,布局里任何带@+id的控件都会变成binding对象的属性,类型和 id 一致,不再需要手写findViewById。
参数说明:lateinit var是 Kotlin 的延迟初始化属性,写在 onCreate 后使用,系统不会在绑定前访问它。如果 Activity 对应的布局文件名改了,绑定类名字也要跟着变,常见报错是Unresolved reference: ActivityMainBinding,这时候第一反应应该是看布局文件名和类名是否一致,而不是重写整个 Activity。
6.2 验证 App 状态的最小习惯
改完代码,我发现身边效率高的开发都有一个共同的验证流程:改代码后不是直接点 Run,而是先执行干净构建,再安装,再启动一次。每次改动后都重复「构建 -> 安装 -> 启动」三连,虽然多敲几行命令,但能避免「刚才那次是不是没编进去」的玄学问题。我自己保留在笔记里的命令是:
./gradlew clean assembleDebug && adb install -r app/build/outputs/apk/debug/app-debug.apk && adb shell am start -n com.example.myapplication/.MainActivity这行命令的顺序有讲究:clean确保没有旧的残留资源;assembleDebug生成最新 APK;adb install -r覆盖安装;am start直接拉起应用。如果某一步失败,中断的命令会直接指向问题所在。另外记住看 Logcat 里的 AndroidRuntime 崩溃栈,崩溃原因九成都能在头三行里找到答案。这些习惯保留至今,带新人时也让他们照着敲,翻车概率会小很多。希望帮到你。
本文还有配套的精品资源,点击获取