piątek, 30 marca 2018

Co to takiego jest to Affinity?

Koligacja (affinity) aktywności (activity) określa do jakiego zadania dana aktywność preferowanie należy.

Domyślnie jest taka sama dla wszystkich aktywności danej aplikacji i jej wartość określana jest przez nazwę paczki aplikacji. Dzięki temu wszystkie aktywności aplikacji są ze sobą powiązane i będą się otwierały w stosie (stack) tego samego zadania (task).

Koligację inną niż domyślna można ustawić zmieniając w manifeście wartość atrybutu taskAffinity dla wybranej aktywności. Wartość ta musi być inna niż nazwa paczki aplikacji (to jest domyślna wartość tego atrybutu).

Koligacja jest brana pod uwagę, gdy:
  • aktywność jest wywoływana z flagą FLAG_ACTIVITY_NEW_TASK - system sprawdza wtedy czy jest jakieś inne zadanie, którego aktywności mają tę samą koligację co wywoływana aktywność - jeśli tak, to aktywność jest do niego przypisywana, jeśli nie to wywoływana aktywność otwiera nowe zadanie
  • atrybut allowTaskReparenting dla danej aktywności ma wartość true - wtedy każde zadanie, z którym dana aktywność ma koligację, przechodząc do gółwnego wątku (foreground) przypisuje sobie na górę stosu i wyświetla tę aktywność
