Làm cách nào để phát hiện gói / nhóm thông báo đã được nhấp trong Android?


8

Trong Android Nougat trở lên, các thông báo đẩy cho ứng dụng của bạn sẽ được nhóm lại tự động sau số 4.

Vấn đề trong Android là việc nhấp vào gói không mở rộng danh sách thông báo đẩy, nó sẽ mở ứng dụng.

Tôi có một yêu cầu để xác định người dùng đã mở ứng dụng thông báo đẩy. Đối với thông báo cá nhân, điều này thật dễ dàng vì tôi có thể khám phá các mục đích bổ sung. Vấn đề với gói này là các tính năng bổ sung là null và mục đích trông giống hệt như khi người dùng nhấp vào biểu tượng trình khởi chạy. Tôi không có cách nào để phát hiện điều hướng đó được thực hiện từ thông báo đẩy :(

Chỉ trong trường hợp không rõ ràng: Tôi không sử dụng các nhóm thông báo đẩy một cách rõ ràng, việc này được Android thực hiện tự động. Tôi chưa đặt bất kỳ khóa nhóm nào cho các thông báo.

Tôi đang sử dụng Firebase. Tôi chỉ xây dựng thông báo đẩy bằng cách sử dụng NotificationCompatkhi ứng dụng ở nền trước, logic này không được thực thi khi ứng dụng ở trên nền hoặc đóng ( OnMessageReceivedchỉ chạy với ứng dụng ở nền trước).

BIÊN TẬP

Tôi biết rằng tôi có thể thay đổi tải trọng PN cho sự kiện OnMessageReceivedđược thực hiện ngay cả trong nền hoặc đóng. Tôi muốn tránh điều này vì tôi đã tìm thấy rất nhiều người phàn nàn về các vấn đề với PN không đến trong trường hợp này.

http://github.com/firebase/quickstart-android/issues/368

http://github.com/firebase/quickstart-android/issues/219

Tôi muốn phát hiện người dùng chạm vào PN được nhóm ngay cả khi ứng dụng không tạo ra nó.


AFAIK, nhấn vào biểu tượng chevron của gói sẽ mở rộng / thu gọn danh sách thông báo.
Edric

@Edric: đúng vậy ... nhưng tôi không thể ép người dùng làm điều đó. Một số người dùng sẽ nhấp vào thông báo đẩy bị sập và tôi muốn xử lý tình huống đó.
StackOverflower

Theo thông báo được tạo phía máy chủ và không phải phía máy khách, bạn có nghĩa là bạn đang sử dụng FCM, phải không? Ngay cả trong trường hợp đó, bạn vẫn đang sử dụng developer.android.com/reference/android/app/ , phải không? Bạn có thể chia sẻ một số đoạn mã?
Arnab Saha

@ArnabSaha: Tôi không thể vì mã của tôi để tạo thông báo sẽ không chạy khi ứng dụng ở chế độ nền hoặc đóng
Claudio Redi

Bạn có biết trước khi thông báo được nhóm?
Natig Babayev

Câu trả lời:


4

Giải pháp 1: Nếu bạn xử lý việc tạo thông báo, bạn có thể thử các bước sau:

Trước hết, mỗi khi bạn tạo thông báo mới, bạn có thể nhóm chúng theo cùng một phím bằng cách sử dụng setGroup(...):

val newMessageNotification1 = NotificationCompat.Builder(applicationContext, ...)
    ...
    .setGroup("group_messages")
    .build()

Khi bạn nhóm các thông báo theo cùng một id ("group_messages") , bây giờ bạn có thể tạo thông báo tóm tắt với mục đích khác nhau:

val notifyIntent = Intent(this, ResultActivity::class.java).apply {
val notifyIntent = Intent(this, ResultActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val notifyPendingIntent = PendingIntent.getActivity(
    this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT
)

val summaryNotification = NotificationCompat.Builder(applicationContext, ...)
    .setSmallIcon(android.R.drawable.ic_btn_speak_now)
    .setContentIntent(notifyPendingIntent)
    .setContentTitle("Grouped notification title")
    .setContentText("Grouped notification text")
    .setGroup("group_messages")
    .setGroupSummary(true)
    .build()

Bước cuối cùng, bạn có thể ifkiểm tra để đảm bảo rằng bạn có nhiều hơn 1 thông báo với cùng một nhóm và sau đó thông báo bằng thông báo nhóm:

val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

val notificationManagerCompat = NotificationManagerCompat.from(applicationContext)
notificationManagerCompat.notify(ID, newMessageNotification1)

val amountOfNotificationsInSameGroup = notificationManager.activeNotifications
                    // Here we filter notifications that are under same group
                    .filter { it.notification.group == "group_messages" }
                    .size

if (amountOfNotificationsInSameGroup >= 2) {
    // if we already have minimum of 2 notifications, we'll group them under summary notification
    notificationManagerCompat.notify(SUMMARY_NOTIFICATION_ID, summaryNotification)
}

Bạn có thể kết hợp mã trong onMessageReceivedphương thức của bạn . Như bạn có thể thấy, bây giờ bạn có thể có ý định tùy chỉnh để xử lý các thông báo được nhóm. Bạn có thể đọc thêm về các thông báo được nhóm ở đây .

Giải pháp 2: Nếu bạn không muốn xử lý việc tạo thông báo và vẫn muốn biết liệu các thông báo có được nhóm hay không, bạn có thể thử giải pháp sau:

NotificationManagercó chức năng getActiveNotutions () sẽ trả về các thông báo đã được đăng bởi ứng dụng gọi điện và chưa bị người dùng loại bỏ. Khi bạn nhấp vào thông báo được nhóm trong Android, thông báo sẽ không bị loại bỏ. Do đó, bạn có thể kiểm tra kích thước của thông báo hoạt động trong hoạt động trình khởi chạy của mình để phát hiện xem ứng dụng có được khởi chạy hay không bằng cách nhấp vào thông báo được nhóm / gói:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val notificationManager =
            applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (notificationManager.activeNotifications.size >= 4) {
            // Notifications are grouped
            // Put your logic here

            // Do not forget to clear notifications
            NotificationManagerCompat.from(this).cancelAll()
        }
    }
}

Cá nhân, tôi thích giải pháp đầu tiên, nhưng theo các vấn đề bạn đã đăng, bạn cũng có thể sử dụng tùy chọn thứ hai nhưng lưu ý rằng bạn sẽ không thể phân biệt được nếu ứng dụng được khởi chạy từ trình khởi chạy hoặc bằng cách nhấp vào thông báo được nhóm.

Với giải pháp thứ hai có thể có những câu hỏi sau:

Q1: Làm thế nào tôi có thể phân biệt nhấp chuột thông báo bình thường từ nhóm một trong cùng một hoạt động?

- Đơn giản là bạn có thể xác định click_actionvà chuyển tiếp các nhấp chuột thông báo bình thường cho các hoạt động khác nhau. Kiểm tra tài liệu .

Nếu bạn muốn thay thế các thông báo trước đó, bạn cũng có thể định nghĩa tương tự tagtrong JSON thông báo của mình ở phía phụ trợ. Theo cách này, thông báo sẽ không được gói bởi vì thông báo mới hơn sẽ thay thế thông báo cũ bằng cùng một thẻ. Kiểm tra tài liệu .

Tôi hy vọng câu trả lời của tôi sẽ giúp.


Tôi chỉ giới thiệu PN khi ứng dụng ở phía trước. Phương thức OnMessageReceived không được thực thi khi đóng ứng dụng. Tôi đã thấy tài liệu nói rằng ngay cả khi tôi quản lý để làm cho ứng dụng xử lý PN khi ứng dụng bị đóng hoặc ở chế độ nền, điều đó không hoạt động tốt lắm.
StackOverflower

Nó không hoạt động. Có lẽ bạn không sử dụng nó đúng cách. Bạn có thể đặt mã của mình và tham chiếu mã tài liệu nói rằng bạn không thể tạo thông báo theo cách thủ công không?
Natig Babayev

@StackOverflower bạn có thể sử dụng tin nhắn dữ liệu trong Firbebase và bằng cách đó bạn có thể tạo thông báo của mình ngay cả khi ứng dụng bị
hủy


Các liên kết bạn đã chia sẻ không nói rằng điều đó không được khuyến nghị và có vẻ như sự cố đang xảy ra trên một số thiết bị. Làm thế nào bạn đã thực hiện thông báo trong ứng dụng của bạn?
Natig Babayev

0

Trả lời bởi @Natig Babayev cũng được giải thích. Tuy nhiên, trong phần thứ hai, ông đã không giải thích cách phân biệt ứng dụng đã được mở bằng cách nhấp vào biểu tượng trình khởi chạy hoặc bằng cách nhấp vào Gói thông báo đẩy (xem xét trường hợp khi có 5 thông báo được nhóm tự động, nhưng người dùng sẽ khởi chạy ứng dụng bằng cách nhấp vào trình khởi chạy ứng dụng chứ không phải trên gói thông báo.)

Một giải pháp có thể là vô hiệu hóa tự động nhóm thông báo . Tuy nhiên, điều này là không thể . Tham khảo câu hỏi nàycâu hỏi này quá

Tôi đã nghiên cứu nhiều tùy chọn khác nhau và thấy rằng giải pháp tốt nhất sẽ là tự thông báo nhóm trước khi hệ thống Android thực hiện hoặc giới hạn số lượng thông báo trong tối đa các thông báo chưa được nhóm bằng cách xóa các thông báo cũ hơn hoặc gói chúng trong một gói riêng biệt.

Bạn cũng có thể tham khảo sau

  1. https://stackoverflow.com/a/47073575/9640177
  2. https://stackoverflow.com/a/34961716/9640177
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.