Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

SMB - BroadcastReceiver i notyfikacje

Podobne prezentacje


Prezentacja na temat: "SMB - BroadcastReceiver i notyfikacje"— Zapis prezentacji:

1 SMB - BroadcastReceiver i notyfikacje
Michail Mokkas

2 Broadcast Receiver Komponent umożliwiający rejestrowanie się do zdarzeń aplikacji lub systemu. Jak tylko dane zdarzenie się odbędzie, wszystkie zarejestrowane do niego „odbiorniki” (receiver) zostaną o tym poinformowane i będą miały możliwość podjęcia akcji. Często służy też jako rodzaj komunikacji pomiędzy kilkoma różnymi aplikacjami lub w obrębie jednej aplikacji.

3 Broadcast Receiver kont. 1
Odbiornik można rejestrować na dwa sposoby: Statyczny: za pośrednictwem pliku AndroidManifest.xml . Od Oreo, w celu zredukowania procesów, które chodzą w tle zostały dodane ograniczenia dotyczące statycznej rejestracji. Dynamiczny: za pośrednictwem metody Trzeba pamiętać o wyrejestrowaniu, jeżeli przestanie być nam potrzebny: unregisterReceiver(receiver); <receiver android:name="MyBroadcastReceiver“> <intent-filter> <action android:name="com.example.MY_CUSTOM_INTENT“/> </intent-filter> </receiver> registerReceiver(MyBroadcastReceiver mbr, new IntentFilter("com.example.MY_CUSTOM_INTENT"));

4 Przykład dynamicznej rejestracji
public class MainActivity extends Activity { public static final String myIntent = "come.example.smb.myapplication.intent.action.EVENT1"; private MyBroadcastReceiver mbr = new MyBroadcastReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart(){ super.onStart(); registerReceiver(mbr, new IntentFilter(myIntent)); } @Override protected void onPause(){ super.onPause(); unregisterReceiver(mbr); } }

5 Przykład statycznej rejestracji
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=" package="com.example.might.myapplication"> <application android:allowBackup="true" android:supportsRtl="true" <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".OptionsActivity"></activity> <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.MY_CUSTOM_INTENT“/> </intent-filter> </receiver> </application> </manifest>

6 Broadcast Receiver kont. 2
Broadcasty systemowe: android.intent.action.BOOT_COMPLETED android.intent.action.BATTERY_LOW android.intent.action.SCREEN_OFF android.net.wifi.STATE_CHANGE android.provider.Telephony.SMS_RECEIVED android.provider.Telephony.SIM_FULL Mamy możliwość dorabiania własnych. Całą listę dostępnych systemowych rozgłoszeń można znaleźć w pliku: /sdk/platforms/android-XX/data/broadcast_actions.txt

7 Typy rozgłoszeń Typy rozgłoszeń (broadcasts):
Normalne (Normal): wszystkie odbiorniki wykonują akcje w tym samym czasie (wtedy, kiedy otrzymują intencję rozgłoszeniową). Uporządkowane (Ordered): broadcasty przesyłane są do jednego odbiornika. Po ukończeniu jego wykonywanych akcji broadcast przekazywany jest do kolejnego wraz z rezultatem podjętych akcji. Każdy z odbiorników może ukończyć proces uniemożliwiając podejmowanie akcji przez kolejne. O kolejności decyduje atrybut android:priority danego filtru intencji (intent-filter).

8 Priorytet odbiorników
Kolejność, w której odbiorniki będą otrzymywały rozgłoszenia uporządkowane zależy od wartości priorytetu. Ustawia się go za pomocą parametru android:priority (statycznie) lub skorzystania z metody IntentFilter.setPriority() (dynamicznie). Wartość ta powinna być z przedziału: minimum: IntentFilter.SYSTEM_LOW_PRIORITY -1000 maximum: IntentFilter.SYSTEM_HIGH_PRIORITY 1000 domyślna: 0

