Esercitazione: Eseguire il push di notifiche a dispositivi Android specifici con Hub di notifica di Azure e Google MessagingTutorial: Push notifications to specific Android devices using Azure Notification Hubs and Google Cloud Messaging

PanoramicaOverview

Questa esercitazione illustra come usare Hub di notifica di Azure per trasmettere le notifiche relative alle ultime notizie a un'app per Android.This tutorial shows you how to use Azure Notification Hubs to broadcast breaking news notifications to an Android app. Al termine dell'esercitazione, si sarà appreso a effettuare la registrazione alle categorie di ultime notizie desiderate e ricevere le notifiche push solo da tali categorie.When complete, you will be able to register for breaking news categories you are interested in, and receive only push notifications for those categories. Questo scenario è un modello comune per molte app nelle quali le notifiche devono essere inviate a gruppi di utenti che hanno dichiarato un interesse, ad esempio lettori di feed RSS, app per fan di musica e così via.This scenario is a common pattern for many apps where notifications have to be sent to groups of users that have previously declared interest in them, for example, RSS reader, apps for music fans, etc.

È possibile abilitare gli scenari di trasmissione includendo uno o più tag durante la creazione di una registrazione nell'hub di notifica.Broadcast scenarios are enabled by including one or more tags when creating a registration in the notification hub. Quando le notifiche vengono inviate a un tag, tutti i dispositivi che hanno effettuato la registrazione al tag riceveranno la notifica.When notifications are sent to a tag, all devices that have registered for the tag will receive the notification. Poiché i tag sono costituiti da stringhe, non è necessario eseguire il provisioning anticipatamente.Because tags are simply strings, they do not have to be provisioned in advance. Per altre informazioni sui tag, vedere Espressioni di routing e tag per Hub di notifica.For more information about tags, see Notification Hubs Routing and Tag Expressions.

In questa esercitazione vengono completate le azioni seguenti:In this tutorial, you do the following actions:

  • Aggiungere la selezione delle categorie all'app per dispositivi mobili.Add category selection to the mobile app.
  • Registrarsi per le notifiche con i tag.Registerd for notifications with tags.
  • Inviare notifiche con tag.Send tagged notifications.
  • Testare l'appTest the app

prerequisitiPrerequisites

Questa esercitazione si basa sul'app creata in Esercitazione: Effettuare il push di notifiche a dispositivi Android specifici con Hub di notifica di Azure e Google Cloud Messaging.This tutorial builds on the app you created in Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging. Prima di iniziare questa esercitazione, completare l'Esercitazione: Effettuare il push di notifiche a dispositivi Android specifici con Hub di notifica di Azure e Google Cloud Messaging.Before starting this tutorial, complete the Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging.

Aggiungere la selezione delle categorie all'appAdd category selection to the app

