Tworzenie precyzyjnego linku dla miejsca docelowego

Na Androidzie precyzyjny link to link, który prowadzi bezpośrednio do miejsce docelowe w aplikacji.

Komponent Nawigacja umożliwia tworzenie 2 różnych typów precyzyjnych linków: jawne i domyślnie.

Tworzenie wyraźnego precyzyjnego linku

Precyzyjny link to pojedyncze wystąpienie precyzyjnego linku z końcówką PendingIntent kierować użytkowników do określonego miejsca w aplikacji. Możesz zobaczyć w formie konkretnego precyzyjnego linku w powiadomieniu lub w widżecie aplikacji, na przykład.

Gdy użytkownik otworzy aplikację za pomocą wyraźnego precyzyjnego linku, zwrotny stos zadań został usunięty i zastąpiony miejscem docelowym precyzyjnego linku. Kiedy zagnieżdżania wykresów, miejsce docelowe początkowe z każdego poziomu zagnieżdżenia, czyli miejsca początkowego, z każdego elementu <navigation> w hierarchii, jest również dodawany do stosu. Oznacza to, że gdy użytkownik naciśnie przycisk Wstecz w precyzyjnym linku miejsca docelowe, przechodzą z powrotem w górę stosu nawigacji tak, jakby od miejsca wejścia do aplikacji.

NavDeepLinkBuilder do utworzenia PendingIntent, jak widać w przykładzie poniżej. Pamiętaj, że jeśli podany kontekst nie jest Activity, konstruktor używa PackageManager.getLaunchIntentForPackage(). jako domyślne działanie do uruchomienia, jeśli jest dostępne.

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 Twój bezpośredni precyzyjny link w witrynie domyślne uruchomienie (Activity) zadeklarowane w pliku manifestu aplikacji. Jeśli NavHost jest częścią innej aktywności, musisz określić jej komponent w kreatorze precyzyjnych linków:

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ć ją 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ż konto NavController, możesz też utworzyć precyzyjny link, używając NavController.createDeepLink()

Tworzenie niejawnego precyzyjnego linku

Precyzyjny link oznacza konkretne miejsce docelowe w aplikacji. Po wywołaniu precyzyjnego linku, np. gdy użytkownik kliknie link – Android może otworzyć Twoją aplikację na odpowiedniej miejsce docelowe.

Precyzyjne linki można dopasowywać według identyfikatora URI, działań intencji i typów MIME. Dostępne opcje określić wiele typów dopasowania dla jednego precyzyjnego linku. Pamiętaj jednak, że identyfikator URI dopasowywanie argumentów jest w pierwszej kolejności, po nich następuje działanie, a na końcu MIME typu.

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 utworzyć niejawny precyzyjny link do miejsce docelowe w następujący sposób:

  1. Na karcie Design (Projekt) w edytorze nawigacji wybierz miejsce docelowe dla precyzyjny link.
  2. Kliknij + w sekcji Precyzyjne linki w panelu Atrybuty.
  3. W wyświetlonym oknie Dodaj precyzyjny link wpisz informacje o precyzyjny link.

    Uwaga:

    • Identyfikatory URI bez schematu są przyjmowane jako http lub https. Przykład: www.google.com pasuje zarówno do http://www.google.com, jak i do https://www.google.com
    • Zmienne parametrów ścieżki w formacie {placeholder_name} pasują do co najmniej jednego znaków. np. http://www.example.com/users/{id} wskazuje dopasowanie do http://www.example.com/users/4 Komponent Nawigacja próbuje przeanalizuje wartości zmiennych do odpowiednich typów, dopasowując obiekt zastępczy nazwy zdefiniowanych argumentów zdefiniowanych dla miejsca docelowego precyzyjnego linku. Jeśli nie ma argumentu z ta sama nazwa jest zdefiniowana, dla argumentu używany jest domyślny typ String . Za pomocą symbolu .* możesz dopasować 0 lub więcej znaków.
    • Obiekty zastępcze parametrów zapytania można stosować zamiast nich lub w połączeniu z parametrów ścieżki. Przykład: Dopasowania: http://www.example.com/users/{id}?myarg={myarg} http://www.example.com/users/4?myarg=28
    • Zmienne parametrów zapytania dla zmiennych zdefiniowanych jako domyślne lub Wartości dopuszczone do wartości null nie muszą być zgodne. Przykład: Dopasowania: http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} http://www.example.com/users/4?arg2=28 lub http://www.example.com/users/4?arg1=7 Nie dotyczy to ścieżki . Na przykład: http://www.example.com/users?arg1=7&arg2=28 nie pasuje do powyższego wzorca, ponieważ wymagany parametr ścieżki to nie podano.
    • Zbędne parametry zapytania nie mają wpływu na dopasowywanie identyfikatora URI precyzyjnego linku. Dla: przykład, http://www.example.com/users/{id} wskazuje dopasowanie do http://www.example.com/users/4?extraneousParam=7, mimo że Element extraneousParam nie jest zdefiniowany we wzorcu identyfikatora URI.
  4. (Opcjonalnie) Zaznacz Automatyczna weryfikacja, aby wymagać od Google weryfikacji Twojej tożsamości właściciela identyfikatora URI. Więcej informacji: Weryfikowanie linków aplikacji na Androida

  5. Kliknij Dodaj. Ikona linku nad wybranym miejscem docelowym, aby wskazać, że precyzyjny link.

  6. Kliknij kartę Kod, aby przełączyć się na widok XML. Zagnieżdżony typ <deepLink> do miejsca docelowego dodano element:

    <deepLink app:uri="https://www.google.com" />
    