9 Priorytet odbiorników kont. 1
Statycznie Dynamicznie <receiver android:name="MyBroadcastReceiver"> <intent-filter android:priority="999"> <action android:name="com.example.smb.myapplication.intent.action.EVENT1“/> </intent-filter> </receiver> @Override protected void onStart(){ super.onStart(); IntentFilter if1 = new IntentFilter(myIntent); if1.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY-1); registerReceiver(mbr, if1); }

10 Typy rozgłoszeń kont. 1 Typy rozgłoszeń (broadcasts):
Zapisujące intencje (Sticky): intencja jest przechowywana po jej rozgłoszeniu. Nowe intencje nadpisują stare pasujące. Przy dynamicznej rejestracji odbiornika wszystkie przechowane intencje, które pasują do jego filtra są do niego rozesłane. Wraz z API 21 zostało potępione (deprecated), ponieważ stwarzało ryzyko naruszenia bezpieczeństwa. Nie zapisujące intencje (Non-Sticky): intencja zostaje usuwana po jej rozgłoszeniu. Wykorzystujące lub niewykorzystujące zezwolenia (Permissions).

11 Typy rozgłoszeń kont. 2 Rozgłoszenie intencji.
private void onClick(View v){ Intent intent1 = new Intent(myIntent); String permission1 = Manifest.permission.READ_SMS; //normal broadcast sendBroadcast(intent1); //ordered broadcast sendOrderedBroadcast(intent1, permission1); //ordered broadcast sendOrderedBroadcast(intent1, permission1, new BroadcastReceiver(){ public void onReceive(Context context, Intent intent){ Toast.makeText(context, "Rezultat:"+getResultData(), Toast.LENGTH_LONG).show(); } },null, 0, null, null); //handler, initiatlCode, initialData, initialExtras }

12 Broadcast Receiver kont. 3
Cykl życiowy: Obiekt BroadcastReceiver uznawany jest za ważny od początku do końca wykonywania się metody onReceive() Z tego powodu nie możemy wykonywać żadnych asynchronicznych działań, które po ich ukończeniu zwracałyby rezultat do nieaktywnego już BroadcastReceivera (zlikwidowanego przez system). Od API 11 można za pomocą metody goAsync() Nie możemy z jego poziomu rejestrować się do usług (service binding) ani pokazywać dialogów. Alternatywą do dialogów mogą być notyfikacje tworzone za pomocą NotificationManager. Proces wykonujący nasz odbiornik jest uznawany jako pierwszoplanowy.

13 Zezwolenie na odbiór rozgłoszeń
W celu uniemożliwienia otrzymywania rozgłoszonych intencji od wszystkich aplikacji i zaakceptowania tylko wybranych, możliwe jest utworzenie zezwoleń, które powinny te aplikacje posiadać. Alternatywą jest: ustawienie w manifescie, parametru: android:exported=”false” stworzenie LocaLBroadcastManager (nasłuchuje tylko na akcje z tego samego procesu)

14 Zezwolenia kont. 1 Aby stworzyć nasze własne zezwolenie w AndroidManifest.xml : W <receiver> dodajemy: <permission-group android:name="com.example.my_permissions" android:label="my permissions group" /> <permission android:name="com.example.my_permissions.MY_PERMISSION" android:permissionGroup="com.examples.my_permissions" android:label="my permission"/> <uses-permission android:name="com.example.my_permissions.MY_PERMISSION" /> <receiver android:name="MyBroadcastReceiver" android:permission="com.example.my_permissions.MY_PERMISSION"> <intent-filter> <action android:name="com.example.smb.myapplication.intent.action.EVENT1“ /> </intent-filter> </receiver>

15 Uruchamianie odbiornika w osobnym procesie
W celu uruchomienia odbiornika w osobnym procesie można skorzystać z parametru android:process . Sprawi to, że odbiornik nie będzie zależny od działania naszej aplikacji. <receiver android:name="MyBroadcastReceiver" android:process=":remote"> <intent-filter> <action android:name="com.example.smb.myapplication.intent.action.EVENT1"> </action> </intent-filter> </receiver>

16 Przykład rozgłoszenia intencji
Tworzenie: W naszym Activity dodajemy metodę: W pliku layout naszego Activity dodajemy guzik: public void broadcastIntent(View view){ Intent intent = new Intent(); intent.setAction("com.example.MY_CUSTOM_INTENT"); sendBroadcast(intent); } <Button android:onClick="broadcastIntent" android:layout_width="match_parent" android:layout_height="wrap_content" />

17 Przykład odbiornika Tworzenie:
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "Intencja otrzymana.", Toast.LENGTH_LONG).show(); } }