Koligacja przyda się również gdy paczka APK zawiera więcej niż jedną aplikację - wtedy można różne aplikacje odpowiednio ze sobą powiązać (jak mieć 2 aplikacje w jednym .apk - https://stackoverflow.com/questions/10682576/one-apk-file-that-installs-two-apps)

piątek, 23 marca 2018

Jak powiązać aktywność z zadaniem - launchMode

Przede wszystkim można zadeklarować w manifeście dla danej aktyności(activity) odpowiednią wartość atrybutu launchMode:
  • standard
    • za każdym razem tworzone jest nowe wywołanie (instance) danej aktywności w zadaniu (task)
    • aktywność może być obecna w różnych zadaniach - będzie miała swoje oddzielne wywołania w każdym zadaniu, dla którego te wywołania były stworzone
    • aktywność może mieć kilka wywołań w jednym zadaniu - tyle ile razy dana aktywność była wywoływana
  • singleTop
    • nowe wywołanie danej aktywności tworzone jest tylko wtedy, jeśli wywoływana aktywność nie jest aktualnie na górze stosu (top of the stack)
    • gdy onNewIntent() powoduje wywołanie aktywności, która już jest na górze stosu, wtedy zamiast dodania na stos nowego wywołania, obecna aktywność jest aktualizowana o dane, które zawiera wywołanie
    • aktywność może być obecna w różnych zadaniach - będzie miała swoje oddzielne wywołania w każdym zadaniu, dla którego te wywołania były stworzone
    • aktywność może mieć kilka wywołań w jednym zadaniu - tyle ile razy dana aktywność była wywoływana przez inną aktywność (gdy nie była na górze stosu)
  • singleTask
    • nowe wywołanie danej aktywności tworzone jest tylko wtedy, gdy nie ma jeszcze żadnego wywołania tej aktywności w żadnym z zadań, wtedy też tworzone jest nowe zadnie a ta aktywność staje się jego początkową aktywnością
    • gdy onNewIntent() powoduje wywołanie aktywności, która już jest w jakimś zadaniu, wtedy zamiast tworzenia nowego wywołania, obecna tam aktywność jest aktualizowana o dane, które zawiera wywołanie
    • w systemie może być tylko jedno wywołanie danej aktywności
    • przycisk wstecz przenosi użytkownika do poprzedniej aktywności (tej, która wywołała daną aktywność), pomimo iż zostało stworzone nowe zadanie
  •  singleInstance
    • nowe wywołanie danej aktywności tworzone jest tylko wtedy, gdy nie ma jeszcze żadnego wywołania tej aktywności w żadnym z zadań, wtedy też tworzone jest nowe zadnie a ta aktywność staje się jego początkową aktywnością
    • gdy onNewIntent() powoduje wywołanie aktywności, która już jest w jakimś zadaniu, wtedy zamiast tworzenia nowego wywołania, obecna tam aktywność jest aktualizowana o dane, które zawiera wywołanie
    • w systemie może być tylko jedno wywołanie danej aktywności
    • przycisk wstecz przenosi użytkownika do poprzedniej aktywności (tej, która wywołała daną aktywność), pomimo iż zostało stworzone nowe zadanie 
    • wywołanie nowej aktywności przez daną aktywność powoduje stworzenie nowego zadania - aktywność z atrybutem singleInstance jest jedyną aktywnością w zadaniu
Domyślnie atrybut launchMode przyjmuje wartość standard.

Dzięki takiej deklaracji aktywność (o ile nie zostanie wywołana inaczej) będzie się zawsze zachowywać w wyznaczony sposób.
Jeżeli aktywność jednorazowo ma się zachować inaczej zamiast deklarować to w manifeście można wywołać ją poleceniem startActivity() z wybraną flagą:
  • FLAG_ACTIVITY_NEW_TASK - zadziała analogicznie do atrybutu singleTask,
  • FLAG_ACTIVITY_SINGLE_TOP - zadziała analogicznie do atrybutu singleTop,
  • FLAG_ACTIVITY_CLEAR_TOP - jeżeli wywoływana aktywność ma już swoje wywołanie w aktywnym zadaniu, to wszystkie aktywności, które są na stosie ponad nią, zostają zamknięte a ona sama jest aktualizowana.

Poniżej podsumowanie w tabeli przy założeniu, że przedstawione atrybuty dotyczą aktywności A, a aktywność B ma atrybut standard.



aktywność A jest wywoływana przez aktywność B


aktywność A nie ma wywołania w systemie aktywność A ma wywołanie w systemie aktywność A jest wywoływana przez aktywność A aktywność A wywołuje aktywność B wstecz z aktywności A
standard tworzy się nowe wywołanie danej aktywności na górze stosu tworzy się nowe wywołanie danej aktywności na górze stosu tworzy się nowe wywołanie danej aktywności na górze stosu tworzy się nowe wywołanie danej aktywności na górze stosu powrót do poprzedniej aktywności ze stosu
singleTop tworzy się nowe wywołanie danej aktywności na górze stosu tworzy się nowe wywołanie danej aktywności na górze stosu istniejące wywołanie jest aktualizowane tworzy się nowe wywołanie danej aktywności na górze stosu powrót do poprzedniej aktywności ze stosu
singleTask tworzy się nowe wywołanie danej aktywności w nowym zadaniu istniejące wywołanie aktywności A jest aktualizowane i przechodzi do głównego wątku istniejące wywołanie jest aktualizowane tworzy się nowe wywołanie danej aktywności na górze stosu powrót do poprzedniej aktywności z zadania, które wywołało aktywność A
singleInstance tworzy się nowe wywołanie danej aktywności w nowym zadaniu istniejące wywołanie aktywności A jest aktualizowane i przechodzi do głównego wątku istniejące wywołanie jest aktualizowane tworzy się nowe wywołanie danej aktywności w nowym zadaniu powrót do poprzedniej aktywności z zadania, które wywołało aktywność A

środa, 21 marca 2018

Kilka słów o taskach

Zadanie (Task) to zbiór aktywności (Activity) ułożony w stos (stack) tak, żeby klikając przycisk "wstecz" można było cofnąć się do poprzedniej aktywności (back stack). Zbiór ten jest aktywny dla każdej uruchomionej aplikacji, dopóki nie zostanie zamknięty - ale na prawdę zamknięty. System przechowuje w tle (background) otwarte zadania dla wielu uruchomionych aplikacji, chyba, że użytkownik (lub coś innego) świadomie i celowo (lub wskutek błędu) zadanie zamknie.
Przy kliknięciu ikony aplikacji system przywraca z tła do głównego wątku (foreground) istniejące dla danej aplikacji zadanie lub tworzy nowe zadanie jeśli aplikacja nie ma otwartego zadania.

System utrzymuje w tle wiele zadań - tak wiele, jak jest w stanie. W pewnym momencie otwartych zadań robi się tak wiele, że system musi, dla poprawy pamięci, jakieś zadanie zamknąć. Warto o tym pamiętać pisząc aplikację - takie niespodziewane zamknięcie może spowodować w aplikacji błędy i utratę danych, jesli się przed tym nie zabezpieczymy.

System obsługuje każde z zadań oddzielnie, a w przypadku urządzeń, które mogą wyświetlać więcej niż 1 okno (multi-windowed environment, Chromebooks) zadania utrzymywane są oddzielnie
dla każdego okna.

Stos w aplikacji jest zbiorem aktywności działającym zgodnie z zasadą LIFO (Last In First Out).Przy uruchomieniu aplikacji na stos trafia główna aktywność (main activity). Kiedy aktualna aktywność wywołuje kolejną - kolejna trafia na stos nad tę aktywność, która ją wywołała.
Zawsze wyświetlana i działająca jest aktywność z góry stosu.
Przycisk cofnięcia powoduje zakończenie i zamknięcie aktualnej aktywności oraz pobranie i wyświetlenie kolejnej, która znajdowała się pod stosem pod nią.
Stos nie zmienia kolejności aktywności, które w nim są - aktywność może tylko być wprowadzona na wierzch stosu (push) lub usunięta z wierzchu stosu (pop).
Przycisk "wstecz" usuwa po kolei wszystkie aktywności ze stosu i gdy stos jest pusty, zadanie przestaje istnieć. Usunięcie ostatniej aktywności ze stosu przenosi użytkownika do głównego ekranu (home) lub do aplikacji, która to zadanie aktywowała.
Stos przechowuje każde wywłoanie aktywności - to znaczy, że jeśli aplikacja jest tak zbudowana, że dana aktywność jest wywoływana kilkukrotnie w trakcie działania aplikacji, to na stosie znajdą się wszystkie wywołania z ich aktualnym stanem.

wtorek, 13 marca 2018

Nazwy w IT - polsko-niepolskie

Mam akurat wolną chwilę - próbuję napisać jakiś post. Bardzo chcę, żeby był po polsku bo ja po polsku jakoś lepiej to wszystko rozumiem. Więc czytam te opisy po angielsku, dociekam, zgłębiam, tłumaczę i już, już chcę pisać gdy nagle - ściana językowa... Zupełnie nie wiem jak powinnam przetłumaczyć te androidowe polecenia na język polski i nie wiem nawet czy to się tłumaczy. Gdybym pracowała w zespole, to bym pewnie wiedziała.
To bardzo ciekawe doświadczenie - jako młoda studentka robotyki śmiałam się z kolegami z nadużywania angielskich słów polskiej wypowiedzi, gdy po raz dziesiąty usłyszeliśmy "salary" podczas prezentacji w jakiejś firmie.
Później przeszłam do IT i zdania w stylu "Zpuszuj swojego commita, bo chcę zmerdżować swoje zmiany przed planningiem" były zupełnie normalne.
A teraz wiem, że język IT jest specyficzny i będąc od tak dawna poza zespołem czuję się jakbym nie umiała mówić :)