Il primo passaggio prevede l'aggiunta degli elementi dell'interfaccia utente all'attività principale esistente per consentire all'utente di selezionare le categorie per le quali registrarsi.The first step is to add the UI elements to your existing main activity that enable the user to select categories to register. Le categorie selezionate da un utente sono archiviate nel dispositivo.The categories selected by a user are stored on the device. All'avvio dell'app, viene creata una registrazione nell'hub di notifica con le categorie selezionate come tag.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Aprire il file res/layout/activity_main.xml e sostituire il contenuto con il contenuto seguente:Open your res/layout/activity_main.xml file, and substitute the content with the following content:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.breakingnews.MainActivity"
        android:orientation="vertical">
    
            <CheckBox
                android:id="@+id/worldBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_world" />
            <CheckBox
                android:id="@+id/politicsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_politics" />
            <CheckBox
                android:id="@+id/businessBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_business" />
            <CheckBox
                android:id="@+id/technologyBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_technology" />
            <CheckBox
                android:id="@+id/scienceBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_science" />
            <CheckBox
                android:id="@+id/sportsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_sports" />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="subscribe"
                android:text="@string/button_subscribe" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:id="@+id/text_hello"
            />
    </LinearLayout>
    
  2. Aprire il file res/values/strings.xml e aggiungere le righe seguenti:Open your res/values/strings.xml file and add the following lines:

    <string name="button_subscribe">Subscribe</string>
    <string name="label_world">World</string>
    <string name="label_politics">Politics</string>
    <string name="label_business">Business</string>
    <string name="label_technology">Technology</string>
    <string name="label_science">Science</string>
    <string name="label_sports">Sports</string>
    

    A questo punto il layout grafico del file main_activity.xml dovrebbe essere simile a quello nell'immagine seguente:Your main_activity.xml graphical layout should look like in the following image:

  3. Creare una classe Notifications nello stesso pacchetto della classe MainActivity.Create a class Notifications in the same package as your MainActivity class.

    import java.util.HashSet;
    import java.util.Set;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    import android.view.View;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private GoogleCloudMessaging gcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
    
        public Notifications(Context context, String senderId, String hubName, 
                                String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            gcm = GoogleCloudMessaging.getInstance(context);
            hub = new NotificationHub(hubName, listenConnectionString, context);
        }
    
        public void storeCategoriesAndSubscribe(Set<String> categories)
        {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            settings.edit().putStringSet("categories", categories).commit();
            subscribeToCategories(categories);
        }
    
        public Set<String> retrieveCategories() {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            return settings.getStringSet("categories", new HashSet<String>());
        }
    
        public void subscribeToCategories(final Set<String> categories) {
            new AsyncTask<Object, Object, Object>() {
                @Override
                protected Object doInBackground(Object... params) {
                    try {
                        String regid = gcm.register(senderId);
    
                        String templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(regid,"simpleGCMTemplate", templateBodyGCM, 
                            categories.toArray(new String[categories.size()]));
                    } catch (Exception e) {
                        Log.e("MainActivity", "Failed to register - " + e.getMessage());
                        return e;
                    }
                    return null;
                }
    
                protected void onPostExecute(Object result) {
                    String message = "Subscribed for categories: "
                            + categories.toString();
                    Toast.makeText(context, message,
                            Toast.LENGTH_LONG).show();
                }
            }.execute(null, null, null);
        }
    
    }
    

    Questa classe utilizza l'archiviazione locale per archiviare le categorie di notizie che il dispositivo deve ricevere.This class uses the local storage to store the categories of news that this device has to receive. Contiene inoltre i metodi per effettuare la registrazione per queste categorie.It also contains methods to register for these categories.

  4. Nella classe MainActivity rimuovere i campi privati per NotificationHub e GoogleCloudMessaging e aggiungere un campo per Notifications:In your MainActivity class remove your private fields for NotificationHub and GoogleCloudMessaging, and add a field for Notifications:

    // private GoogleCloudMessaging gcm;
    // private NotificationHub hub;
    private Notifications notifications;
    
  5. A questo punto, nel metodo onCreate rimuovere l'inizializzazione del campo hub e il metodo registerWithNotificationHubs.Then, in the onCreate method, remove the initialization of the hub field and the registerWithNotificationHubs method. Aggiungere quindi le righe seguenti, che inizializzano un'istanza della classe Notifications.Then add the following lines, which initialize an instance of the Notifications class.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainActivity = this;
    
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId,
                MyHandler.class);
    
        notifications = new Notifications(this, NotificationSettings.SenderId, NotificationSettings.HubName, NotificationSettings.HubListenConnectionString);
    
        notifications.subscribeToCategories(notifications.retrieveCategories());
    }
    

    Verificare che il nome dell'hub e la stringa di connessione siano impostati correttamente nella classe NotificationSettings.Confirm that the hub name and the connection string are set properly in the NotificationSettings class.

    [AZURE.NOTE] Poiché le credenziali che sono distribuite con un'app client in genere non sono sicure, distribuire solo la chiave per l'accesso Listen con l'app client.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. L'accesso Listen consente all'app di registrarsi per le notifiche ma le registrazioni esistenti non possono essere modificate e le notifiche non possono essere inviate.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. La chiave di accesso completa viene utilizzata in un servizio back-end sicuro per l'invio delle notifiche e la modifica delle registrazioni esistenti.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  6. Quindi, aggiungere le importazioni seguenti:Then, add the following imports:

    import android.widget.CheckBox;
    import java.util.HashSet;
    import java.util.Set;
    
  7. Aggiungere il metodo subscribe seguente per gestire l'evento clic del pulsante sottoscrivi:Add the following subscribe method to handle the subscribe button click event:

    public void subscribe(View sender) {
        final Set<String> categories = new HashSet<String>();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        if (world.isChecked())
            categories.add("world");
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        if (politics.isChecked())
            categories.add("politics");
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        if (business.isChecked())
            categories.add("business");
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        if (technology.isChecked())
            categories.add("technology");
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        if (science.isChecked())
            categories.add("science");
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        if (sports.isChecked())
            categories.add("sports");
    
        notifications.storeCategoriesAndSubscribe(categories);
    }
    

    Questo metodo crea un elenco di categorie e utilizza la classe Notifications per archiviare l'elenco nell'archiviazione locale e registrare i tag corrispondenti nell'hub di notifica.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Se le categorie vengono modificate, la registrazione viene ricreata con le nuove categorie.When categories are changed, the registration is recreated with the new categories.

L'app può quindi archiviare un set di categorie nell'archiviazione locale del dispositivo ed effettuare la registrazione con l'hub di notifica ogni volta che l'utente modifica la selezione di categorie.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Registrazione per le notificheRegister for notifications

Questa procedura consente di effettuare la registrazione con l'hub di notifica all'avvio usando le categorie archiviate nella risorsa di archiviazione locale.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Nota

