Android 开发基础
学习使用 Kotlin 进行 Android 开发,与 JavaScript 移动开发模式和 React Native 概念进行对比
Android 开发基础
欢迎来到 JavaScript 到 Kotlin 转换的第六个模块!在本模块中,我们将探索使用 Kotlin 进行 Android 开发,并了解它与 JavaScript 移动开发模式(如 React Native)的对比。我们将学习 Android 项目结构、Activity 生命周期、UI 组件和现代 Android 开发实践。
学习目标
通过本模块的学习,你将能够:
- 理解 Android 项目结构和架构
- 对比 Android 开发与 React Native 模式
- 实现 Activity 生命周期管理
- 有效创建和管理 Fragment
- 使用 XML 和 Compose 设计响应式布局
- 处理用户交互和事件
- 管理 Android 资源和资产
- 应用现代 Android 开发最佳实践
Android 项目结构
项目组织
Android 项目具有特定的结构,与 JavaScript/React Native 项目有显著差异。让我们探索关键差异。
目录结构对比
React Native 项目结构:
MyReactNativeApp/├── App.js # 主应用组件├── package.json # 依赖管理├── src/│ ├── screens/ # 屏幕组件│ ├── components/ # 可复用组件│ ├── navigation/ # 导航配置│ └── utils/ # 工具函数└── assets/ # 静态资源
Android 项目结构:
MyAndroidApp/├── app/│ ├── src/│ │ ├── main/│ │ │ ├── java/com/example/myapp/│ │ │ │ ├── MainActivity.kt # 主活动│ │ │ │ ├── ui/ # UI 组件│ │ │ │ ├── data/ # 数据层│ │ │ │ └── utils/ # 工具类│ │ │ ├── res/ # 资源文件│ │ │ │ ├── layout/ # 布局文件│ │ │ │ ├── values/ # 值资源│ │ │ │ ├── drawable/ # 图像资源│ │ │ │ └── mipmap/ # 应用图标│ │ │ └── AndroidManifest.xml # 应用清单│ │ └── test/ # 测试代码│ ├── build.gradle.kts # 模块构建配置│ └── proguard-rules.pro # 代码混淆规则├── build.gradle.kts # 项目构建配置└── settings.gradle.kts # 项目设置
Activity 生命周期
生命周期管理
Android Activity 有复杂的生命周期,需要正确管理状态。让我们对比 React Native 的组件生命周期。
生命周期对比表
| React Native 生命周期 | Android Activity 生命周期 | 说明 |
|---|---|---|
useEffect(() => {}, []) | onCreate() | 组件/活动创建时执行 |
useEffect(() => {}, [deps]) | onResume() | 组件/活动变为活跃状态 |
useEffect(() => { return cleanup }, []) | onPause() | 组件/活动暂停时执行 |
| 组件卸载 | onDestroy() | 组件/活动销毁时执行 |
| 状态保存 | onSaveInstanceState() | 保存状态以应对配置变化 |
Fragment 使用
Fragment 基础
Fragment 是 Android 中用于构建灵活 UI 的组件,类似于 React Native 中的可复用组件。
Fragment 生命周期
Fragment 有自己的生命周期,需要与 Activity 生命周期协调:
// Fragment 生命周期管理class MyFragment : Fragment() {override fun onAttach(context: Context) {super.onAttach(context)// Fragment 附加到 Activity}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// Fragment 创建}override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {// 创建 Fragment 的视图return inflater.inflate(R.layout.fragment_my, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 视图创建完成,可以初始化 UI 组件}override fun onStart() {super.onStart()// Fragment 变为可见}override fun onResume() {super.onResume()// Fragment 变为活跃状态}override fun onPause() {super.onPause()// Fragment 暂停}override fun onStop() {super.onStop()// Fragment 停止}override fun onDestroyView() {super.onDestroyView()// 视图被销毁,清理视图相关资源}override fun onDestroy() {super.onDestroy()// Fragment 被销毁}override fun onDetach() {super.onDetach()// Fragment 从 Activity 分离}}
布局和 UI 组件
XML 布局 vs Compose
Android 提供了两种 UI 构建方式:传统的 XML 布局和现代的 Compose。
响应式布局
Android 提供了多种方式创建响应式布局:
// Compose 响应式布局@Composablefun ResponsiveLayout() {val configuration = LocalConfiguration.currentval screenWidth = configuration.screenWidthDpif (screenWidth >= 600) {// 平板布局 - 两列Row(modifier = Modifier.fillMaxSize()) {Column(modifier = Modifier.weight(1f).padding(16.dp)) {Text("左侧内容")}Column(modifier = Modifier.weight(1f).padding(16.dp)) {Text("右侧内容")}}} else {// 手机布局 - 单列Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {Text("主要内容")}}}// 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="horizontal"><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:padding="16dp"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="左侧内容" /></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:padding="16dp"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="右侧内容" /></LinearLayout></LinearLayout>*/
事件处理
用户交互处理
Android 提供了多种方式处理用户交互,类似于 React Native 的事件处理。
资源管理
资源文件组织
Android 使用资源文件系统来管理字符串、颜色、尺寸等,类似于 React Native 的常量管理。
多语言支持
Android 提供了完善的多语言支持机制:
// 多语言资源文件// res/values/strings.xml (默认语言)<?xml version="1.0" encoding="utf-8"?><resources><string name="welcome">Welcome</string><string name="login">Login</string><string name="register">Register</string></resources>// res/values-zh/strings.xml (中文)<?xml version="1.0" encoding="utf-8"?><resources><string name="welcome">欢迎</string><string name="login">登录</string><string name="register">注册</string></resources>// res/values-zh-rCN/strings.xml (简体中文)<?xml version="1.0" encoding="utf-8"?><resources><string name="welcome">欢迎</string><string name="login">登录</string><string name="register">注册</string></resources>// res/values-zh-rTW/strings.xml (繁体中文)<?xml version="1.0" encoding="utf-8"?><resources><string name="welcome">歡迎</string><string name="login">登錄</string><string name="register">註冊</string></resources>// 动态语言切换class LanguageManager {companion object {fun setLocale(context: Context, languageCode: String) {val locale = Locale(languageCode)Locale.setDefault(locale)val config = context.resources.configurationconfig.setLocale(locale)context.createConfigurationContext(config)}}}// 在 Activity 中使用class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 设置语言val language = getSharedPreferences("settings", MODE_PRIVATE).getString("language", "zh-CN") ?: "zh-CN"LanguageManager.setLocale(this, language)setContentView(R.layout.activity_main)}}
现代 Android 开发最佳实践
Jetpack Compose 优势
Jetpack Compose 是 Android 的现代 UI 工具包,提供了声明式 UI 开发方式:
// Compose 最佳实践@Composablefun ModernAndroidApp() {var currentScreen by remember { mutableStateOf("home") }MaterialTheme {Scaffold(topBar = {TopAppBar(title = { Text("现代 Android 应用") },actions = {IconButton(onClick = { /* 设置 */ }) {Icon(Icons.Default.Settings, "设置")}})},bottomBar = {BottomNavigation {BottomNavigationItem(icon = { Icon(Icons.Default.Home, "首页") },label = { Text("首页") },selected = currentScreen == "home",onClick = { currentScreen = "home" })BottomNavigationItem(icon = { Icon(Icons.Default.Person, "个人") },label = { Text("个人") },selected = currentScreen == "profile",onClick = { currentScreen = "profile" })}}) { paddingValues ->when (currentScreen) {"home" -> HomeScreen(Modifier.padding(paddingValues))"profile" -> ProfileScreen(Modifier.padding(paddingValues))}}}}@Composablefun HomeScreen(modifier: Modifier = Modifier) {LazyColumn(modifier = modifier.fillMaxSize()) {item {Text(text = "欢迎使用现代 Android 开发",style = MaterialTheme.typography.headlineMedium,modifier = Modifier.padding(16.dp))}items(10) { index ->Card(modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp),elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)) {Text(text = "项目 ${index + 1}",modifier = Modifier.padding(16.dp))}}}}
总结
在本模块中,我们探索了使用 Kotlin 进行 Android 开发的基础知识,并将其与 JavaScript/React Native 模式进行了对比。以下是关键要点:
涵盖的核心概念:
- 项目结构:Android 的有组织目录结构 vs React Native 的简化方法
- 生命周期管理:Activity 和 Fragment 生命周期 vs React 组件生命周期
- UI 开发:XML 布局和 Compose vs React Native 的 StyleSheet 方法
- 事件处理:Android 的全面触摸系统 vs React Native 的手势处理
- 资源管理:Android 的资源系统 vs React Native 的资产方法
- 现代实践:Jetpack Compose 的声明式 UI vs React Native 的基于组件的方法
Android 开发优势:
- 类型安全:Kotlin 的强类型系统防止运行时错误
- 性能:原生 Android 性能 vs JavaScript 桥接开销
- 平台集成:直接访问 Android API 和系统功能
- 工具支持:Android Studio 提供优秀的 IDE 支持
- 生态系统:丰富的 Android 特定库和框架
最佳实践:
- 使用 Jetpack Compose 进行现代 UI 开发
- 实现适当的生命周期管理 以防止内存泄漏
- 遵循 Material Design 指南 以获得一致的用户体验
- 使用 ViewModel 进行状态管理和配置更改
- 实现适当的错误处理 和用户反馈
- 优化性能 使用 RecyclerView 和高效布局
下一步:
在下一个模块中,我们将探索使用 Kotlin 进行 Web 开发,包括 Spring Boot 框架和后端服务,继续我们从 JavaScript 到 Kotlin 开发模式的旅程。