18 Przykład odbiornika kont. 1
Przekazywanie rezultatu. public class Receiver1 extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ String tmp = getResultData(); setResultData(tmp+"Data from receiver1"); } }

19 Przykład odbiornika kont. 2
Anulowanie dalszego rozgłaszania. public class Receiver2 extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ if(isOrderedBroadcast()){ abortBroadcast(); } Toast.makeText(context, "Intent received.", Toast.LENGTH_LONG).show(); } }

20 Przykład odbiornika kont. 3
W pliku AndroidManifest.xml dodajemy do <application> : <receiver android:name="MyBroadcastReceiver" > <intent-filter> <action android:name="com.example.MY_CUSTOM_INTENT" /> </intent-filter> </receiver>

21 Rezultat przykładu (1)

22 Przykład 2 Uruchomienie usługi po odpaleniu systemu:
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Intent service_intent = new Intent(context, MyService.class); context.startService(service_intent); } }

23 Przykład 2 kont.1 Manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=" package="com.example.might.myapplication"> <users-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:supportsRtl="true" <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".OptionsActivity"></activity> <receiver android:name="MyBroadcastReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>

24 PackageManager Możemy wykorzystać PackageManagera w celu wyłączenia jakiegoś statycznie zarejestrowanego odbiornika po jednokrotnym wyłapaniu intencji i wykonaniu metody onReceive(). PackageManager pm = getPackageManager(); ComponentName cn = new ComponentName(getApplicationContext(), MyBroadcastReceiver.class); pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

25 PackageManager kont. 1 Stany, które można wykorzystać to:
COMPONENT_ENABLED_STATE_DEFAULT - stan taki jaki jest opisany w AndroidManifest.xml . COMPONENT_ENABLED_STATE_DISABLED - wyłączony. COMPONENT_ENABLED_STATE_ENABLED - włączony. Zmiana stanu komponentu może sprawić, że zachowanie aplikacji będzie nieprzewidywalne. W tej sytuacji flaga DONT_KILL_APP zapobiega przed likwidacją aplikacji przez system.

26 Pending intent (oczekujące intencje)
Są to swojego rodzaju przepustki, które dana aplikacja może przekazać innej aplikacji umożliwiając w ten sposób otrzymanie przez nią zezwoleń pierwszej w celu wykonania jakichś poleceń. W celu uzyskania PendingIntent musimy użyć jednej z metod: PendingIntent.getActivity() - do uruchomienia aktywności. PendingIntent.getBroadcast() - do rozgłoszenia. PendingIntent.getService() - do uruchomienia usługi. Unieważniamy za pomocą metody cancel() .

27 Pending Intent kont. 1 Argumenty metod get[Activity/Broadcast/Service](): Context - kontekst aplikacji requestCode - prywatny kod zapytania do uzyskania tego samego pending intentu w przyszłości (np. w celu anulowania za pomocą metody cancel()) intent - jawna intencja (explicit) aktywności jaka ma być uruchomiona flag - flaga: FLAG_CANCEL_CURRENT - jeżeli pending intent już istnieje to istniejący powinien być anulowany przed stworzeniem nowego. FLAG_IMMUTABLE - pending intent powinien być niezmienny. FLAG_NO_CREATE - jeżeli pending intent nie istnieje to zwróc null zamiast tworzyć nowy. FLAG_ONE_SHOT - ten pending intent może być użyty jedynie raz. FLAG_UPDATE_CURRENT - jeżeli pending intent już istnieje to zachowaj go, ale zamień jego dane (extra data) z tymi z nowego.

