Bagikan melalui


Pendengar pemberitahuan: Mengakses semua pemberitahuan

Pendengar pemberitahuan menyediakan akses ke pemberitahuan pengguna. Jam tangan pintar dan pakaian lainnya dapat menggunakan pendengar pemberitahuan untuk mengirim pemberitahuan ponsel ke perangkat yang dapat dipakai. Aplikasi otomatisasi rumah dapat menggunakan pendengar pemberitahuan untuk melakukan tindakan tertentu saat pemberitahuan diterima, seperti membuat lampu berkedip saat Anda menerima panggilan.

Penting

Memerlukan Pembaruan Hari Jadi: Anda harus menargetkan SDK 14393 dan menjalankan build 14393 atau yang lebih baru untuk menggunakan Pendengar Pemberitahuan.

API Penting: Kelas UserNotificationListener, kelas UserNotificationChangedTrigger

Aktifkan pendengar dengan menambahkan kemampuan Pemberitahuan Pengguna

Untuk menggunakan pendengar pemberitahuan, Anda harus menambahkan kemampuan Pendengar Pemberitahuan Pengguna ke manifes aplikasi Anda.

  1. Di Visual Studio, di Penjelajah Solusi, klik dua kali file Anda Package.appxmanifest untuk membuka perancang manifes.
  2. Buka tab Kemampuan.
  3. Periksa kemampuan Listener Pemberitahuan Pengguna.

Periksa apakah pendengar didukung

Jika aplikasi Anda mendukung versi Windows 10 yang lebih lama, Anda perlu menggunakan kelas ApiInformation untuk memeriksa apakah pendengar didukung. Jika pendengar tidak didukung, hindari menjalankan panggilan apa pun ke API pendengar.

if (ApiInformation.IsTypePresent("Windows.UI.Notifications.Management.UserNotificationListener"))
{
    // Listener supported!
}
 
else
{
    // Older version of Windows, no Listener
}

Meminta akses ke pendengar

Karena pendengar mengizinkan akses ke pemberitahuan pengguna, pengguna harus memberikan izin kepada aplikasi Anda untuk mengakses pemberitahuan mereka. Selama pengalaman eksekusi pertama aplikasi, Anda harus meminta akses untuk menggunakan pendengar pemberitahuan. Jika mau, Anda dapat menampilkan beberapa UI awal yang menjelaskan mengapa aplikasi Anda memerlukan akses ke pemberitahuan pengguna sebelum Anda memanggil RequestAccessAsync, sehingga pengguna memahami mengapa mereka harus mengizinkan akses.

// Get the listener
UserNotificationListener listener = UserNotificationListener.Current;
 
// And request access to the user's notifications (must be called from UI thread)
UserNotificationListenerAccessStatus accessStatus = await listener.RequestAccessAsync();
 
switch (accessStatus)
{
    // This means the user has granted access.
    case UserNotificationListenerAccessStatus.Allowed:
 
        // Yay! Proceed as normal
        break;
 
    // This means the user has denied access.
    // Any further calls to RequestAccessAsync will instantly
    // return Denied. The user must go to the Windows settings
    // and manually allow access.
    case UserNotificationListenerAccessStatus.Denied:
 
        // Show UI explaining that listener features will not
        // work until user allows access.
        break;
 
    // This means the user closed the prompt without
    // selecting either allow or deny. Further calls to
    // RequestAccessAsync will show the dialog again.
    case UserNotificationListenerAccessStatus.Unspecified:
 
        // Show UI that allows the user to bring up the prompt again
        break;
}

Pengguna dapat mencabut akses kapan saja melalui Pengaturan Windows. Oleh karena itu, aplikasi Anda harus selalu memeriksa status akses melalui metode GetAccessStatus sebelum menjalankan kode yang menggunakan pendengar pemberitahuan. Jika pengguna mencabut akses, API akan gagal secara diam-diam daripada melemparkan pengecualian (misalnya, API untuk mendapatkan semua pemberitahuan hanya akan mengembalikan daftar kosong).

Mengakses pemberitahuan pengguna

Dengan pendengar pemberitahuan, Anda bisa mendapatkan daftar pemberitahuan pengguna saat ini. Cukup panggil metode GetNotificationsAsync , dan tentukan jenis pemberitahuan yang ingin Anda dapatkan (saat ini, satu-satunya jenis pemberitahuan yang didukung adalah pemberitahuan toast).

// Get the toast notifications
IReadOnlyList<UserNotification> notifs = await listener.GetNotificationsAsync(NotificationKinds.Toast);

Menampilkan pemberitahuan

Setiap pemberitahuan direpresentasikan sebagai UserNotification, yang menyediakan informasi tentang aplikasi tempat pemberitahuan berasal, waktu pemberitahuan dibuat, ID pemberitahuan, dan pemberitahuan itu sendiri.

