跳到主要内容

Android 开发速查表

本文档整理了 Android 开发中常用的代码片段和配置,方便快速查阅。

Activity

启动 Activity

val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

获取传递的数据

val value = intent.getStringExtra("key")
val number = intent.getIntExtra("number", 0)

Activity 生命周期

override fun onCreate(savedInstanceState: Bundle?) { }
override fun onStart() { }
override fun onResume() { }
override fun onPause() { }
override fun onStop() { }
override fun onDestroy() { }

设置布局

setContentView(R.layout.activity_main)

// ViewBinding
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

Fragment

创建 Fragment

class MyFragment : Fragment() {
private var _binding: FragmentMyBinding? = null
private val binding get() = _binding!!

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentMyBinding.inflate(inflater, container, false)
return binding.root
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

Fragment 事务

supportFragmentManager.beginTransaction()
.replace(R.id.container, MyFragment())
.addToBackStack(null)
.commit()

布局

常用尺寸单位

android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_width="100dp"
android:padding="16dp"
android:layout_margin="8dp"

ConstraintLayout 约束

app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

居中

app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

UI 组件

TextView

textView.text = "文本内容"
textView.textSize = 16f
textView.setTextColor(Color.RED)

EditText

editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {}
})

Button

button.setOnClickListener {
// 点击事件
}

RecyclerView

recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(items)

Toast

Toast.makeText(context, "消息", Toast.LENGTH_SHORT).show()

Snackbar

Snackbar.make(view, "消息", Snackbar.LENGTH_SHORT)
.setAction("撤销") { }
.show()

Dialog

AlertDialog.Builder(this)
.setTitle("标题")
.setMessage("内容")
.setPositiveButton("确定") { dialog, _ -> dialog.dismiss() }
.setNegativeButton("取消") { dialog, _ -> dialog.dismiss() }
.show()

数据存储

SharedPreferences

// 写入
val prefs = getSharedPreferences("name", Context.MODE_PRIVATE)
prefs.edit().putString("key", "value").apply()

// 读取
val value = prefs.getString("key", "default")

Room 数据库

@Entity
data class User(@PrimaryKey val id: Int, val name: String)

@Dao
interface UserDao {
@Query("SELECT * FROM user")
suspend fun getAll(): List<User>

@Insert
suspend fun insert(user: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}

DataStore

// Preferences DataStore
val Context.dataStore by preferencesDataStore("settings")

suspend fun saveValue(key: String, value: String) {
context.dataStore.edit { it[stringPreferencesKey(key)] = value }
}

网络请求

Retrofit

interface ApiService {
@GET("users")
suspend fun getUsers(): List<User>

@POST("users")
suspend fun createUser(@Body user: User): User
}

val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()

val apiService = retrofit.create(ApiService::class.java)

协程网络请求

viewModelScope.launch {
try {
val users = apiService.getUsers()
_users.value = users
} catch (e: Exception) {
_error.value = e.message
}
}

架构组件

ViewModel

class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data

fun updateData(value: String) {
_data.value = value
}
}

// 在 Activity 中使用
val viewModel: MyViewModel by viewModels()

LiveData

// 观察
viewModel.data.observe(this) { value ->
// 更新 UI
}

// 更新
_data.value = "新值" // 主线程
_data.postValue("新值") // 后台线程

StateFlow

private val _state = MutableStateFlow(0)
val state: StateFlow<Int> = _state

// 更新
_state.value = 1

// 观察
viewModel.state.collectAsState()

Jetpack Compose

Composable 函数

@Composable
fun MyScreen() {
Column(modifier = Modifier.padding(16.dp)) {
Text("Hello")
Button(onClick = { }) {
Text("点击")
}
}
}

状态

var count by remember { mutableStateOf(0) }

// 配置变更保留
var count by rememberSaveable { mutableStateOf(0) }

列表

LazyColumn {
items(items) { item ->
ItemRow(item)
}
}

导航

val navController = rememberNavController()

NavHost(navController, startDestination = "home") {
composable("home") { HomeScreen() }
composable("detail/{id}") { DetailScreen() }
}

// 导航
navController.navigate("detail/123")

协程

启动协程

// 在 ViewModel 中
viewModelScope.launch {
// 协程代码
}

// 在 Activity/Fragment 中
lifecycleScope.launch {
// 协程代码
}

切换线程

withContext(Dispatchers.IO) {
// IO 操作
}

withContext(Dispatchers.Main) {
// UI 操作
}

异步并行

val deferred1 = async { task1() }
val deferred2 = async { task2() }
val result1 = deferred1.await()
val result2 = deferred2.await()

权限

声明权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />

动态申请权限

when {
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED -> {
// 已有权限
}
else -> {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_CODE)
}
}

Intent

隐式 Intent

// 打开网页
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))
startActivity(intent)

// 拨打电话
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:10086"))
startActivity(intent)

// 分享
val intent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "分享内容")
}
startActivity(Intent.createChooser(intent, "分享到"))

常用依赖

dependencies {
// AndroidX Core
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")

// Lifecycle
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")

// Navigation
implementation("androidx.navigation:navigation-fragment-ktx:2.7.6")
implementation("androidx.navigation:navigation-ui-ktx:2.7.6")

// Room
implementation("androidx.room:room-runtime:2.6.1")
implementation("androidx.room:room-ktx:2.6.1")
ksp("androidx.room:room-compiler:2.6.1")

// Retrofit
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")

// Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

// Coil (图片加载)
implementation("io.coil-kt:coil:2.5.0")

// DataStore
implementation("androidx.datastore:datastore-preferences:1.0.0")

// Compose
implementation(platform("androidx.compose:compose-bom:2023.10.01"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
implementation("androidx.activity:activity-compose:1.8.2")
}

参考链接