Aby włączyć niejawne precyzyjne linki, musisz dodać też do funkcji manifest.xml. Dodaj pojedynczy element <nav-graph> do aktywności, która wskazuje istniejący wykres 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 komponent <nav-graph> element z wygenerowanymi elementami <intent-filter>, które pasują do wszystkich precyzyjnych linków na wykresie nawigacyjnym.

Gdy aktywujesz niejawny precyzyjny link, stan stosu wstecznego zależy od tego, czy niejawna Intent została uruchomiona z Intent.FLAG_ACTIVITY_NEW_TASK. flaga:

  • Jeśli flaga jest ustawiona, wsteczny stos zadań jest wyczyszczony i zastępowany miejsce docelowe precyzyjnego linku. Podobnie jak w przypadku precyzyjnych linków, gdy zagnieżdżanie wykresów, miejsce docelowe początkowe z każdego poziomu zagnieżdżenia, czyli punktu początkowego miejsce docelowe z każdego elementu <navigation> w hierarchii – jest również dodawane do stosunkowo dobrze. Oznacza to, że gdy użytkownik naciśnie przycisk Wstecz na głębokim na stronie docelowej linku, przechodzą z powrotem w górę stosu nawigacji, tak jak chociażby do aplikacji.
  • Jeśli flaga nie jest ustawiona, pozostajesz przy stosie zadań poprzedniej aplikacji. w którym został aktywowany niejawny precyzyjny link. W tym przypadku przycisk Wstecz Powrót do poprzedniej aplikacji, a przycisk w górę rozpoczyna działanie aplikacji w hierarchicznym miejscu docelowym na wykresie nawigacyjnym.

Obsługa precyzyjnych linków

Zdecydowanie zalecamy używanie wartości domyślnej launchMode z standard podczas korzystania z Nawigacji. W przypadku korzystania z trybu uruchamiania aplikacji standard Nawigacja automatycznie obsługuje precyzyjne linki, wywołując handleDeepLink(). do przetwarzania wszelkich jawnych lub pośrednich precyzyjnych linków w Intent. Pamiętaj jednak: nie dzieje się to automatycznie, jeśli Activity jest używany ponownie podczas korzystania alternatywny element launchMode, np. singleTop. W tym przypadku konieczne jest ręcznie wywołać handleDeepLink() w onNewIntent(), jak pokazano w następujący przykład:

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.

Próbki

Ćwiczenia z programowania

Filmy