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")
}