Procedura dettagliata- Uso delle notifiche locali in Xamarin.Android

Questa procedura dettagliata illustra come usare le notifiche locali nelle applicazioni Xamarin.Android. Illustra le nozioni di base per la creazione e la pubblicazione di una notifica locale. Quando l'utente fa clic sulla notifica nell'area di notifica, avvia una seconda attività.

Panoramica

In questa procedura dettagliata verrà creata un'applicazione Android che genera una notifica quando l'utente fa clic su un pulsante in un'attività. Quando l'utente fa clic sulla notifica, avvia una seconda attività che visualizza il numero di volte in cui l'utente ha fatto clic sul pulsante nella prima attività.

Gli screenshot seguenti illustrano alcuni esempi di questa applicazione:

Screenshot di esempio con notifica

Nota

Questa guida è incentrata sulle API NotificationCompat dalla libreria di supporto android. Queste API garantiranno la massima compatibilità con le versioni precedenti di Android 4.0 (livello API 14).

Creazione del progetto

Per iniziare, creare un nuovo progetto Android usando il modello App Android. Chiamare questo progetto LocalNotifications. Se non si ha familiarità con la creazione di progetti Xamarin.Android, vedere Hello, Android.)

Modificare i valori/Strings.xml del file di risorse in modo che contenga due risorse stringa aggiuntive che verranno usate quando è il momento di creare il canale di notifica:

<?xml version="1.0" encoding="utf-8"?>

<resources>
  <string name="Hello">Hello World, Click Me!</string>
  <string name="ApplicationName">Notifications</string>

  <string name="channel_name">Local Notifications</string>
  <string name="channel_description">The count from MainActivity.</string>
</resources>

Aggiungere il pacchetto NuGet Android.Support.V4

In questa procedura dettagliata viene usato NotificationCompat.Builder per compilare la notifica locale. Come illustrato in Notifiche locali, è necessario includere NuGet della libreria di supporto Android v4 nel progetto per usare NotificationCompat.Builder.

Successivamente, si modificherà MainActivity.cs e si aggiungerà l'istruzione seguente using in modo che i tipi in Android.Support.V4.App siano disponibili per il codice:

using Android.Support.V4.App;

Inoltre, è necessario chiarire al compilatore che si usa la Android.Support.V4.App versione di TaskStackBuilder anziché la Android.App versione. Aggiungere l'istruzione seguente using per risolvere eventuali ambiguità:

using TaskStackBuilder = Android.Support.V4.App.TaskStackBuilder;

Creare il canale di notifica

Aggiungere quindi un metodo a MainActivity che creerà un canale di notifica (se necessario):

void CreateNotificationChannel()
{
    if (Build.VERSION.SdkInt < BuildVersionCodes.O)
    {
        // Notification channels are new in API 26 (and not a part of the
        // support library). There is no need to create a notification
        // channel on older versions of Android.
        return;
    }

    var name = Resources.GetString(Resource.String.channel_name);
    var description = GetString(Resource.String.channel_description);
    var channel = new NotificationChannel(CHANNEL_ID, name, NotificationImportance.Default)
                  {
                      Description = description
                  };

    var notificationManager = (NotificationManager) GetSystemService(NotificationService);
    notificationManager.CreateNotificationChannel(channel);
}

Aggiornare il OnCreate metodo per chiamare questo nuovo metodo:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);

    CreateNotificationChannel();
}

Definire l'ID notifica

Sarà necessario un ID univoco per la notifica e il canale di notifica. Modificare MainActivity.cs e aggiungere la variabile di istanza statica seguente alla MainActivity classe :

static readonly int NOTIFICATION_ID = 1000;
static readonly string CHANNEL_ID = "location_notification";
internal static readonly string COUNT_KEY = "count";

Aggiungere codice per generare la notifica

Successivamente, è necessario creare un nuovo gestore eventi per l'evento del pulsante Click . Aggiungere il metodo seguente a MainActivity:

