Na Androidzie precyzyjny link to link, który prowadzi bezpośrednio do określonego miejsca w aplikacji.
Komponent Nawigacja umożliwia tworzenie 2 rodzajów precyzyjnych linków: wyraźnych i domyślnych.
Tworzenie wyraźnego precyzyjnego linku
Wyraźny precyzyjny link to pojedynczy precyzyjny link, który używa PendingIntent
do kierowania użytkowników do określonego miejsca w aplikacji. Możesz wyświetlić wyraźny precyzyjny link na przykład w ramach powiadomienia lub widżetu aplikacji.
Gdy użytkownik otworzy Twoją aplikację za pomocą precyzyjnego linku, stos zadań zostanie wyczyszczony i zastąpiony miejscem docelowym precyzyjnego linku. Podczas zagnieżdżania wykresów do stosu jest też dodawane miejsce docelowe z początku każdego poziomu zagnieżdżania, czyli miejsce docelowe z początku każdego elementu <navigation>
w hierarchii.
Oznacza to, że gdy użytkownik kliknie przycisk Wstecz w miejscu docelowym precyzyjnego linku, wróci do poprzedniego poziomu nawigacji tak, jakby wszedł do aplikacji od jej punktu wejścia.
Możesz użyć klasy NavDeepLinkBuilder
do utworzenia klasy PendingIntent
, jak pokazano w poniższym przykładzie. Pamiętaj, że jeśli podany kontekst nie jest obiektem Activity
, konstruktor używa parametru PackageManager.getLaunchIntentForPackage()
jako domyślnej aktywności do uruchomienia (jeśli jest dostępna).
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent();
Domyślnie NavDeepLinkBuilder
uruchamia precyzyjny link do domyślnego Activity
, który jest zadeklarowany w manifeście aplikacji. Jeśli NavHost
występuje w innej aktywności, podczas tworzenia kreatora precyzyjnych linków musisz podać nazwę jego komponentu:
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity::class.java) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity.class) .createPendingIntent();
Jeśli masz ComponentName
, możesz przekazać go bezpośrednio do konstruktora:
Kotlin
val componentName = ... val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent()
Java
ComponentName componentName = ...; PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent();
Jeśli masz już NavController
, możesz też utworzyć precyzyjny link, używając NavController.createDeepLink()
.
Tworzenie precyzyjnego linku typu implicit
Ukryty precyzyjny link odnosi się do określonego miejsca docelowego w aplikacji. Gdy zostanie wywołany (np. gdy użytkownik kliknie link), Android może otworzyć Twoją aplikację w odpowiednim miejscu docelowym.
Precyzyjne linki można dopasowywać na podstawie identyfikatora URI, działań związanych z intencją i typów MIME. W przypadku jednego linku głębokiego możesz określić wiele typów dopasowania, ale pamiętaj, że najpierw jest stosowany dopasowanie argumentu URI, a potem działanie i typ MIME.
Oto przykładowy precyzyjny link zawierający identyfikator URI, działanie i typ MIME:
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
tools:layout="@layout/a">
<deepLink app:uri="www.example.com"
app:action="android.intent.action.MY_ACTION"
app:mimeType="type/subtype"/>
</fragment>
Za pomocą Edytora nawigacji możesz też utworzyć do ukrytego miejsca docelowego domyślny precyzyjny link w ten sposób:
- Na karcie Projekt w Edytorze nawigacji wybierz miejsce docelowe precyzyjnego linku.
- W sekcji Linki dogłębne w panelu Atrybuty kliknij +.
W wyświetlonym oknie Dodaj precyzyjny link wpisz informacje o precyzyjnym linku.
Uwaga:
- Identyfikatory URI bez schematu są uznawane za identyfikatory http lub https. Na przykład
www.google.com
pasuje dohttp://www.google.com
ihttps://www.google.com
. - Zakładki parametrów ścieżki w postaci
{placeholder_name}
pasują do co najmniej 1 znaku. Na przykładhttp://www.example.com/users/{id}
pasuje dohttp://www.example.com/users/4
. Komponent Nawigacja próbuje przeanalizować wartości zastępcze i przypisać je do odpowiednich typów, dopasowując nazwy zastępcze do zdefiniowanych argumentów, które są zdefiniowane dla miejsca docelowego precyzyjnego linku. Jeśli nie zdefiniowano żadnego argumentu o tym samym imieniu, do wartości argumentu zostanie użyty domyślny typString
. Za pomocą symbolu wieloznacznego „.” możesz dopasować 0 lub więcej znaków. - Zakładki parametrów zapytania można używać zamiast parametrów ścieżki lub razem z nimi. Na przykład:
http://www.example.com/users/{id}?myarg={myarg}
pasuje dohttp://www.example.com/users/4?myarg=28
. - Zakładki parametrów zapytań dla zmiennych zdefiniowanych za pomocą wartości domyślnych lub wartości dozwolonych niewymagają dopasowania. Na przykład
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
pasuje dohttp://www.example.com/users/4?arg2=28
lubhttp://www.example.com/users/4?arg1=7
. Nie dotyczy to parametrów ścieżek. Na przykładhttp://www.example.com/users?arg1=7&arg2=28
nie pasuje do powyższego wzoru, ponieważ nie podano wymaganego parametru ścieżki. - Nieistotne parametry zapytania nie wpływają na dopasowywanie identyfikatorów URI precyzyjnych linków. Na przykład
http://www.example.com/users/{id}
pasuje dohttp://www.example.com/users/4?extraneousParam=7
, mimo żeextraneousParam
nie jest zdefiniowana we wzorze URI.
- Identyfikatory URI bez schematu są uznawane za identyfikatory http lub https. Na przykład
(Opcjonalnie) Zaznacz Automatyczna weryfikacja, aby wymagać od Google potwierdzenia, że jesteś właścicielem adresu URI. Więcej informacji znajdziesz w artykule Weryfikowanie linków aplikacji na Androida.
Kliknij Dodaj. Nad wybranym miejscem docelowym pojawi się ikona linka , aby wskazać, że to miejsce ma link głęboki.
Kliknij kartę Kod, aby przełączyć się na widok kodu XML. Do miejsca docelowego został dodany zagnieżdżony element
<deepLink>
:<deepLink app:uri="https://www.google.com" />
Aby włączyć niejawne precyzyjne linki, musisz też dodać dodatki do pliku manifest.xml
aplikacji. Dodaj pojedynczy element <nav-graph>
do aktywności, która wskazuje na istniejący graf nawigacyjny, jak w tym przykładzie:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application ... > <activity name=".MainActivity" ...> ... <nav-graph android:value="@navigation/nav_graph" /> ... </activity> </application> </manifest>
Podczas tworzenia projektu komponent Nawigacja zastępuje element <nav-graph>
wygenerowanymi elementami <intent-filter>
, aby pasowały do wszystkich precyzyjnych linków w grafie nawigacji.
Gdy aktywujesz niejawny precyzyjny link, stan stosu wstecznego zależy od tego, czy niejawna Intent
została uruchomiona z flagą Intent.FLAG_ACTIVITY_NEW_TASK
:
- Jeśli flaga jest ustawiona, stos zadań do cofnięcia jest czyszczony i zastępowany miejscem docelowym linku głębokiego. Podobnie jak w przypadku wyraźnych precyzyjnych linków, podczas zagnieżdżania wykresów do stosu jest też dodawane miejsce docelowe początkowe z każdego poziomu zagnieżdżenia, czyli miejsce docelowe początkowe z każdego elementu
<navigation>
w hierarchii. Oznacza to, że gdy użytkownik naciśnie przycisk Wstecz w miejscu docelowym precyzyjnego linku, wróci do poprzedniego poziomu nawigacji tak, jakby wszedł do aplikacji od jej punktu wejścia. - Jeśli flaga nie jest ustawiona, pozostaniesz w grupie zadań poprzedniej aplikacji, w której został wywołany domyślny precyzyjny link. W takim przypadku przycisk Wstecz wróci do poprzedniej aplikacji, a przycisk w górę uruchamia zadanie aplikacji w hierarchicznym nadrzędnym miejscu docelowym na wykresie nawigacyjnym.
Obsługa precyzyjnych linków
Zdecydowanie zalecamy, aby podczas korzystania z Nawigacji zawsze używać domyślnej wartości launchMode
standard
. Gdy używasz trybu uruchamiania standard
, Nawigacja automatycznie obsługuje precyzyjne linki, wywołując handleDeepLink()
w celu przetworzenia wszelkich jawnych lub niejawnych precyzyjnych linków w Intent
. Nie dzieje się tak jednak, jeśli Activity
jest ponownie używany przy użyciu alternatywnego launchMode
, takiego jak singleTop
. W takim przypadku musisz ręcznie wywołać funkcję handleDeepLink()
w funkcji onNewIntent()
, jak pokazano w tym przykładzie:
Kotlin
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) navController.handleDeepLink(intent) }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); navController.handleDeepLink(intent); }
Dodatkowe materiały
Więcej informacji o nawigacji znajdziesz w tych materiałach.