public sealed class UserNotification
{
    public AppInfo AppInfo { get; }
    public DateTimeOffset CreationTime { get; }
    public uint Id { get; }
    public Notification Notification { get; }
}

Properti AppInfo menyediakan info yang Anda butuhkan untuk menampilkan pemberitahuan.

Catatan

Sebaiknya seputar semua kode Anda untuk memproses satu pemberitahuan dalam coba/tangkap, jika terjadi pengecualian tak terduga saat Anda menangkap satu pemberitahuan. Anda seharusnya tidak sepenuhnya gagal menampilkan pemberitahuan lain hanya karena masalah dengan satu pemberitahuan tertentu.

// Select the first notification
UserNotification notif = notifs[0];
 
// Get the app's display name
string appDisplayName = notif.AppInfo.DisplayInfo.DisplayName;
 
// Get the app's logo
BitmapImage appLogo = new BitmapImage();
RandomAccessStreamReference appLogoStream = notif.AppInfo.DisplayInfo.GetLogo(new Size(16, 16));
await appLogo.SetSourceAsync(await appLogoStream.OpenReadAsync());

Konten pemberitahuan itu sendiri, seperti teks pemberitahuan, terkandung dalam properti Pemberitahuan . Properti ini berisi bagian visual pemberitahuan. (Jika Anda terbiasa mengirim pemberitahuan di Windows, Anda akan melihat bahwa Properti Visual dan Visual.Bindings di objek Pemberitahuan sesuai dengan apa yang dikirim pengembang saat memunculkan pemberitahuan.)

Kami ingin mencari pengikatan toast (untuk kode bukti kesalahan, Anda harus memeriksa bahwa pengikatan tidak null). Dari pengikatan, Anda dapat memperoleh elemen teks. Anda dapat memilih untuk menampilkan elemen teks sebanyak yang Anda inginkan. (Idealnya, Anda harus menampilkan semuanya.) Anda dapat memilih untuk memperlakukan elemen teks secara berbeda; misalnya, perlakukan yang pertama sebagai teks judul, dan elemen berikutnya sebagai teks isi.

// Get the toast binding, if present
NotificationBinding toastBinding = notif.Notification.Visual.GetBinding(KnownNotificationBindings.ToastGeneric);
 
if (toastBinding != null)
{
    // And then get the text elements from the toast binding
    IReadOnlyList<AdaptiveNotificationText> textElements = toastBinding.GetTextElements();
 
    // Treat the first text element as the title text
    string titleText = textElements.FirstOrDefault()?.Text;
 
    // We'll treat all subsequent text elements as body text,
    // joining them together via newlines.
    string bodyText = string.Join("\n", textElements.Skip(1).Select(t => t.Text));
}

Menghapus pemberitahuan tertentu

Jika wearable atau layanan Anda memungkinkan pengguna untuk menutup pemberitahuan, Anda dapat menghapus pemberitahuan aktual sehingga pengguna tidak melihatnya nanti di ponsel atau PC mereka. Cukup berikan ID pemberitahuan (diperoleh dari objek UserNotification ) dari pemberitahuan yang ingin Anda hapus:

// Remove the notification
listener.RemoveNotification(notifId);

Menghapus semua pemberitahuan

Metode UserNotificationListener.ClearNotifications menghapus semua pemberitahuan pengguna. Gunakan metode ini dengan hati-hati. Anda hanya boleh menghapus semua pemberitahuan jika wearable atau layanan Anda menampilkan SEMUA pemberitahuan. Jika wearable atau layanan Anda hanya menampilkan pemberitahuan tertentu, ketika pengguna mengklik tombol "Hapus pemberitahuan" Anda, pengguna hanya mengharapkan pemberitahuan tertentu tersebut dihapus; namun, memanggil metode ClearNotifications benar-benar akan menyebabkan semua pemberitahuan, termasuk yang tidak dapat dipakai atau layanan Anda tidak ditampilkan, akan dihapus.

// Clear all notifications. Use with caution.
listener.ClearNotifications();

Tugas latar belakang untuk pemberitahuan ditambahkan/dihentikan

Cara umum untuk mengaktifkan aplikasi untuk mendengarkan pemberitahuan adalah dengan menyiapkan tugas latar belakang, sehingga Anda dapat mengetahui kapan pemberitahuan ditambahkan atau ditutup terlepas dari apakah aplikasi Anda sedang berjalan.

Berkat model proses tunggal yang ditambahkan dalam Anniversary Update, menambahkan tugas latar belakang cukup sederhana. Dalam kode aplikasi utama Anda, setelah Anda mendapatkan akses pengguna ke Pendengar Pemberitahuan dan mendapatkan akses untuk menjalankan tugas latar belakang dengan memanggil UserNotificationListener.Current.RequestAccessAsync dan BackgroundExecutionManager.RequestAccessAsync masing-masing, cukup daftarkan tugas latar belakang baru, dan atur UserNotificationChangedTrigger menggunakan jenis pemberitahuan Toast.