void ButtonOnClick(object sender, EventArgs eventArgs)
{
    // Pass the current button press count value to the next activity:
    var valuesForActivity = new Bundle();
    valuesForActivity.PutInt(COUNT_KEY, count);

    // When the user clicks the notification, SecondActivity will start up.
    var resultIntent = new Intent(this, typeof(SecondActivity));

    // Pass some values to SecondActivity:
    resultIntent.PutExtras(valuesForActivity);

    // Construct a back stack for cross-task navigation:
    var stackBuilder = TaskStackBuilder.Create(this);
    stackBuilder.AddParentStack(Class.FromType(typeof(SecondActivity)));
    stackBuilder.AddNextIntent(resultIntent);

    // Create the PendingIntent with the back stack:
    var resultPendingIntent = stackBuilder.GetPendingIntent(0, (int) PendingIntentFlags.UpdateCurrent);

    // Build the notification:
    var builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                  .SetAutoCancel(true) // Dismiss the notification from the notification area when the user clicks on it
                  .SetContentIntent(resultPendingIntent) // Start up this activity when the user clicks the intent.
                  .SetContentTitle("Button Clicked") // Set the title
                  .SetNumber(count) // Display the count in the Content Info
                  .SetSmallIcon(Resource.Drawable.ic_stat_button_click) // This is the icon to display
                  .SetContentText($"The button has been clicked {count} times."); // the message to display.

    // Finally, publish the notification:
    var notificationManager = NotificationManagerCompat.From(this);
    notificationManager.Notify(NOTIFICATION_ID, builder.Build());

    // Increment the button press count:
    count++;
}

Il OnCreate metodo di MainActivity deve effettuare la chiamata per creare il canale di notifica e assegnare il ButtonOnClick metodo all'evento Click del pulsante (sostituire il gestore eventi delegato fornito dal modello):

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);

    CreateNotificationChannel();

    // Display the "Hello World, Click Me!" button and register its event handler:
    var button = FindViewById<Button>(Resource.Id.MyButton);
    button.Click += ButtonOnClick;
}

Creare una seconda attività

Ora è necessario creare un'altra attività che Android visualizzerà quando l'utente fa clic sulla notifica. Aggiungere un'altra attività Android al progetto denominato SecondActivity. Aprire SecondActivity.cs e sostituirne il contenuto con questo codice:

using System;
using Android.App;
using Android.OS;
using Android.Widget;

namespace LocalNotifications
{
    [Activity(Label = "Second Activity")]
    public class SecondActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Get the count value passed to us from MainActivity:
            var count = Intent.Extras.GetInt(MainActivity.COUNT_KEY, -1);

            // No count was passed? Then just return.
            if (count <= 0)
            {
                return;
            }

            // Display the count sent from the first activity:
            SetContentView(Resource.Layout.Second);
            var txtView = FindViewById<TextView>(Resource.Id.textView1);
            txtView.Text = $"You clicked the button {count} times in the previous activity.";
        }
    }
}

È anche necessario creare un layout di risorsa per SecondActivity. Aggiungere un nuovo file di layout Android al progetto denominato Second.axml. Modificare Second.axml e incollare il codice di layout seguente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minWidth="25px"
    android:minHeight="25px">
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1" />
</LinearLayout>

Aggiungere un'icona di notifica

Aggiungere infine un'icona piccola che verrà visualizzata nell'area di notifica all'avvio della notifica. È possibile copiare questa icona nel progetto o creare un'icona personalizzata. Denominare il file dell'icona ic_stat_button_click.png e copiarlo nella cartella Resources/drawable . Ricordarsi di usare Aggiungi > elemento esistente ... per includere questo file icona nel progetto.

Eseguire l'applicazione

Compilare ed eseguire l'applicazione. Verrà visualizzata la prima attività, simile allo screenshot seguente:

Screenshot della prima attività

Quando si fa clic sul pulsante, si noterà che l'icona piccola per la notifica viene visualizzata nell'area di notifica:

Viene visualizzata l'icona di notifica

Se si scorre rapidamente verso il basso ed esponi il pannello di notifica, dovrebbe essere visualizzata la notifica:

Messaggio di notifica

Quando si fa clic sulla notifica, dovrebbe scomparire e l'altra attività dovrebbe essere avviata, in modo simile allo screenshot seguente:

Screenshot della seconda attività

Complimenti. A questo punto è stata completata la procedura dettagliata per la notifica locale di Android ed è disponibile un esempio funzionante a cui è possibile fare riferimento. C'è molto di più per le notifiche di quanto abbiamo mostrato qui, quindi se vuoi altre informazioni, dai un'occhiata alla documentazione di Google sulle notifiche.

Riepilogo

Questa procedura dettagliata usata NotificationCompat.Builder per creare e visualizzare le notifiche. Ha mostrato un esempio di base di come avviare una seconda attività come modo per rispondere all'interazione dell'utente con la notifica e ha dimostrato il trasferimento dei dati dalla prima attività alla seconda attività.