Poiché il valore di registrationId assegnato da Google Cloud Messaging (GCM) può cambiare in qualsiasi momento, è necessario ripetere la registrazione per le notifiche di frequente per evitare errori di notifica.Because the registrationId assigned by Google Cloud Messaging (GCM) can change at any time, you should register for notifications frequently to avoid notification failures. In questo esempio viene effettuata la registrazione per le notifiche a ogni avvio dell'app.This example registers for notification every time that the app starts. Per le app che vengono eseguite con una frequenza maggiore di una volta al giorno, è possibile ignorare la registrazione per conservare la larghezza di banda qualora sia trascorso meno di un giorno dalla registrazione precedente.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. Aggiungere questo codice alla fine del metodo onCreate nella classe MainActivity:Add the following code at the end of the onCreate method in the MainActivity class:

    notifications.subscribeToCategories(notifications.retrieveCategories());
    

    Con questo codice, ogni volta che l'app viene avviata vengono recuperate le categorie dall'archiviazione locale e viene richiesta una registrazione per tali categorie.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. Aggiornare quindi il metodo onStart() della classe MainActivity come indicato di seguito:Then update the onStart() method of the MainActivity class as follows:

    @Override
    protected void onStart() {
    
        super.onStart();
        isVisible = true;
    
        Set<String> categories = notifications.retrieveCategories();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        world.setChecked(categories.contains("world"));
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        politics.setChecked(categories.contains("politics"));
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        business.setChecked(categories.contains("business"));
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        technology.setChecked(categories.contains("technology"));
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        science.setChecked(categories.contains("science"));
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        sports.setChecked(categories.contains("sports"));
    }
    

    Il codice aggiorna l'attività principale in base allo stato delle categorie salvate in precedenza.This code updates the main activity based on the status of previously saved categories.

Ora l'app è completa e può quindi archiviare un set di categorie nell'archiviazione locale del dispositivo ed effettuare la registrazione con l'hub di notifica ogni volta che l'utente modifica la selezione di categorie.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Definire quindi un back-end per l'invio delle notifiche delle categorie all'app.Next, define a backend that can send category notifications to this app.

Inviare notifiche con tagSend tagged notifications

In questa sezione si invieranno notizie aggiornate come notifiche modello con tag da un'app console .NET.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. In Visual Studio creare una nuova applicazione console in Visual C#:In Visual Studio, create a new Visual C# console application:

    Collegamento all'app console

  2. Dal menu principale di Visual Studio scegliere Strumenti, > Gestione pacchetti libreria > Console di Gestione pacchetti e quindi immettere la stringa seguente nella finestra della console:On the Visual Studio main menu, select Tools > Library Package Manager > Package Manager Console and then, in the console window, enter the following string:

     Install-Package Microsoft.Azure.NotificationHubs
    
  3. Selezionare Enter (Invio).Select Enter.
    Questa azione aggiunge un riferimento ad Azure Notification Hubs SDK usando il pacchetto NuGet Microsoft.Azure.NotificationHubs.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Aprire il file Program.cs e aggiungere l'istruzione using seguente:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Nella classe Program aggiungere il metodo seguente oppure sostituirlo se esiste già:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Questo codice invia una notifica modello per ognuno dei sei tag nella matrice di stringhe.This code sends a template notification for each of the six tags in the string array. L'uso di tag garantisce che i dispositivi ricevano le notifiche solo per le categorie registrate.The use of tags ensures that devices receive notifications only for the registered categories.

  6. Nel codice precedente sostituire i segnaposto <hub name> e <connection string with full access> con il nome dell'hub di notifica e la stringa di connessione per DefaultFullSharedAccessSignature dal dashboard dell'hub di notifica.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. Nel metodo Main aggiungere le righe seguenti:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Creare l'app console.Build the console app.

Testare l'appTest the app

  1. In Android Studio eseguire l'app sul dispositivo Android o un emulatore.In Android Studio, run the app on your Android device or emulator. L'interfaccia utente dell'app fornisce un insieme di interruttori che permettono di scegliere le categorie per le quali registrarsi.The app UI provides a set of toggles that lets you choose the categories to subscribe to.
  2. Abilitare uno o più interruttori di categorie e quindi fare clic su Subscribe.Enable one or more categories toggles, then click Subscribe. L'app converte le categorie selezionate in tag e richiede una nuova registrazione del dispositivo per i tag selezionati dall'hub di notifica.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. Le categorie registrate vengono restituite e visualizzate in notifica di tipo avviso popup.The registered categories are returned and displayed in a toast notification.

    Abbonarsi alle categorie

  3. Eseguire l'applicazione console .NET, che consente di inviare le notifiche per ogni categoria.Run the .NET console app, which sends notifications for each category. Le notifiche per le categorie selezionate vengono visualizzate come notifiche di tipo avviso popup.Notifications for the selected categories appear as toast notifications.

    Notifiche relative alle notizie di tecnologia

Passaggi successiviNext steps

In questa esercitazione verranno inviate notifiche di trasmissione ai dispositivi Android specifici che hanno effettuato la registrazione alle categorie.In this tutorial, you sent broadcast notifications to specific Android devices that have registered for the categories. Per informazioni sulle procedure per eseguire il push di notifiche a utenti specifici, passare all'esercitazione seguente:To learn how to push notifications to specific users, advance to the following tutorial: