Advertisement
  1. Code
  2. Android SDK

Android od podstaw: łączenie aktywności i aplikacji

Scroll to top
Read Time: 6 min
This post is part of a series called Android From Scratch.
Android From Scratch: Activities and Fragments
Android From Scratch: Understanding Adapters and Adapter Views

Polish (Polski) translation by Mateusz Kurlit (you can also view the original English article)

Aplikacja na Androida składająca się z kilku prostych aktywności zazwyczaj oferuje znacznie więcej użytkownikowi niż ta, która koncentruje całą funkcjonalność w dużej i złożonej aktywności. Dobrą zasadą jest ograniczenie każdej stworzonej aktywności do jednego widocznego zadania.

Aby stworzyć warunki do funkcjonowania prostych aktywności, musisz utworzyć połączenia i umożliwić płynną wymianę danych między nimi. W tym poradniku pokażę ci jak wykorzystać intencje do tworzenia połączeń między aktywnościami i wysyłać dane z jednej aktywności do drugiej.

1. Co to jest intencja?

W prawdziwym świecie, przed przeprowadzeniem działania zazwyczaj masz zamiar go przeprowadzić. To samo zjawisko występuje w świecie aplikacji na Androida. Aby rozpocząć aktywność Androida, musisz mieć dla niej intencje.

Intencje są wystąpieniami klasy Intent. Są tak integralną częścią platformy Android, że nawet najprostsze aplikacje ich potrzebują. Rozważmy przykład aplikacji Hello World stworzonej wcześniej w tej serii. Aplikacja może się uruchomić po dotknięciu ikony tylko dlatego, że potrafi odpowiedzieć na intencję utworzoną przez program uruchamiający na twoim urządzeniu.

Oprócz szczegółów aktywności, intencja może zawierać dodatkowe dane, trafnie nazwane dodatkami, mającymi za zadanie wysyłanie argumentów lub zwracaniu wyników między jedną i drugą aktywnością.

2. Typy intencji

Intencja może być jednoznaczna lub domniemana. Intencja jest jednoznaczna, kiedy inicjujesz ją za pomocą literalnej klasy aktywności, którą chcesz uruchomić. W przypadku domniemanych intencji, określasz tylko działanie, które chcesz przeprowadzić i pozwalasz systemowi operacyjnemu Android określić dokładną aktywność, która powinna być uruchomiona.

Zazwyczaj jednoznaczne intencje są wykorzystywane do uruchomiania aktywności należących do twojej aplikacji, a intencje domniemane są przeznaczone dla aktywności, które należą do innych aplikacji zainstalowanych na urządzeniu użytkownika.

3. Tworzenie jednoznacznej intencji

Aby utworzyć jednoznaczną intencję, możesz użyć metody setClass() obiektu Intent i przekazać do niej literalną klasę aktywności wraz z odniesieniem do bieżącej aktywności jako kontekstu. Na przykład, jeśli bieżąca aktywność to MainActivity, a ty chcesz utworzyć intencję, która uruchamia aktywność o nazwie OtherActivity, wykorzystaj poniższy kod:

1
Intent intent = new Intent();
2
intent.setClass(MainActivity.this, OtherActivity.class);

Jeśli chcesz utworzyć domniemaną intencję dla aktywności, która nie należy do twojej aplikacji, użyj w zamian metody setComponent(). Jako argument, musisz przekazać obiekt ComponentName, który został zainicjowany za pomocą nazwy pakietu odpowiedniej aplikacji i nazwy klasy aktywności.

Na przykład, oto jak utworzyć intencję dla aktywności o nazwie OtherActivity, która należy do aplikacji, której nazwa pakietu to com.example.otherapp.

1
Intent intent = new Intent();
2
intent.setComponent(
3
    new ComponentName("com.example.otherapp", 
4
                      "com.example.otherapp.OtherActivity"
5
    )
6
);

4. Tworzenie intencji domniemanej

Aby utworzyć domniemaną intencję, musisz użyć metody setAction() obiektu Intent i przekazać jej obiekt ciągu. Obiekt ciągu określa nazwę działania, które zamierzasz przeprowadzić. Android SDK posiada kilka standardowych działań. W większości z nich musisz skorzystać z metody setData(), aby określić dane, z którymi działanie ma współpracować. Dane muszą zawsze posiadać formę obiektu Uri.

Jedną z najczęściej wykorzystywanych działań jest ACTION_VIEW, która umożliwia uruchamianie różnych aplikacji takich jak domyślna przeglądarka, dzwonienie i kontakty. Na przykład, oto jak stworzyć domniemaną intencję, aby zadzwonić pod numer 123456789:

1
Intent intent = new Intent();
2
intent.setAction(Intent.ACTION_VIEW);
3
4
// Generate a valid URI for the telephone number

5
// using the Uri.parse method and pass it to setData

6
intent.setData(Uri.parse("tel:123456789"));

Poprzez zmianę obiektu Uri, który przekazujesz metodzie setData(), możesz otworzyć inną aplikację ACTION_VIEW. Na przykład, jeśli chcesz uruchomić przeglądarkę i otworzyć stronę internetową https://tutsplus.com/, wezwanie setData() będzie wyglądało tak:

1
intent.setData(Uri.parse("https://tutsplus.com"));

5. Dodatki w intencji

Niektóre intencje muszą zawierać dodatkowe dane, aby działały właściwie. Dodatkowe dane nazywają się dodatkami. Dodatki to nic innego jak para klucz-wartość, która należy do obiektu Bundle. Korzystanie z Bundle jest jak używanie HashMap z dwoma ograniczeniami:

  • klucz musi zawsze być obiektem String
  • wartości muszą zawsze być prymitywami lub obiektami Parcelable

