Fra og med Android 8.0 kan du adskille din apps underretninger i underretningskanaler . Alle meddelelser er den samme adfærd, for eksempel kan du oprette en kanal til din apps mest akutte underretninger kanaler for resten af din apps underretninger.
Android Oreo giver også brugere mere kontrol over underretninger end nogensinde før, da i Android 8.0-brugere kan ændre indstillingerne for enhver underretningskanal, der er til stede på deres enhed.
Meddelelseskanaler har meget at byde på, men der er endnu mere presserende grund til at implementere Android Channels Oreo apps: du har ikke noget valg! Hvis din app er målrettet mod Android 8.0, og du forsøger at sende en meddelelse uden at tildele den til en underretningskanal, vises denne meddelelse ikke til brugeren.
I denne artikel skal vi tage fat på denne nye funktion ved at oprette en app, der består af to notifikationskanaler, hver med sine egne unikke indstillinger. Jeg vil vise dig, hvordan du får en bedre brugeroplevelse ved at gøre det nemt for dine brugere.
Forbered dit udviklingsmiljø
Inden du kan udvikle Android Oreo, har du installeret følgende eller højere:
- Android Studio 3.0 beta.
- SDK Build Tools 26.0.1.
- SDK Platform Værktøjer 26.0.0.
- Android Emulator 26.1.4.
- Android Support Library 26.0.2.
- Android O SDK.
Hvis din Android-smartphone eller -tabel endnu ikke har modtaget Android 8.0-opdateringen, skal du oprette Android Virtual Device (AVD). Vælg 'Værktøjer> Android> AVD Manager fra værktøjslinjen Android Studio, klik på knappen' Create Virtual Device ... ', og vælg derefter' Oreo - API Level 26 'som dit systembillede.
Den endelige bit af prep, Android 8.0 Oreo (API niveau 26), og bruger skabelonen 'Empty Activity'.
Opret dit layout
I denne applikation fokuserer vi på processen med at implementere en underretningskanal, jeg skal bare oprette to underretningskanaler (Channel One og Channel Two) og tildele dem nogle tilfældige indstillinger. Men hvis du installerer dine egne apps, skal du overveje faktorer; potentielle måder at gruppere disse meddelelser sammen; du skal have indflydelse på, hvilken eller de underretningskanaler du skal oprette. Du skal også være opmærksom på antallet af kanaler, du opretter, da flere kanaler betyder flere muligheder for brugerpasning - men skaber for mange kanaler, og du risikerer at overvældes brugeren.
I vores layout skal jeg oprette følgende brugergrænseelementer til hver af vores notifikationskanaler:
- En EditText, hvor brugeren kan skrive nogle tekst, der vil blive brugt som titel for den efterfølgende meddelelse.
- En 'Post Notification' -knap.
- En 'Indstillinger' -knap, der giver brugeren nem adgang til hver kanalens underretningsindstillingsmenu.
Lad os tilføje alle disse elementer til vores activity_main.xml-fil:
Så vi har brug for at skabe et par strenge:
Meddelelseskanaler Channel One Channel Two Post Notification Settings Meddelelsesorgan Tekst Meddelelseskontor Tekst
Opret en underretningskanalhjælperklasse
I dette afsnit skal vi se på processen med oprettelse af en underretningskanal, og hvordan man tildeler en meddelelse til en bestemt kanal.
Jeg vil medtage denne funktionalitet i en separat klasse, så:
- Kontrol-klik på dit projekts rodpakke.
- Vælg 'Ny> Java klasse.'
- Navngiv denne klasse NotificationHelper, og klik derefter på 'OK'.
1. Opret din første underretningskanal
For at oprette en underretningskanal skal du opbygge et NotificationChannel-objekt og sende det følgende:
- Til ID. Dette skal være unikt for din pakke.
- Kanalens navn. Denne etiket vil blive vist på kanalens indstillingsskærmbillede.
- Et vigtigt niveau. I Android Oreo kan du ikke længere angive prioritetsniveauet for individuelle meddelelser. I stedet skal du angive kanalens vigtighedsniveau, som derefter anvendes til hver kanal.
Dette er også din chance for at indstille kanalens standardadfærd, herunder hvilken kanal der vil vise et notifikationsmærke (nogle gange kendt som en notifikationstegn) på understøttede launchers. Når en app ikke er blevet frigivet, kan Android Oreo vise et badge ud for dette programs ikon. Brugeren kan se flere oplysninger om disse underretninger ved at trykke langsomt på applikationsikonet.
Meddelelseskanaler viser i øjeblikket en meddelelse, medmindre andet er angivet, ved hjælp af setShowBadge (false). Der er dog altid chancen for, at Android's standardadfærd kan ændre sig, så hvis du vil have din kanal til at vise badges, skal du medtage dette i din kanalens indstillinger.
I den følgende kode opretter jeg en underretningskanal og definerer NotificationManager:
klasse NotificationHelper udvider ContextWrapper {private NotificationManager notifManager; // indstil kanalens id // offentlig statisk endelig streng CHANNEL_ONE_ID = "com.jessicathornsby.myapplication.ONE"; // Indstil kanalens brugersynlige navn // Offentlig statisk endelig streng CHANNEL_ONE_NAME = "Channel One"; ... // ... // Opret kanalobjektet ved hjælp af kanal-id // NotificationChannel notificationChannel = ny NotificationChannel (CHANNEL_ONE_ID, CHANNEL_ONE_NAME, notifManager.IMPORTANCE_HIGH); // Konfigurer kanalens indledende indstillinger // notificationChannel.enableLights (true); notificationChannel.setLightColor (Color.RED); notificationChannel.setShowBadge (sand); notificationChannel.setLockscreenVisibility (Notification.VISIBILITY_PUBLIC);
Du skal derefter indsende dette NotificationChannel-objekt til NotificationManager, ved hjælp af createNotificationChannel (). Bemærk, at når du har indsendt kanalobjektet, kan du ikke længere redigere kanalens indstillinger (med undtagelse af opdatering af kanalnavn og kanalbeskrivelse), så sørg for at du er tilfreds med din kanals konfiguration, inden du kalder metoden createNotificationChannel (),
. GetManager () createNotificationChannel (notificationChannel);
For at oprette kanal to skal du blot gentage ovenstående kode med et andet kanal-id og kanalnavn og de ønskede kanalindstillinger - eller se på den komplette NotificationHelper-klasse, som jeg har inkluderet senere i denne vejledning.
2. Tildele en anmeldelse til en kanal
Hvis din app er målrettet mod Android 8.0, skal du angive en underretningskanal hver gang du foretager en anmeldelse, ved at sende kanalens ID til Notification.Builder-konstruktøren:
Offentlig Notification.Builder getNotification1 (String title, String body) // Passer notifikationskanalens ID som det andet argument // Returner ny Notification.Builder (getApplicationContext (), CHANNEL_ONE_ID) // Indstil meddelelsens titel, som i dette tilfælde vil være indholdet af vores EditText // .setContentTitle (titel) // Indstil meddelelsens kropstekst // .setContentText (krop) // Indstil meddelelsesikonet, som vi opretter senere // .setSmallIcon (R.drawable.warning ). setAutoCancel (true); }
Alternativt kan du tildele din anmeldelse til en kanal ved hjælp af metoden setChannelId ().
Hvis din app nogensinde forsøger at sende en anmeldelse uden at angive en underretningskanal, vises denne meddelelse ikke på skærmen. Android 8.0 viser en skål hver gang din app forsøger at sende en anmeldelse, der ikke har en tildelt kanal:
- Åbn din enheds app 'Indstillinger'.
- Naviger til 'System> Udviklerindstillinger.'
- Tryk skyderen "Vis advarsels kanal advarsler" til "On" -positionen.
Hvis 'Udviklerindstillinger' ikke vises i dine indstillinger, kan du aktivere det ved at navigere til 'Indstillinger> System> Om emuleret enhed' og trykke på bygge nummeret syv gange.
Den komplette NotificationHelper klasse
NotificationHelper-kode: Når du ved, hvordan du opretter en kanal og tildeler en meddelelse til denne kanal, har du følgende formel:
pakke com.jessicathornsby.myapplication; importere android.graphics.Color; importere android.content.Context; importere android.content.ContextWrapper; importere android.app.Notification; importer android.app.NotificationChannel; importer android.app.NotificationManager; klasse NotificationHelper udvider ContextWrapper {private NotificationManager notifManager; offentlig statisk slutstreng CHANNEL_ONE_ID = "com.jessicathornsby.myapplication.ONE"; offentlig statisk slutstreng CHANNEL_ONE_NAME = "Channel One"; offentlig statisk slutstreng CHANNEL_TWO_ID = "com.jessicathornsby.myapplication.TWO"; offentlig statisk slutstreng CHANNEL_TWO_NAME = "kanal to"; // Opret dine meddelelseskanaler // Offentlig NotificationHelper (Kontekst base) {super (base); oprette kanaler (); } public void createChannels () {NotificationChannel notificationChannel = ny NotificationChannel (CHANNEL_ONE_ID, CHANNEL_ONE_NAME, notifManager.IMPORTANCE_HIGH); notificationChannel.enableLights (sande); notificationChannel.setLightColor (Color.RED); notificationChannel.setShowBadge (sand); notificationChannel.setLockscreenVisibility (Notification.VISIBILITY_PUBLIC); . GetManager () createNotificationChannel (notificationChannel); NotificationChannel notificationChannel2 = ny NotificationChannel (CHANNEL_TWO_ID, CHANNEL_TWO_NAME, notifManager.IMPORTANCE_DEFAULT); notificationChannel2.enableLights (falske); notificationChannel2.enableVibration (sand); notificationChannel2.setLightColor (Color.RED); notificationChannel2.setShowBadge (falsk); . GetManager () createNotificationChannel (notificationChannel2); } // Opret den meddelelse, der vil blive sendt til Channel One // public Notice.Builder getNotification1 (String title, String body) {returner ny Notification.Builder (getApplicationContext (), CHANNEL_ONE_ID) .setContentTitle (title) .setContentText ) .setSmallIcon (R.drawable.warning) .setAutoCancel (true); } // Opret den meddelelse, der vil blive sendt til Channel Two // public Notification.Builder getNotification2 (String title, String body) {returner ny Notification.Builder (getApplicationContext (), CHANNEL_TWO_ID) .setContentTitle (title) .setContentText ) .setSmallIcon (R.drawable.alert) .setAutoCancel (true); } Offentlig ugyldig meddelelse (intid, Notification.Builder meddelelse) {getManager (). notify (id, notification.build ()); } // send dine anmeldelser til NotificationManager systemtjenesten // privat NotificationManager getManager () {if (notifManager == null) {notifManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); } returner notifManager; }}
Indlæser meddelelseskanalens indstillinger
Lad os nu skifte til vores MainActivity-klasse. Kanaler, den vigtigste opgave, vi skal udføre i MainActivity, knytter hver 'Indstillinger' -knap.
Som standard kan brugerne ændre deres indstillinger ved at åbne deres enheds app 'Indstillinger' og navigere til 'Apps & Notifications> Notifications> Notifications.' Administrerer meddelelser generelt. Du kan derefter vælge enhver app fra denne liste.
Herfra kan brugeren få adgang til indstillingsskærmen for en bestemt underretningskanal ved at vælge den pågældende kanal fra listen 'Kategorier' (bemærk at kanaler henvises til som 'Kategorier' i Oreo's brugergrænseflade).
Alternativt kan brugerne hoppe direkte til en kanalens indstillinger ved at trykke langvarigt på en meddelelse, der tilhører den pågældende kanal, og derefter trykke på 'Alle kategorier'.
Mens du muligvis ikke kan røre rundt med dine omhyggeligt udformede kanalindstillinger, har muligheden for at tilpasse dine apps kanaler betydelige fordele for brugeren. Og selv i værste fald, hvor du afvikler afinstallationen af din app, vil disse stadig få dig til at frustrere med din app.
Mens brugerne kan ændre enhver underretningskanal via deres enheds app 'Indstillinger', giver deres brugere en mulighed for at få adgang til denne menu direkte fra deres ansøgning, hvilket giver en meget bedre brugeroplevelse.
For at indstille vores 'Indstillinger' -knapper til hver af vores kanalers indstillinger, skal vi oprette en hensigt og sende den til handlingen Settings.ACTION_APP_NOTIFICATION_SETTINGS. Så vi skal sørge for, at systemet lancerer den korrekte indstillingsskærm, sender den gennem vores programmets pakkenavn og EXTRA_CHANNEL_ID som intentioner.
public void goToNotificationSettings (String channel) {Intent i = new Intent (Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); i.putExtra (Settings.EXTRA_APP_PACKAGE, getPackageName ()); i.putExtra (Settings.EXTRA_CHANNEL_ID, kanal); // Start aktiviteten med hensigten // startAktivitet (i); } ... ... ... tilfælde R.id.channel_one_settings: goToNotificationSettings (NotificationHelper.CHANNEL_ONE_ID); break;
For at give brugeren en genvej til din apps generelle underretningsindstillinger, skal du gentage ovenstående kode med det fjernede ID:
public void goToNotificationSettings () {Intent i = new Intent (Settings.ACTION_APP_NOTIFICATION_SETTINGS); i.putExtra (Settings.EXTRA_APP_PACKAGE, getPackageName ()); starte aktivitet (i); }
Den komplette MainActivity-klasse
Udover at indlæse indstillingsskærmbillederne, så skal vi lave en af vores 'Postnotifikation' knapper, vores app henter indholdet af den tilsvarende EditText, der er inkorporeret i en anmeldelse, og derefter sender denne meddelelse til passende kanal.
Her er den færdige MainActivity-klasse, komplet med onClickListeners og vores indstillinger kode:
pakke com.jessicathornsby.myapplication; importer android.support.v7.app.AppCompatActivity; importere android.os.Bundle; importer android.widget.Button; importere android.widget.EditText; importere android.content.Intent; importere android.app.Notification; importere android.provider.Settings; importer android.view.view; public class MainActivity udvider AppCompatActivity {private static final string TAG = MainActivity.class.getSimpleName (); privat statisk endelig int notice_one = 101; privat statisk endelig int notice_two = 102; private MainUi mainUI; privat anmeldelseHelper; @Override protected void onCreate (bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); notificationHelper = ny NotificationHelper (dette); mainUI = new MainUi (findViewById (R.id.activity_main)); } // Indsend meddelelserne // offentlig tomt postnotifikation (int id, String titel) {Notification.Builder notificationBuilder = null; switch (id) {case notification_one: notificationBuilder = notificationHelper.getNotification1 (titel, getString (R.string.channel_one_body)); break; case notification_two: notificationBuilder = notificationHelper.getNotification2 (titel, getString (R.string.channel_two_body)); break; } hvis (notificationBuilder! = null) {notificationHelper.notify (id, notificationBuilder); }} // Indstil skærmbilledet for den valgte meddelelseskanal // Offentlig tomgang goToNotificationSettings (String channel) {Intent i = Ny Intent (Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); i.putExtra (Settings.EXTRA_APP_PACKAGE, getPackageName ()); i.putExtra (Settings.EXTRA_CHANNEL_ID, kanal); starte aktivitet (i); } // Gennemfør vores onClickListeners // klasse MainUi implementerer View.OnClickListener {final EditText editTextOne; endelig EditText editTextTwo; private MainUi (View root) {editTextOne = (EditText) root.findViewById (R.id.channel_one_text); ((Button) root.findViewById (R.id.post_to_channel_one)). SetOnClickListener (dette); ((Button) root.findViewById (R.id.channel_one_settings)). SetOnClickListener (dette); editTextTwo = (EditText) root.findViewById (R.id.channel_two_text); ((Button) root.findViewById (R.id.post_to_channel_two)). SetOnClickListener (dette); ((Button) root.findViewById (R.id.channel_two_settings)). SetOnClickListener (dette); } // Hent indholdet af hver EditText // Private String getChannelOneText () {if (editTextOne! = Null) {return editTextOne.getText (). ToString (); } returnere ""; } privat streng getChannelTwoText () {if (editTextOne! = null) {return editTextTwo.getText (). toString (); } returnere ""; } @Override public void onClick (View view) {switch (view.getId ()) {tilfælde R.id.post_to_channel_one: postNotification (notification_one, getChannelOneText ()); break; tilfælde R.id.channel_one_settings: goToNotificationSettings (NotificationHelper.CHANNEL_ONE_ID); break; sag R.id.post_to_channel_two: postNotification (notification_two, getChannelTwoText ()); break; tilfælde R.id.channel_two_settings: goToNotificationSettings (NotificationHelper.CHANNEL_TWO_ID); break; }}}}
Tilføjelse af dine meddelelsesikoner
For at skabe en klar sondring mellem meddelelser, der tilhører Channel One, vil jeg tildele en anden meddelelsesikon til hver kanal.
Den nemmeste måde at oprette ikoner på (herunder Android 8.0's adaptive ikoner) er at bruge Android Studio's Image Asset Studio. Dette studie giver adgang til over 900 Material Design-systemikoner, plus Image Studio vil automatisk generere alternative versioner af dine valgte tegninger til hver af de forskellige generaliserede skærmdensiteter og placere dem i de relevante res / drawable-kataloger.
Sådan oprettes dit første underretningsikon:
- Kontrol-klik på dit projekt 'res' -mappe og vælg 'Nyt> Billedaktiv'.
- Åbn rullemenuen 'Ikontype', og vælg 'Notifikationsikoner'.
- Giv dit ikon navnet 'alert'.
- Vælg knappen 'Clip Art'.
- Klik på knappen med den lille Android på den (hvor markøren er placeret i det følgende skærmbillede).
- I den efterfølgende popup skal du vælge det ikon, du vil bruge til dit første underretningsikon. Jeg skal vælge 'add alert'. Klik på 'OK'.
- Klik på knappen 'Næste'.
- Kontrollér oplysningerne om, hvor ikonet skal gemmes, og hvis du er glad for at fortsætte, klik på 'Afslut'.
Skyl og gentag for at oprette det andet noteringsikon. Bemærk, at hvis du navngiver disse drawables noget andet end 'advarsel' og 'advarsel', skal du ændre følgende linjer i din NotificationHelper-klasse:
.setSmallIcon (R.drawable.warning)
og:
.setSmallIcon (R.drawable.alert)
Kør din app
Android-enhed til din udviklingsmaskine, og vælg derefter 'Kør> Kør app' fra Android Studio-værktøjslinjen.
Når din app er færdig med at blive indlæst, eksperimentér med at indtaste anden tekst i EditTexts og indsende disse meddelelser til de forskellige kanaler.
Du kan ændre indstillingerne for hver underretningskanal ved at klikke på knappen 'Indstillinger'. Hvis du ønsker at ændre dine indstillinger, så vil du forblive i kraft, selvom du genbruger dit projekt fra Android Studio. Ved at trykke på knappen 'Indstillinger' eller ved at afinstallere og derefter geninstallere dit projekt.
Indpakning
Android 8.0 Oreo er den perfekte måde at starte. Dette er dog ikke kun for dem på blødende kant. I sidste ende vil denne nye mekanisme være den eneste måde at sende meddelelser på, så det er værd at forstå det nu!
Hvordan planlægger du at bruge Android-kanaler? Lad os vide i kommentarerne nedenfor!