- vừa được xem lúc

PendingIntent là gì và khi nào cần sử dụng trong lập tình Android?

0 0 13

Người đăng: Tuyển Thủ Lon Nước Ngọt

Theo Viblo Asia

PendingIntent là một tính năng quan trọng trong Android, nó cho phép ứng dụng thực hiện một số hành động đã được xác định trước trong tương lai, ngay cả khi ứng dụng đó không đang chạy.

PendingIntent đóng vai trò như một mô hình mô tả hành động sẽ được thực hiện và được sử dụng để cung cấp một cách an toàn để thực hiện một hành động từ một ứng dụng hoặc một quy trình khác. Nó hoạt động như một giấy phép hoặc quyền để thực hiện một hành động cụ thể trong tương lai.

PendingIntent đảm bảo rằng các hành động được thực hiện một cách an toàn và có kiểm soát trong hệ thống Android. Nó giúp ngăn chặn các ứng dụng khác truy cập trái phép vào các thành phần của ứng dụng bằng cách yêu cầu quyền để thực hiện các hành động nhất định.

Trong Android, PendingIntent được sử dụng để đại diện cho một thao tác sẽ được thực hiện trong tương lai. Nó thường được sử dụng trong các trường hợp sau:

  1. Gửi Broadcast Intents:

    • PendingIntent cho phép bạn gửi một broadcast intent từ một ứng dụng khác hoặc từ hệ thống. Ví dụ, khi bạn đăng ký một BroadcastReceiver để nhận thông báo về thay đổi của hệ thống (như khi bàn phím được mở, pin yếu, v.v.), bạn cần sử dụng PendingIntent.
  2. Thực hiện Hành động từ Thông báo (Notification):

    • Khi bạn hiển thị một thông báo (Notification), bạn có thể tạo các hành động (action) để người dùng có thể tương tác với thông báo đó. Ví dụ, khi nhận cuộc gọi đến, người dùng có thể nhận hoặc từ chối cuộc gọi ngay từ thông báo. Để xử lý các hành động này, bạn cần sử dụng PendingIntent.
  3. Lên lịch Alarm:

    • Khi bạn muốn lên lịch một Alarm để thực hiện một tác vụ cụ thể vào một thời điểm nhất định trong tương lai, bạn cần sử dụng PendingIntent để chỉ định hành động sẽ được thực hiện khi Alarm được kích hoạt.
  4. Khởi chạy Dịch vụ (Service) hoặc Hoạt động (Activity):

    • PendingIntent có thể được sử dụng để khởi chạy một dịch vụ hoặc một hoạt động từ các ngữ cảnh khác nhau, chẳng hạn như từ một ứng dụng khác hoặc từ hệ thống.
  5. Xử lý Các Tác vụ Tương lai:

    • Trong một số trường hợp, khi bạn muốn thực hiện một tác vụ sau khi một sự kiện xảy ra trong tương lai (ví dụ, sau khi tải xuống dữ liệu hoặc sau khi xử lý hoàn tất), bạn có thể sử dụng PendingIntent để đảm bảo rằng tác vụ đó sẽ được thực hiện đúng cách.

Demo cho từng kiểu

  1. Gửi Broadcast Intents:
    • Trong ví dụ này, chúng ta sẽ đăng ký một BroadcastReceiver để nhận thông báo khi điện thoại được cắm vào nguồn điện và sử dụng PendingIntent để gửi một thông báo.
// BatteryBroadcastReceiver.kt
class BatteryBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action if (action == Intent.ACTION_POWER_CONNECTED) { showNotification(context) } } private fun showNotification(context: Context) { val intent = Intent(context, MainActivity::class.java) val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) val notification = NotificationCompat.Builder(context, "channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("Battery Charged") .setContentText("Your device is now charging.") .setContentIntent(pendingIntent) .build() val notificationManager = NotificationManagerCompat.from(context) notificationManager.notify(1, notification) }
}
  1. Thực hiện Hành động từ Thông báo (Notification):
    • Trong ví dụ này, chúng ta sẽ hiển thị một thông báo với hai hành động: "Nhận cuộc gọi" và "Từ chối cuộc gọi". Chúng ta sử dụng PendingIntent để xử lý các hành động này.
// MainActivity.kt
fun showNotificationWithActions() { val answerIntent = Intent(this, AnswerCallActivity::class.java) val answerPendingIntent = PendingIntent.getActivity(this, 0, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT) val rejectIntent = Intent(this, RejectCallActivity::class.java) val rejectPendingIntent = PendingIntent.getActivity(this, 0, rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT) val notification = NotificationCompat.Builder(this, "channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("Incoming Call") .setContentText("John Doe is calling...") .addAction(R.drawable.ic_call, "Answer", answerPendingIntent) .addAction(R.drawable.ic_decline, "Reject", rejectPendingIntent) .build() val notificationManager = NotificationManagerCompat.from(this) notificationManager.notify(2, notification)
}
  1. Lên lịch Alarm:
    • Trong ví dụ này, chúng ta sẽ lên lịch một Alarm để hiển thị một thông báo vào một thời điểm nhất định trong tương lai. Chúng ta sử dụng PendingIntent để chỉ định hành động sẽ được thực hiện khi Alarm được kích hoạt.
// MainActivity.kt
fun scheduleAlarm() { val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(this, AlarmReceiver::class.java) val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) val currentTime = System.currentTimeMillis() val alarmTime = currentTime + (5 * 60 * 1000) // Hiện tại + 5 phút alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent)
} // AlarmReceiver.kt
class AlarmReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { showNotification(context) } private fun showNotification(context: Context) { val intent = Intent(context, MainActivity::class.java) val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) val notification = NotificationCompat.Builder(context, "channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("Alarm Notification") .setContentText("This is an alarm notification.") .setContentIntent(pendingIntent) .build() val notificationManager = NotificationManagerCompat.from(context) notificationManager.notify(3, notification) }
}
  1. Khởi chạy Dịch vụ (Service) hoặc Hoạt động (Activity):
    • Trong ví dụ này, chúng ta sẽ khởi chạy một dịch vụ từ một ứng dụng khác bằng cách sử dụng PendingIntent.
// Ứng dụng khác
val intent = Intent("com.example.myapp.MY_SERVICE_ACTION")
val pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
try { pendingIntent.send()
} catch (e: PendingIntent.CanceledException) { e.printStackTrace()
} // Ứng dụng của bạn
class MyService : Service() { override fun onBind(intent: Intent?): IBinder? { return null } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent?.action == "com.example.myapp.MY_SERVICE_ACTION") { // Xử lý dịch vụ ở đây } return START_NOT_STICKY }
}
  1. Xử lý Các Tác vụ Tương lai:
    • Trong ví dụ này, chúng ta sẽ sử dụng PendingIntent để thực hiện một tác vụ sau khi tải xuống dữ liệu hoàn tất.
// DownloadManager.kt
fun downloadData(context: Context) { val request = DownloadManager.Request(Uri.parse("https://example.com/data.zip")) request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) request.setTitle("Data Download") request.setDescription("Downloading data...") val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val downloadId = downloadManager.enqueue(request) val intent = Intent(context, DownloadCompletedReceiver::class.java) val pendingIntent = PendingIntent.getBroadcast(context, downloadId, intent, PendingIntent.FLAG_UPDATE_CURRENT) downloadManager.addCompletedDownloadListener(pendingIntent)
} // DownloadCompletedReceiver.kt
class DownloadCompletedReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) if (downloadId != -1L) { val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val query = DownloadManager.Query().setFilterById(downloadId) val cursor = downloadManager.query(query) if (cursor.moveToFirst()) { val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) if (status == DownloadManager.STATUS_SUCCESSFUL) { // Thực hiện các tác vụ sau khi tải xuống hoàn tất processDownloadedData(context) } } cursor.close() }
} private fun processDownloadedData(context: Context) { // Xử lý dữ liệu đã tải xuống ở đây val intent = Intent(context, DataProcessingActivity::class.java) context.startActivity(intent)
} Trong ví dụ này, chúng ta sử dụng DownloadManager để tải xuống dữ liệu từ một URL. Sau khi quá trình tải xuống hoàn tất, DownloadCompletedReceiver sẽ được gọi. Trong onReceive(), chúng ta kiểm tra trạng thái của tải xuống. Nếu tải xuống thành công, chúng ta gọi phương thức processDownloadedData() để xử lý dữ liệu đã tải xuống, ví dụ như khởi chạy một hoạt động mới để hiển thị dữ liệu đó.
Trong tất cả các ví dụ trên, chúng ta sử dụng PendingIntent để đảm bảo rằng các hành động sẽ được thực hiện đúng cách và an toàn, ngay cả khi chúng xảy ra trong tương lai hoặc từ các ngữ cảnh khác nhau. PendingIntent cung cấp một cơ chế bảo mật để đảm bảo rằng chỉ có ứng dụng được ủy quyền mới có thể thực hiện các hành động nhất định. Lưu ý rằng trong một số ví dụ, chúng ta sử dụng PendingIntent.getActivity() để khởi chạy một hoạt động, PendingIntent.getBroadcast() để gửi một broadcast intent, và PendingIntent.getService() để khởi chạy một dịch vụ. Cờ PendingIntent.FLAG_UPDATE_CURRENT được sử dụng để cập nhật PendingIntent hiện có nếu nó đã tồn tại, thay vì tạo một PendingIntent mới.
Đây là một bài dài và chi tiết về việc sử dụng PendingIntent trong Android với các ví dụ mã Kotlin. Hy vọng nó sẽ giúp bạn hiểu rõ hơn về cách sử dụng PendingIntent trong các trường hợp khác nhau. CopyRetryClaude does not have the ability to run the code it generates yet.Claude can make mistakes. Please double-check responses.

PendingIntent đóng vai trò quan trọng trong việc cho phép ứng dụng Android xử lý các sự kiện bất đồng bộ và thực hiện các tác vụ trong tương lai một cách an toàn và đáng tin cậy. Nó cung cấp một cơ chế bảo mật để đảm bảo rằng chỉ có ứng dụng được ủy quyền mới có thể thực hiện các hành động nhất định.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 281

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 206

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 107

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 100

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 68

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 315