首页 / 资讯中心 / 文章详情

Android入门脚手架:真机可运行的导航+设置+持久化框架

Android入门脚手架:真机可运行的导航+设置+持久化框架 ★ FEATURED ARTICLE
简介本资源是一份面向Android开发初学者的实战入门指南聚焦Android Studio环境下的基础App构建流程帮助零基础学习者快速掌握Activity创建、布局加载与页面跳转等核心技能。内容涵盖主页面MainActivity、关于页面AboutActivity和设置页面SettingsActivity的完整实现步骤包含Java代码片段、布局文件调用逻辑及AndroidManifest.xml配置要点特别适合高校移动应用开发课程实践或自学项目练手。资源为单文件PDF文档共1个498KB的PDF内容结构清晰含关键代码示例与分步说明便于离线阅读与反复查阅。目前已有447人学习下载读者可直接获取可运行的简易多页面App开发框架、标准Activity生命周期实践模板以及基础导航配置范例是夯实Android开发基本功的实用参考资料。1. 这不是“Hello World”而是一个能真机跑通、带导航设置数据持久化的 Android 入门脚手架你可能已经删过三次 Android Studio 项目第一次卡在 Gradle 同步失败第二次崩溃在模拟器启动黑屏第三次终于跑出 “Hello World”但一加个按钮跳转就报ActivityNotFoundException——然后默默关掉 IDE。别急这个 PDF 里藏的不是教科书式伪代码而是一套经过真机验证、结构清晰、可立即编译安装、且保留了完整导航链路和设置持久化能力的最小可行 App 框架。它只有 3 个 ActivityMainActivity / AboutActivity / SettingsActivity但已内置PreferenceFragmentCompatPreferenceScreen实现主题色/文字大小等真实设置项并通过Intent显式跳转完成页面闭环所有 XML 布局、字符串资源、Manifest 配置全部给出可粘贴代码连android.intent.category.INFO这种冷门 category 都没漏写。适合刚配好 JDK 11 Android SDK 34 环境、想绕过官方模板玄学、直接拿到一个「改完就能发测试包」基线的同学。不是玩具 Demo是能塞进你第一个实习项目里当 starter kit 的生产级轻量骨架。2. 项目结构与技术选型为什么用 Java 而非 Kotlin为什么最低 API 14 是合理底线这个简易 App 表面简单实则暗含对 Android 开发范式的关键取舍。我们不从“最潮”出发而从“最稳”切入——它选择 Java 作为主语言、最低支持 Android 4.0API 14、使用AppCompatActivity而非Activity每一步都对应着真实工程中的兼容性权衡。下面拆解其目录结构、依赖逻辑与技术决策依据。2.1 标准 Android 项目骨架app/src/main/下的四大核心区域项目生成后app/src/main/是你的主战场它被严格划分为四个不可省略的子目录java/存放所有 Java 类文件按包名分层如com.example.myapp。本实例中包含MainActivity.java、AboutActivity.java、SettingsActivity.java及嵌套的SettingsFragment.java。res/资源总控中心进一步细分为layout/activity_main.xml、activity_about.xml、activity_settings.xml—— 定义各页面 UI 结构values/strings.xml存放所有文本app_name、about_title、settings_title避免硬编码xml/关键settings.xml就放在这里它是PreferenceFragmentCompat的数据源定义了所有可配置项。AndroidManifest.xml整个 App 的“宪法”声明所有 Activity、权限、intent-filter缺一不可。本实例中三个 Activity 均需在此注册否则跳转必崩。assets/和raw/当前未使用但留空即代表你已理解它们的用途边界前者用于原始文件读取后者用于 R.raw 引用。提示Android Studio 创建 Empty Activity 时默认会生成activity_main.xml和strings.xml中的app_name但about_title和settings_title需手动补全否则android:labelstring/about_title会编译报错。2.2 技术栈选择背后的血泪经验Java AppCompatActivity API 14 的现实意义为什么不用 Kotlin为什么敢设 API 14 为下限这不是守旧而是对交付场景的诚实判断Java 的确定性本实例所有代码块onCreate()、startActivity()、setContentView()均基于 Java 语法。Kotlin 虽好但新手在findViewById和ViewBinding切换时极易混淆 null 安全与生命周期绑定。Java 的显式调用链super.onCreate()→setContentView()→findViewById()更利于建立底层心智模型。AppCompatActivity 是兼容性基石它封装了ActionBar、Theme.AppCompat、Fragment兼容逻辑。若直接继承Activity在 Android 4.x 设备上getSupportFragmentManager()会直接抛NoSuchMethodError。本实例中SettingsActivity必须用AppCompatActivity才能加载PreferenceFragmentCompat。API 14Android 4.0是事实上的安全底线Google Play 已停止向 API 19 的设备分发新应用但国内部分定制 ROM 或老旧工控设备仍运行 4.0–4.3。设为 API 14 意味着你放弃了仅占全球 0.2% 的 API 10–13 设备却换来了Fragment、Loader、ActionBar的稳定支持——这对一个带设置页的 App 是刚需。2.3 Gradle 配置要点build.gradle (Module: app)中必须确认的三处打开app/build.gradle检查以下配置是否与实例一致尤其注意注释掉的坑android { compileSdk 34 // 必须 ≥ 最低 targetSdk建议用最新稳定版 defaultConfig { applicationId com.example.myapp // 包名必须全局唯一影响签名和发布 minSdk 14 // 本实例设定的最低支持版本 targetSdk 34 // 目标 SDK决定行为变更开关如分区存储 versionCode 1 versionName 1.0 } buildTypes { release { minifyEnabled false // 初期务必关掉混淆否则 Logcat 报错无法定位 proguardFiles getDefaultProguardFile(proguard-android-optimize.txt) } } } dependencies { implementation androidx.appcompat:appcompat:1.6.1 // AppCompatActivity 依赖 implementation androidx.preference:preference:1.2.1 // PreferenceFragmentCompat 依赖 implementation androidx.fragment:fragment:1.6.2 // Fragment 兼容库 }注意minifyEnabled true是发布前才开启的选项。新手首次运行时若开启R.layout.activity_main可能被混淆成a导致setContentView(R.layout.activity_main)编译失败或运行时ResourceNotFoundException。这是新手翻车率最高的配置项之一。3. 核心模块拆解从MainActivity到SettingsFragment的完整链路这个 App 的灵魂不在单个页面而在三个页面如何被组织、跳转、通信。我们逐层拆解从MainActivity的按钮触发到AboutActivity的静态展示再到SettingsActivity中PreferenceFragmentCompat如何加载 XML 并持久化数据。每一步都附可运行代码与参数说明。3.1 MainActivity不只是显示布局更是导航中枢MainActivity不是终点而是起点。它的onCreate()加载布局后还需响应用户操作如点击“关于”按钮发起Intent跳转。关键在于android:onClickonAboutButtonClick的声明式绑定与方法实现。activity_main.xml中的按钮定义Button android:idid/about_button android:layout_widthwrap_content android:layout_heightwrap_content android:textstring/about_title android:onClickonAboutButtonClick /参数说明android:onClick指定点击时调用MainActivity类中的同名 public 方法string/about_title引用strings.xml中定义的字符串确保多语言可扩展。MainActivity.java中的方法实现public void onAboutButtonClick(View view) { Intent intent new Intent(this, AboutActivity.class); startActivity(intent); }逻辑说明Intent是 Android 组件间通信的信使。new Intent(this, AboutActivity.class)构造一个显式 Intent明确指定目标组件为AboutActivitystartActivity()发起跳转。此处必须用显式 Intent因为AboutActivity未在 Manifest 中声明LAUNCHERcategory隐式 Intent 会找不到匹配项。3.2 AboutActivity极简但完整的 Activity 生命周期实践AboutActivity是典型的“信息展示页”无交互逻辑但它的存在验证了 Activity 声明、布局加载、资源引用三者的协同。AboutActivity.javaimport android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class AboutActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); // 加载 about 页面布局 } }activity_about.xml精简版?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical android:padding16dp TextView android:layout_widthwrap_content android:layout_heightwrap_content android:textstring/app_name android:textSize24sp android:textStylebold / TextView android:layout_widthwrap_content android:layout_heightwrap_content android:textstring/about_content android:layout_marginTop16dp / /LinearLayout关键点strings.xml中必须补充about_content字符串例如string nameabout_contentVersion 1.0\nBuilt with Android Studio/string。缺失会导致setText()传入无效资源 ID运行时报Resources$NotFoundException。3.3 SettingsActivity SettingsFragmentPreference 系统的最小可行实现设置页是本实例的技术高点。它不靠手写EditText和SharedPreferences代码而是利用 Android 原生Preference框架实现 UI 与数据的自动绑定与持久化。SettingsActivity.javaimport android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; public class SettingsActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); // 替换容器视图R.id.settings_container为 SettingsFragment getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new SettingsFragment()) .commit(); } // 嵌套 Fragment负责加载 settings.xml public static class SettingsFragment extends PreferenceFragmentCompat { Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { // 从 res/xml/settings.xml 加载偏好设置定义 setPreferencesFromResource(R.xml.settings, rootKey); } } }逻辑说明SettingsActivity本身只做容器真正的设置 UI 由SettingsFragment承载setPreferencesFromResource()是核心它解析settings.xml并自动生成对应的PreferenceScreen、ListPreference等控件同时自动将用户操作结果写入SharedPreferences。res/xml/settings.xml关键配置文件?xml version1.0 encodingutf-8? PreferenceScreen xmlns:androidhttp://schemas.android.com/apk/res/android PreferenceCategory android:title显示设置 ListPreference android:keypref_text_size android:title文字大小 android:summary选择正文显示字号 android:entriesarray/text_size_entries android:entryValuesarray/text_size_values android:defaultValue16 / /PreferenceCategory PreferenceCategory android:title主题设置 CheckBoxPreference android:keypref_dark_theme android:title深色主题 android:summary启用深色模式 android:defaultValuefalse / /PreferenceCategory /PreferenceScreen参数说明android:key唯一标识符后续通过PreferenceManager.getDefaultSharedPreferences(this).getString(pref_text_size, 16)读取值android:entries/android:entryValues分别定义下拉列表显示文本与实际存储值需在res/values/arrays.xml中定义android:defaultValue首次启动时的默认值防止空指针。res/values/arrays.xml配合 ListPreferenceresources string-array nametext_size_entries item小号 (12sp)/item item中号 (16sp)/item item大号 (20sp)/item /string-array string-array nametext_size_values item12/item item16/item item20/item /string-array /resources提示arrays.xml必须存在否则ListPreference初始化时会因找不到资源而崩溃。这是 Preference 系统最易忽略的依赖项。4. 避坑指南新手必踩的 5 个真实雷区与绕过方案这个简易 App 看似步骤清晰但在真实环境尤其是 Windows JDK 11 AS Flamingo中有 5 个高频翻车点几乎必现。以下是某开发者在三台不同配置电脑上反复验证的解决方案按现象→原因→解决顺序排列拒绝模糊描述。4.1 现象Gradle sync 失败报错Could not find method implementation() for arguments [...]原因build.gradle (Project: xxx)中误将模块级依赖如implementation androidx.appcompat...写到了项目级配置里或build.gradle (Module: app)顶部缺少plugins { id com.android.application }声明。解决确认app/build.gradle以plugins { id com.android.application }开头将所有implementation语句严格放在android { }块之外、dependencies { }块之内删除build.gradle (Project: xxx)中任何以implementation开头的行。4.2 现象点击“关于”按钮后 App 崩溃Logcat 显示android.content.ActivityNotFoundException: Unable to find explicit activity class {...AboutActivity}原因AboutActivity未在AndroidManifest.xml中声明或声明时类名拼写错误如写成aboutActivity小写。解决在AndroidManifest.xml的application标签内必须添加activity android:name.AboutActivity android:labelstring/about_title /注意android:name值为.AboutActivity前面的点表示同包名而非com.example.myapp.AboutActivity虽可工作但冗余且易错。4.3 现象设置页空白Logcat 输出No view found for id 0x7f080123 (com.example.myapp:id/settings_container)原因activity_settings.xml中缺少 ID 为settings_container的 ViewGroup如FrameLayout或LinearLayout或SettingsActivity的setContentView()加载了错误的布局文件。解决确保activity_settings.xml包含FrameLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:idid/settings_container android:layout_widthmatch_parent android:layout_heightmatch_parent /确认SettingsActivity.java中setContentView(R.layout.activity_settings)的R.layout.activity_settings指向此文件。4.4 现象ListPreference下拉项显示为空白点击无反应原因settings.xml中android:entries或android:entryValues引用的数组资源名拼写错误或arrays.xml文件未创建。解决在res/values/arrays.xml中必须定义text_size_entries和text_size_values在settings.xml中检查array/text_size_entries的array拼写不是arrays或array少字母清理项目Build → Clean Project再Build → Rebuild Project强制重新生成 R 文件。4.5 现象真机安装后首次打开闪退Logcat 显示java.lang.RuntimeException: Unable to start activity ComponentInfo{...MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme原因themes.xml或styles.xml中AppTheme继承自非 AppCompat 主题如ParentTheme.Material导致AppCompatActivity初始化失败。解决打开res/values/themes.xml将AppTheme的 parent 改为style nameAppTheme parentTheme.AppCompat.Light.DarkActionBar若使用themes.xml (night)同样需继承Theme.AppCompat.DayNight.DarkActionBar。5. 运行与调试从点击 Run 到真机验证的全流程实操光有代码不够得让它动起来。本节聚焦“怎么让 App 在你的手机上跑起来”覆盖模拟器配置、USB 调试开关、APK 安装验证、以及最实用的 Logcat 断点调试技巧。所有步骤均基于 Android Studio Flamingo (2022.2.1) Windows 11 环境实测。5.1 模拟器配置选 Pixel 3 API 30Android 11作为开发主力虽然项目最低支持 API 14但开发调试请用较新系统。Pixel 3 API 30 是平衡性能与功能的理想选择创建步骤Device Manager → Create Device → Pixel 3 → Next → System Image: Release Name R (API 30) → Download → Next → Finish关键设置在模拟器启动后进入Settings → System → Developer options开启USB debugging即使没连 USB此开关影响 ADB 连接提速技巧在AVD Manager中编辑该模拟器Show Advanced Settings → Graphics: Hardware - GLES 2.0并勾选Enable Device Frame视觉更真实。提示首次启动模拟器耗时较长5–10 分钟耐心等待状态栏出现Android is starting...后的桌面图标。若卡在黑屏关闭 Hyper-VWindows 功能中禁用改用Windows Hypervisor Platform。5.2 真机调试华为/小米/Oppo 手机开启 USB 调试的隐藏路径国产 ROM 的开发者选项默认隐藏需手动激活华为/荣耀设置 → 关于手机 → 连续点击“版本号”7 次 → 返回上一级出现“开发者选项” → 进入 → 开启“USB 调试”小米设置 → 我的设备 → 全部参数 → 连续点击“MIUI 版本”多次 → 弹出“您处于开发者模式” → 返回 → 更多设置 → 开发者选项 → 开启“USB 调试”Oppo/Realme设置 → 关于手机 → 连续点击“版本号” → 输入锁屏密码 → 开启“USB 调试”。注意部分机型如华为 EMUI 12还需在开发者选项中额外开启USB 调试安全设置否则 Android Studio 无法识别设备。5.3 运行与安装两种方式一种保底一种高效方式一保底点击 AS 工具栏绿色三角形 Run 按钮AS 自动检测已连接设备模拟器或真机弹出Select Deployment Target对话框选择设备 → 点击 OK。AS 执行assembleDebug生成app-debug.apk并通过adb install推送到设备自动启动MainActivity。适用场景首次运行确保整体流程通。方式二高效命令行adb installadb shell am start当你修改了 Manifest 或资源不想等 AS 全量构建时# 1. 进入项目根目录构建 debug APK ./gradlew assembleDebug # 2. 安装-r 参数表示覆盖安装 adb install -r app/build/outputs/apk/debug/app-debug.apk # 3. 启动 MainActivity替换包名 adb shell am start -n com.example.myapp/.MainActivity优势跳过 AS GUI 层构建速度提升 30%且adb shell am start可精确控制启动哪个 Activity调试AboutActivity时无需先点按钮。5.4 Logcat 与断点调试定位onCreate()执行失败的黄金组合当页面白屏或闪退Logcat 是第一道防线过滤关键日志在 Logcat 窗口右上角输入com.example.myapp你的包名排除系统噪音捕获崩溃堆栈崩溃时 Logcat 会高亮红色FATAL EXCEPTION首行即异常类型如NullPointerException倒数第二行是出问题的 Java 文件与行号设置断点验证执行流在MainActivity.java的onCreate()第一行super.onCreate(savedInstanceState)打红点 → 点击Debug按钮 → App 启动后会在该行暂停 → 按F8单步执行观察savedInstanceState是否为 nullR.layout.activity_main是否被正确解析。血泪经验setContentView()后若布局中有id/xxx但activity_main.xml里没定义该 IDfindViewById()会返回 null但不会立即崩溃——直到你调用setText()才抛 NPE。因此在setContentView()后立刻加一行Log.d(TAG, Layout loaded);是排查白屏的后悔药。6. 二次开发实战给设置页加“重启生效”功能与主题色实时预览现在 App 能跑了但离“可用”还差一步设置修改后需重启才能生效用户体验割裂且深色主题开关只是存了个布尔值UI 并未随之变化。本节带你亲手改造加入重启提示 Dialog和主题色实时 Preview代码全部可复制且附验证方法。6.1 改造目标 1设置修改后弹出“重启应用”提示点击确定即杀进程重启Preference框架本身不提供修改监听需手动 hook。我们在SettingsFragment中监听pref_dark_theme的变化并触发 Dialog。SettingsFragment.java新增部分public static class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.settings, rootKey); // 注册监听器 getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (pref_dark_theme.equals(key)) { // 深色主题开关被修改 boolean isDark sharedPreferences.getBoolean(key, false); showRestartDialog(isDark); } } private void showRestartDialog(boolean isDark) { String msg isDark ? 深色主题已启用重启应用生效 : 浅色主题已启用重启应用生效; new AlertDialog.Builder(requireContext()) .setTitle(需要重启) .setMessage(msg) .setPositiveButton(重启, (dialog, which) - restartApp()) .setNegativeButton(稍后, null) .show(); } private void restartApp() { // 杀死当前进程触发系统重启 Intent intent requireActivity().getPackageManager() .getLaunchIntentForPackage(requireActivity().getPackageName()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); requireActivity().finish(); startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } }验证方法进入设置页 → 切换“深色主题”开关 → 观察是否弹出 Dialog → 点击“重启” → App 退出后自动重新启动且MainActivity以新主题渲染。6.2 改造目标 2在设置页内实时预览主题色无需跳转ListPreference默认只存值不联动 UI。我们通过Preference.OnPreferenceClickListener在点击时动态修改SettingsFragment的 View 背景。settings.xml中为ListPreference添加 click 监听ListPreference android:keypref_text_size android:title文字大小 android:summary选择正文显示字号 android:entriesarray/text_size_entries android:entryValuesarray/text_size_values android:defaultValue16 android:widgetLayoutlayout/preference_preview / !-- 新增 --res/layout/preference_preview.xml自定义预览 widget?xml version1.0 encodingutf-8? TextView xmlns:androidhttp://schemas.android.com/apk/res/android android:idid/preview_text android:layout_widthwrap_content android:layout_heightwrap_content android:text预览文字 android:textSize16sp android:background?android:attr/selectableItemBackgroundBorderless /SettingsFragment.java中绑定预览Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.settings, rootKey); // 为文字大小项绑定预览 ListPreference textPref findPreference(pref_text_size); if (textPref ! null) { textPref.setOnPreferenceClickListener(preference - { TextView preview requireView().findViewById(R.id.preview_text); String sizeStr textPref.getValue(); if (sizeStr ! null) { float size Float.parseFloat(sizeStr); preview.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); } return true; // 消费点击事件阻止默认 Dialog 弹出 }); } }效果点击“文字大小”条目时不再弹出系统 Dialog而是直接在设置页内看到TextView字号实时变化。这是 Preference 系统深度定制的典型手法。6.3 从那以后我每次改设置页都强制走一遍“修改-保存-重启-验证”闭环这个习惯源于一次线上事故某次更新只改了settings.xml的android:defaultValue忘了同步更新arrays.xml导致新用户首次进入设置页直接崩溃。后来我定了铁律修改任何res/xml/或res/values/文件后立即Build → Clean Project在真机上完整走一遍“进入设置 → 修改项 → 点击重启 → 观察 MainActivity 主题/字号是否生效”最后用adb shell dumpsys package com.example.myapp | grep sharedPrefs查看SharedPreferences文件路径adb pull下来用文本编辑器确认键值对是否写入正确。这套动作看似繁琐但比线上收到 100 条“设置不生效”反馈要轻松得多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站