28 Notyfikacje System Android umożliwia ukazywanie notyfikacji związanych z aplikacjami na pasku notyfikacji (status bar). Możliwe jest dodanie elementów, które zarządzają dostępnymi aktywnościami, usługami itp. image source:

29 NotificationCompat.Builder
Metody klasy NotificationCompat.Builder : setContentTitle() - zmienia treść pierwszej linijki. setContentText() - zmienia treść drugiej linijki. setSmallIcon() - ustawia obrazek, który będzie w niej widoczny (z lewej). setContentIntent() - ustala pending intent, jaki jest wysyłany podczas kliknięcia na notyfikację. setAutoCancel() - notyfikacja znika po kliknięciu w nią. build() - tworzy notyfikację.

30 NotificationManager Klasa odpowiedzialna za powiadamianie użytkownika o zdarzeniach, jakie mają miejsce. Sposób informowania użytkownika o różnych sprawach, które się wydarzyły w tle. Zarządza: Notyfikacjami (w statusbarze) Lampkami LED Powiadamianiem poprzez oświetlenie tła, odpaleniem dźwięku lub wibracją Metoda notify(int id, Notification notificaition) - publikuje notyfikację w statusbarze (jeżeli identyfikator będzie taki sam to notyfikacje będą się nadpisywać)

31 Tworzenie notyfikacji
Tworzenie (z poziomu Activity): private final String channelID = "channel1"; private int id = 0; public void onClick(View view) { Intent intent = new Intent(this, Main2Activity.class); PendingIntent pendint = PendingIntent.getActivity(this, 0, intent, 0); NotificationCompat.Builder notif = new NotificationCompat.Builder(this, channelID) setSmallIcon(R.mipmap.ic_launcher) setContentTitle(getString(R.string.my_title)) setContentText(getString(R.string.my_text)) setContentIntent(pendint) setPriority(NotificationCompat.PRIORITY_DEFAULT) setAutoCancel(true); NotificationManagerCompat nm = NotificationManagerCompat.from(this); nm.notify(id++, notif.build()); }

32 Rezultat

33 Kanały notyfikacji (API 26+)
Nasza notyfikacja musi być przydzielona do kanału. Użytnownik może wybrać, które kanały notyfikacji naszej apki go interesują, a które np. blokować. Należy pamiętać, by wywołać metodę zanim wyświetlimy notyfikację np. w onCreate() (jeżeli znajdujemy się w Activity). //API 26+ private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // SDK >= CharSequence name = getString(R.string.my_channel); String description = getString(R.string.my_chan_desc); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(channelID, name, importance); channel.setDescription(description); NotificationManager nm = getSystemService(NotificationManager.class); nm.createNotificationChannel(channel); } }

34 Przykład niestandardowej notyfikacji
Do stworzenia niestandardowej notyfikacji potrzebujemy: MainActivity.java – klasa głównej aktywności z guzikiem do tworzenia notyfikacji. MyNotification.java – klasa aktywności, która jest uruchomiana po kliknięciu w notyfikację. activity_main.xml – układ MainActivity. activity_my_notification.xml – układ MyNotification. mojanotyfikacja.xml – układ niestandardowej notyfikacji.

35 Przykład kont. 1 MainActivity.java (part 1)

36 Przykład kont. 2 MainActivity.java (part 2)

37 Przykład kont. 3 activity_main.xml

38 Przykład kont. 4 MyNotification.java

39 Przykład kont. 5 activity_my_notification.xml

40 Przykład kont. 6 mojanotyfikacja.xml

41 Rezultat


Pobierz ppt "SMB - BroadcastReceiver i notyfikacje"

Podobne prezentacje


Reklamy Google