Dodatki mogą być używane z jednoznacznymi i domniemanymi intencjami. Aby włączyć dodatki do obiektu Intent, możesz użyć metody putExtra(). Na przykład, oto jak możesz włączyć dodatki z kluczem message i wartością Hello.

1
intent.putExtra("message", "Hello");

6. Korzystanie z intencji

Teraz, gdy rozumiesz jak tworzyć intencję i dodawać do niej dane, przejdźmy do wykorzystywania obiektów Intent do uruchamiania aktywności. Najprostszym sposobem na uruchomienie aktywności za pomocą obiektu Intent jest przekazanie jej jako argument metodzie startActivity().

1
startActivity(intent);

Metoda startActivity() jest ogólnie używana tylko, kiedy chcesz przełączyć z jednej aktywności do drugiej. Inaczej mówiąc, startActivity() umożliwia przeniesienie użytkownika z jednego ekranu aplikacji na drugi.

Jeśli chcesz uruchomić aktywność, aby wykonać konkretne zadanie i otrzymać jego wyniki, musisz użyć w zamian metody startActivityForResult(). Ta metoda, oprócz obiektu Intent, oczekuje liczby całkowitej, której używasz do zidentyfikowania wyniku aktywności. Liczba całkowita jest określana jako kod żądania.

Dodatkowo, aby otrzymać wynik aktywności uruchomionej za pomocą metody startActivityForResult(), twoja aktywność musi nadpisać metodę onActivityResult(). Na przykład, poniższy fragment kodu pokazuje jak utworzyć domniemaną intencję, aby zrobić zdjęcie za pomocą domyślnej aplikacji aparatu i otrzymać miniaturę zdjęcia jako wynik:

1
// An integer to identify the result of the

2
// camera app's activity

3
final static int CAMERA_RESULT_REQUEST_CODE = 1;
4
5
private void takePhoto() {
6
    Intent intent = new Intent();
7
8
    // Use ACTION_IMAGE_CAPTURE to refer to the

9
    // default camera app's activity

10
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
11
12
    // Launch the activity, and specify that

13
    // you expect a result whose request

14
    // code is equal to CAMERA_RESULT_REQUEST_CODE

15
    startActivityForResult(intent, CAMERA_RESULT_REQUEST_CODE);
16
}
17
18
@Override
19
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
20
21
    // Check if requestCode matches the request 

22
    // code passed to the startActivityForResult method.

23
24
    // Also check if the result is valid using the

25
    // resultCode parameter

26
27
    if(requestCode == CAMERA_RESULT_REQUEST_CODE && resultCode == RESULT_OK) {
28
        Bitmap thumbnail = 
29
            (Bitmap)result.getExtras().get("data");
30
    }
31
}

Zwróć uwagę, że wynik aktywności jest również obiektem Intent. W powyższym fragmencie kodu, najpierw użyłem metody getExtras(), aby wydobyć Bundle zawierający dodatki należące do wyniku. Następnie skorzystałem z metody get(), aby wydobyć miniaturę jako obiekt Bitmap.

7. Korzystanie z filtrów intencji

W poprzedniej części, dowiedziałeś się jak używać domniemanych intencji, aby uruchamiać aktywności, które należą do innych aplikacji zainstalowanych na urządzeniu użytkownika. Być może zastanawiasz się, czy inne aplikacje mogą uruchamiać aktywności, które należą do twojej aplikacji, za pomocą tej samej procedury. Odpowiedź na to pytanie brzmi "nie, chyba, że tego chcesz". Domyślnie, ze względów bezpieczeństwa, aktywność nie może być uruchomiona przez aktywności należące do innych aplikacji.

Aby udostępnić aktywność innym aplikacjom, musisz utworzyć dla niej filtr intencji. Aby to zrobić, musisz dodać tag intent-filter do pliku projektu AndroidManifest.xml.

Na przykład, jeśli chcesz, żeby aktywność o nazwie MyCustomActivity odpowiadała niestandardowemu działaniu o nazwie com.custom.action, jej wpis w manifeście musi wyglądać w ten sposób:

1
<activity android:name=".MyCustomActivity">
2
    <intent-filter>
3
        <action android:name="my.custom.action"/>
4
        <category android:name="android.intent.category.DEFAULT" />
5
    </intent-filter>
6
</activity>

Zwróć uwagę, że razem z tagiem action określającym nazwę działania, tag intent-filter musi również zawierać tag category, którego atrybut name to android.intent.category.DEFAULT. Bez tagu category, twoja aktywność nie będzie w stanie odpowiedzieć na domniemane intencje.

Po stworzeniu filtra intencji, każda aplikacja może uruchomić MyCustomActivity za pomocą kod poniżej:

1
Intent intent = new Intent();
2
3
// The string passed to the setAction method

4
// must match the action name mentioned in the

5
// intent filter

6
intent.setAction("my.custom.action");
7
8
startActivity(intent);

Jeśli nie chcesz korzystać z filtrów intencji, ale nadal chcesz udostępniać aktywność innym aplikacjom, możesz dodać atrybut exported do definicji aktywności w manifeście, ustawiają jego wartość na true.

1
<activity android:name=".MyCustomActivity" android:exported="true"/>

W tym przypadku, inne aplikacje będą musiały skorzystać z jednoznacznych intencji, aby uruchomić aktywność.

Podsumowanie

Teraz wiesz jak łączyć dowolne dwie aktywności obecne na urządzeniu za pomocą domniemanych i jednoznacznych intencji. Dzięki tej wiedzy, możesz zacząć tworzyć złożone aplikacji, które posiadają kilka ekranów. Możesz również łatwo wykorzystać funkcjonalność innych aplikacji zainstalowanych na urządzeniu.

Aby dowiedzieć się więcej o intencjach, przejrzyj oficjalną dokumentację.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.