Intents và Navigation
1. Giới thiệu
Phần tiêu đề “1. Giới thiệu”Intent là cơ chế messaging để yêu cầu hành động từ component khác.
2. Loại Intent
Phần tiêu đề “2. Loại Intent”Explicit Intent
Phần tiêu đề “Explicit Intent”Chỉ định rõ component đích:
// Mở Activity cụ thểval intent = Intent(this, DetailActivity::class.java)startActivity(intent)Implicit Intent
Phần tiêu đề “Implicit Intent”Khai báo action chung, hệ thống chọn component phù hợp:
// Mở URLval intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com"))startActivity(intent)3. Truyền dữ liệu
Phần tiêu đề “3. Truyền dữ liệu”Primitives
Phần tiêu đề “Primitives”val intent = Intent(this, DetailActivity::class.java).apply { putExtra("id", 123) putExtra("name", "Alice") putExtra("active", true)}startActivity(intent)Nhận dữ liệu
Phần tiêu đề “Nhận dữ liệu”class DetailActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
val id = intent.getIntExtra("id", 0) val name = intent.getStringExtra("name") ?: "" val active = intent.getBooleanExtra("active", false) }}Parcelable Objects
Phần tiêu đề “Parcelable Objects”@Parcelizedata class User( val id: Int, val name: String, val email: String) : Parcelable
// Gửiintent.putExtra("user", user)
// Nhậnval user = intent.getParcelableExtra<User>("user")4. Implicit Intents phổ biến
Phần tiêu đề “4. Implicit Intents phổ biến”Mở trình duyệt
Phần tiêu đề “Mở trình duyệt”val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))startActivity(intent)Gửi email
Phần tiêu đề “Gửi email”val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") putExtra(Intent.EXTRA_EMAIL, arrayOf("recipient@example.com")) putExtra(Intent.EXTRA_SUBJECT, "Subject") putExtra(Intent.EXTRA_TEXT, "Email body")}if (intent.resolveActivity(packageManager) != null) { startActivity(intent)}Gọi điện
Phần tiêu đề “Gọi điện”val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:0123456789")}startActivity(intent)Chia sẻ
Phần tiêu đề “Chia sẻ”val intent = Intent(Intent.ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, "Check this out!")}startActivity(Intent.createChooser(intent, "Share via"))Chụp ảnh
Phần tiêu đề “Chụp ảnh”val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)}5. Activity Result API (Modern)
Phần tiêu đề “5. Activity Result API (Modern)”class MainActivity : ComponentActivity() {
private val getContent = registerForActivityResult( ActivityResultContracts.GetContent() ) { uri: Uri? -> // Handle selected image URI }
private val takePicture = registerForActivityResult( ActivityResultContracts.TakePicturePreview() ) { bitmap: Bitmap? -> // Handle captured image }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Column { Button(onClick = { getContent.launch("image/*") }) { Text("Pick Image") } Button(onClick = { takePicture.launch(null) }) { Text("Take Photo") } } } }}6. Custom Activity Result
Phần tiêu đề “6. Custom Activity Result”// Activity Aprivate val detailLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data = result.data?.getStringExtra("result") // Handle result }}
// LaunchdetailLauncher.launch(Intent(this, DetailActivity::class.java))
// Activity B (DetailActivity)setResult(Activity.RESULT_OK, Intent().apply { putExtra("result", "Success")})finish()7. Navigation với Compose
Phần tiêu đề “7. Navigation với Compose”Setup Navigation
Phần tiêu đề “Setup Navigation”@Composablefun NavGraph() { val navController = rememberNavController()
NavHost(navController, startDestination = "home") { composable("home") { HomeScreen( onNavigateToDetail = { id -> navController.navigate("detail/$id") } ) } composable( "detail/{id}", arguments = listOf(navArgument("id") { type = NavType.IntType }) ) { backStackEntry -> val id = backStackEntry.arguments?.getInt("id") ?: 0 DetailScreen(id) } }}Navigate với arguments
Phần tiêu đề “Navigate với arguments”// NavigatenavController.navigate("detail/123")
// Navigate và pop currentnavController.navigate("home") { popUpTo("home") { inclusive = true }}
// Go backnavController.popBackStack()8. Deep Links
Phần tiêu đề “8. Deep Links”Khai báo trong Manifest
Phần tiêu đề “Khai báo trong Manifest”<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="product" /> </intent-filter></activity>Trong Compose Navigation
Phần tiêu đề “Trong Compose Navigation”composable( "detail/{id}", deepLinks = listOf(navDeepLink { uriPattern = "myapp://product/{id}" })) { backStackEntry -> DetailScreen(backStackEntry.arguments?.getInt("id") ?: 0)}📝 Tóm tắt
Phần tiêu đề “📝 Tóm tắt”| Loại | Mục đích |
|---|---|
| Explicit Intent | Mở component cụ thể |
| Implicit Intent | Yêu cầu action chung |
| putExtra/getExtra | Truyền dữ liệu |
| ActivityResultAPI | Nhận kết quả từ Activity |
| NavHost | Navigation trong Compose |
| Deep Links | Mở app từ URL |