Android开发经典教程
基石:理解核心组件与生命周期
-
Activity:应用的界面载体
- 核心职责: 管理用户界面(UI),处理用户交互(点击、触摸等)。
- 生命周期至关重要:
onCreate():初始化界面(setContentView)、绑定数据,首次创建时调用。onStart():Activity即将对用户可见(可能被其他Activity部分遮挡)。onResume():Activity获得焦点,可与用户交互,应用核心逻辑常在此后执行。onPause():Activity失去焦点(如被对话框覆盖、新Activity启动),应在此保存关键数据、释放占用资源(如相机)。onStop():Activity完全不可见,可执行较耗资源的释放操作。onDestroy():Activity被销毁前调用,清理所有资源,避免内存泄漏。onRestart():Activity从停止状态重新回到前台时调用(在onStart()之前)。
- 最佳实践:
- 避免在
onCreate()中执行耗时操作(如网络请求),防止界面卡顿(ANR)。 - 使用
ViewModel保存与界面相关的数据,确保屏幕旋转等配置变更时数据不丢失。 - 利用
SavedInstanceState(Bundle) 保存简单临时状态(如滚动位置),在onCreate()或onRestoreInstanceState()中恢复。
- 避免在
-
Fragment:模块化UI的利器
- 为何重要? 实现灵活的界面组合,尤其在平板和大屏设备上,支持动态添加、替换、移除界面模块。
- 生命周期与Activity关联: 拥有类似Activity的生命周期方法(
onCreateView,onStart,onResume等),受宿主Activity状态影响。 - 通信方式:
- 通过Activity中转: Fragment通过
getActivity()获取宿主Activity实例,调用其公共方法或接口,Activity通过FragmentManager查找Fragment并调用其方法。 - ViewModel共享: 同一Activity作用域下的多个Fragment共享一个
ViewModel实例,是高效共享数据的首选。 - Fragment Result API: 新的、解耦的方式,一个Fragment设置结果,另一个Fragment监听结果,无需直接引用。
- (谨慎使用) 直接引用: 通过
findFragmentById/Tag获取另一个Fragment实例并调用方法,易造成强耦合和内存泄漏。
- 通过Activity中转: Fragment通过
构建用户界面:布局与控件
-
布局管理器:控制组件的位置与尺寸
ConstraintLayout(首选): 通过约束关系(相对位置、基线对齐、链条、引导线)实现扁平、灵活、高性能的复杂布局,极大减少嵌套层级。LinearLayout: 线性排列子视图(水平或垂直)。layout_weight属性常用于分配剩余空间。RelativeLayout: 通过相对关系定位(相对于父容器或兄弟视图),因性能考虑和灵活性不如ConstraintLayout,新项目建议少用。FrameLayout: 子视图堆叠放置,常用于单个视图或动态添加/移除视图(如Fragment容器)。CoordinatorLayout: 高级FrameLayout,专为处理子视图间的协调滚动和悬浮行为(如Toolbar隐藏/显示、FAB动画)而设计,常与AppBarLayout、CollapsingToolbarLayout配合使用。- 关键属性:
layout_width/layout_height(match_parent,wrap_content, 具体dp值),layout_margin/padding,gravity/layout_gravity。
-
常用核心控件:
TextView/EditText: 显示/编辑文本。EditText支持输入类型(文本、数字、密码等)、提示文本(hint)、输入过滤器。Button/ImageButton: 触发操作,处理onClick事件。ImageView: 显示图片,使用Glide或Picasso库高效加载网络图片并缓存。RecyclerView(取代ListView): 高效显示大量可滚动数据集,核心组件:Adapter: 创建列表项视图 (onCreateViewHolder) 并将数据绑定到视图上 (onBindViewHolder)。ViewHolder: 缓存列表项视图的引用,避免频繁findViewById。LayoutManager: 控制列表项的布局方式(线性列表LinearLayoutManager、网格GridLayoutManager、瀑布流StaggeredGridLayoutManager)。ItemDecoration: 添加分割线、间距等装饰。ItemAnimator: 控制列表项添加、删除、移动时的动画效果。
CheckBox/RadioButton/Switch: 提供选择功能。RadioButton需配合RadioGroup使用实现单选。
-
资源适配:
- 多分辨率: 提供不同密度的图片资源 (
drawable-hdpi,drawable-xhdpi等) 和尺寸资源 (values-sw320dp,values-sw600dp等)。 - 多语言: 将字符串放在
res/values-语言代码目录下的strings.xml中(如values-zh,values-es)。 - 夜间模式: 使用主题属性(
?attr/colorPrimary)和DayNight主题,在res/values-night中提供夜间资源。
- 多分辨率: 提供不同密度的图片资源 (
数据持久化:存储应用状态
-
SharedPreferences:
- 适用场景: 存储简单的键值对数据(用户设置、标记位、小量配置信息)。
- 特点: 轻量级、基于XML文件、仅支持基本数据类型。
- 用法:
val sharedPref = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE) // 写入 with(sharedPref.edit()) { putString("username", "john_doe") putBoolean("is_logged_in", true) apply() // 异步提交,更安全,commit()是同步提交,可能阻塞UI。 } // 读取 val username = sharedPref.getString("username", "default") val isLoggedIn = sharedPref.getBoolean("is_logged_in", false)
-
文件存储:
- 内部存储: 应用私有目录 (
context.filesDir,context.cacheDir),其他应用无法访问(无需权限),适合存储敏感数据或仅供本应用使用的文件。 - 外部存储:
- 私有目录 (
context.getExternalFilesDir(),context.externalCacheDir): 应用卸载时删除,Android 4.4+ 无需WRITE_EXTERNAL_STORAGE权限。 - 公共目录 (
Environment.getExternalStoragePublicDirectory()): 如音乐、图片、下载目录,需要READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限(Android 10+ 作用域存储带来重大变化,访问公共目录更受限,推荐使用MediaStore API)。
- 私有目录 (
- 内部存储: 应用私有目录 (
-
SQLite数据库:
- 适用场景: 存储结构化、关系型数据(用户信息、消息记录、复杂配置)。
- 原生API (
SQLiteOpenHelper): 需要手动编写SQL语句,管理数据库创建和升级。 - Room Persistence Library (强烈推荐):
- Jetpack组件,在SQLite之上提供抽象层,简化数据库操作,编译时检查SQL语法错误。
- 核心组件:
@Entity: 定义数据表结构。@Dao(Data Access Object): 定义访问数据库的方法(增删改查)。@Database: 数据库持有者类,定义数据库版本和包含的Entity。
- 基本用法示例:
// Entity @Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? ) // Dao @Dao interface UserDao { @Query("SELECT FROM user") fun getAll(): List<User> @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) } // Database @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } // 初始化 val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "my-database" ).build() val userDao = db.userDao()
网络请求:与后端交互
-
核心库选择:
- Retrofit (首选): 类型安全的HTTP客户端库,将HTTP API转换为Kotlin/Java接口,极大简化网络请求代码。
- OkHttp: 强大的HTTP客户端,Retrofit底层默认使用OkHttp,可直接使用OkHttp处理更底层需求。
HttpURLConnection/HttpsURLConnection: Android标准库,较底层,代码相对繁琐。
-
Retrofit + Kotlin Coroutines 示例:
- 定义API接口:
interface ApiService { @GET("users/{id}") suspend fun getUser(@Path("id") userId: Int): User // 使用suspend函数支持协程 @POST("users") suspend fun createUser(@Body user: User): Response<Void> } - 创建Retrofit实例:
val retrofit = Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) // 使用Gson解析JSON .build() val apiService = retrofit.create(ApiService::class.java) - 在协程中发起请求:
viewModelScope.launch { // 在ViewModel的协程作用域内 try { val user = apiService.getUser(123) // 更新UI (通过LiveData或StateFlow) _userLiveData.value = user } catch (e: Exception) { // 处理网络错误 _errorLiveData.value = "Network error: ${e.message}" } }
- 定义API接口:
-
关键考虑:
- 异步处理: 网络请求必须在后台线程执行,避免阻塞UI线程导致ANR,协程或RxJava是管理异步的主流方案。
- 错误处理: 使用
try-catch捕获网络异常(超时、无网络、服务器错误等),给用户友好提示。 - 响应解析: 使用
Gson、Moshi等库将JSON/XML响应体转换为Kotlin/Java对象。 - 权限: 需要
INTERNET权限 (<uses-permission android:name="android.permission.INTERNET" />)。 - HTTPS: 确保使用HTTPS保证通信安全,OkHttp/Retrofit默认支持。
提升体验与性能:关键策略
-
异步编程利器:Kotlin 协程
- 优势: 以同步代码风格编写异步操作,避免回调地狱(Callback Hell),简化并发和异步代码,结构化并发降低内存泄漏风险。
- 核心概念:
suspend函数、协程作用域 (CoroutineScope)、调度器 (Dispatchers.Main,Dispatchers.IO,Dispatchers.Default)、Job、Flow。 - 在Android中的应用:
ViewModel的viewModelScope:自动取消后台任务防止泄漏。Lifecycle的lifecycleScope:在特定生命周期组件内启动协程。- 使用
withContext(Dispatchers.IO)执行网络、文件、数据库等IO操作。 - 使用
Flow处理数据流(如数据库变化通知、实时数据更新)。
-
架构指南:MVVM with Jetpack
- 目标: 分离关注点,提高代码可测试性、可维护性。
- 核心组件:
Model: 数据层,负责数据获取(网络、数据库、文件)和业务逻辑,包含Repository(数据仓库,统一数据源接口)。ViewModel: 保存与UI相关的数据,提供方法供UI调用,不持有View引用,生命周期长于Activity/Fragment(配置变更时存活),通过LiveData或StateFlow向UI暴露状态。View(Activity/Fragment): 观察ViewModel提供的数据流 (LiveData/StateFlow),更新UI,处理用户输入并调用ViewModel的方法。
- 数据流向:
View->ViewModel->Model->Repository-> (网络/数据库) -> 数据返回 ->ViewModel(更新状态) ->View(观察并刷新UI)。
-
性能优化要点:
- 内存泄漏预防:
- 避免在Activity/Fragment中持有长生命周期的引用(如静态变量、单例),使用
WeakReference或Application Context。 - 取消注册监听器(广播、事件总线、监听器)在
onPause()或onDestroy()中。 - 正确使用协程作用域 (
viewModelScope,lifecycleScope)。 - 使用LeakCanary检测内存泄漏。
- 避免在Activity/Fragment中持有长生命周期的引用(如静态变量、单例),使用
- 布局优化:
- 减少嵌套层级,优先使用
ConstraintLayout。 - 避免过度绘制 (Overdraw):移除不必要的背景,使用
clipRect。 - 使用
<include>复用布局,<merge>减少嵌套。 - 复杂列表使用
RecyclerView+ViewHolder。
- 减少嵌套层级,优先使用
- 后台任务管理:
- 使用
WorkManager处理需要保证执行的后台任务(即使应用退出或设备重启),如下载、数据同步、日志上传。 - 避免在
onCreate/onResume中执行耗时操作,使用后台线程或协程。
- 使用
- 图片加载优化: 使用
Glide/Picasso库,它们自动处理内存/磁盘缓存、图片解码、尺寸适配、生命周期管理。
- 内存泄漏预防:
不可或缺的工具与环境
- Android Studio: 官方IDE,集成开发、调试、性能分析工具(Profiler – CPU, Memory, Network, Energy)、布局编辑器、模拟器管理。
- Kotlin: Android官方推荐的现代编程语言,空安全、扩展函数、协程等特性极大提升开发效率和代码健壮性。
- Android SDK & Build Tools: 提供开发库、平台API、构建工具(Gradle)。
- 版本控制系统: Git (GitHub, GitLab, Bitbucket),必备技能。
- 调试工具: Logcat(查看系统日志)、断点调试、StrictMode(检测主线程磁盘/网络访问)、布局检查器(Layout Inspector)、网络分析器(Network Profiler)。
- Google Play Console: 应用发布、管理、分析、获取用户反馈的平台。
探索永无止境
Android开发领域广阔而充满活力,掌握这些核心概念和实践是你构建高质量应用的基础,深入理解Jetpack组件库(如Navigation, Paging, DataStore, Hilt)、持续关注Android平台最新动态(如Compose声明式UI、Kotlin Multiplatform)、学习性能优化高级技巧、实践单元测试和UI测试,将使你成为一名更加出色的Android开发者,切记,官方文档始终是最权威的学习资源。
你是如何解决Android开发中遇到的最棘手的性能问题的?或者,你最想深入学习的Android高级主题是什么?欢迎在评论区分享你的经验或疑问!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/22471.html