// TODO: Request/check Listener access via UserNotificationListener.Current.RequestAccessAsync
 
// TODO: Request/check background task access via BackgroundExecutionManager.RequestAccessAsync
 
// If background task isn't registered yet
if (!BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals("UserNotificationChanged")))
{
    // Specify the background task
    var builder = new BackgroundTaskBuilder()
    {
        Name = "UserNotificationChanged"
    };
 
    // Set the trigger for Listener, listening to Toast Notifications
    builder.SetTrigger(new UserNotificationChangedTrigger(NotificationKinds.Toast));
 
    // Register the task
    builder.Register();
}

Kemudian, di App.xaml.cs Anda, ambil alih metode OnBackgroundActivated jika Anda belum melakukannya, dan gunakan pernyataan switch pada nama tugas untuk menentukan pemicu tugas latar belakang mana yang dipanggil.

protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    var deferral = args.TaskInstance.GetDeferral();
 
    switch (args.TaskInstance.Task.Name)
    {
        case "UserNotificationChanged":
            // Call your own method to process the new/removed notifications
            // The next section of documentation discusses this code
            await MyWearableHelpers.SyncNotifications();
            break;
    }
 
    deferral.Complete();
}

Tugas latar belakang hanyalah "ketuk bahu": itu tidak memberikan informasi apa pun tentang pemberitahuan tertentu mana yang ditambahkan atau dihapus. Ketika tugas latar belakang Anda dipicu, Anda harus menyinkronkan pemberitahuan pada pakaian Anda sehingga mencerminkan pemberitahuan di platform. Ini memastikan bahwa jika tugas latar belakang Anda gagal, pemberitahuan tentang pakaian Anda masih dapat dipulihkan saat tugas latar belakang Anda dijalankan.

SyncNotifications adalah metode yang Anda terapkan; bagian berikutnya memperlihatkan caranya.

Menentukan pemberitahuan mana yang ditambahkan dan dihapus

Dalam metode Anda SyncNotifications , untuk menentukan pemberitahuan mana yang telah ditambahkan atau dihapus (menyinkronkan pemberitahuan dengan yang dapat dikenakan), Anda harus menghitung delta antara koleksi pemberitahuan Anda saat ini, dan pemberitahuan di platform.

// Get all the current notifications from the platform
IReadOnlyList<UserNotification> userNotifications = await listener.GetNotificationsAsync(NotificationKinds.Toast);
 
// Obtain the notifications that our wearable currently has displayed
IList<uint> wearableNotificationIds = GetNotificationsOnWearable();
 
// Copy the currently displayed into a list of notification ID's to be removed
var toBeRemoved = new List<uint>(wearableNotificationIds);
 
// For each notification in the platform
foreach (UserNotification userNotification in userNotifications)
{
    // If we've already displayed this notification
    if (wearableNotificationIds.Contains(userNotification.Id))
    {
        // We want to KEEP it displayed, so take it out of the list
        // of notifications to remove.
        toBeRemoved.Remove(userNotification.Id);
    }
 
    // Otherwise it's a new notification
    else
    {
        // Display it on the Wearable
        SendNotificationToWearable(userNotification);
    }
}
 
// Now our toBeRemoved list only contains notification ID's that no longer exist in the platform.
// So we will remove all those notifications from the wearable.
foreach (uint id in toBeRemoved)
{
    RemoveNotificationFromWearable(id);
}

Peristiwa latar depan untuk pemberitahuan yang ditambahkan/dihentikan

Penting

Masalah yang diketahui: Dalam build sebelum Build 17763 / Oktober 2018 Update / Version 1809, peristiwa latar depan akan menyebabkan perulangan CPU dan/atau tidak berfungsi. Jika Anda memerlukan dukungan pada build sebelumnya, gunakan tugas latar belakang sebagai gantinya.

Anda juga dapat mendengarkan pemberitahuan dari penanganan aktivitas dalam memori...

// Subscribe to foreground event
listener.NotificationChanged += Listener_NotificationChanged;
 
private void Listener_NotificationChanged(UserNotificationListener sender, UserNotificationChangedEventArgs args)
{
    // Your code for handling the notification
}

Cara memperbaiki penundaan dalam tugas latar belakang

Saat menguji aplikasi, Anda mungkin melihat bahwa tugas latar belakang terkadang tertunda dan tidak terpicu selama beberapa menit. Untuk memperbaiki penundaan, minta pengguna untuk membuka pengaturan sistem - Sistem -> Baterai ->> Penggunaan baterai berdasarkan aplikasi, temukan aplikasi Anda dalam daftar, pilih, dan atur menjadi "Selalu diizinkan di latar belakang." Setelah ini, tugas latar belakang harus selalu dipicu dalam waktu sekitar satu detik dari pemberitahuan yang diterima.