יצירת קישור עומק ליעד

ב-Android, קישור עומק הוא קישור שמעביר אותך ישירות יעד בתוך אפליקציה.

רכיב הניווט מאפשר לך ליצור שני סוגים שונים של קישורי עומק: expitit ו-Implicit.

יצירה של קישור עומק מפורש

קישור עומק מפורש הוא מופע יחיד של קישור עומק שנעשה בו שימוש בPendingIntent כדי להעביר משתמשים למיקום ספציפי בתוך האפליקציה. יכול להיות שיוצג קישור עומק מפורש כחלק מהתראה או ווידג'ט של אפליקציה, למשל.

כשמשתמש פותח את האפליקציה שלך באמצעות קישור עומק מפורש, מקבץ המשימות לאחור נמחקו והוחלפו ביעד של קישור העומק. מתי תרשימי קינון, יעד ההתחלה מכל רמה של סידור פנימי – כלומר יעד ההתחלה מכל רכיב <navigation> בהיררכיה, הוא גם מתווסף למקבץ. המשמעות היא שכאשר משתמש לוחץ על לחצן 'הקודם' מקישור עומק היעד, הם חוזרים בחזרה בערימת הניווט ממש כאילו הם נכנס לאפליקציה מנקודת הכניסה שלה.

אפשר להשתמש בNavDeepLinkBuilder של הכיתה כדי ליצור PendingIntent, כפי שאפשר לראות בדוגמה הבאה. שימו לב שאם ההקשר שצוין אינו Activity, ה-constructor משתמש PackageManager.getLaunchIntentForPackage() כפעילות ברירת המחדל להשקה, אם היא זמינה.

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();

כברירת מחדל, NavDeepLinkBuilder מפעיל את קישור העומק המפורש אל הפעלת ברירת המחדל Activity, שמוצהרת במניפסט של האפליקציה. אם המיקום המכשיר NavHost נמצא בפעילות אחרת. עליך לציין את הרכיב שלו שם כשיוצרים את הכלי ליצירת קישורי עומק:

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();

אם יש לכם ComponentName, תוכלו להעביר אותו ישירות ל-builder:

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();

אם יש לכם NavController קיים, אפשר גם ליצור קישור עומק באמצעות NavController.createDeepLink()

יצירה של קישור עומק מרומז

קישור עומק מרומז מתייחס יעד ספציפי באפליקציה. כשמפעילים קישור עומק, לדוגמה, כשמשתמש לוחץ על קישור – מערכת Android יכולה לפתוח את האפליקציה היעד.

אפשר להתאים קישורי עומק לפי URI, פעולות Intent וסוגי MIME. אפשר לציין כמה סוגי התאמה לקישור עומק יחיד, אבל חשוב לזכור ש-URI התאמה לארגומנטים מקבלת עדיפות קודם, אחריה פעולה ואז MIME מהסוג הזה.

הנה דוגמה לקישור עומק שמכיל URI, פעולה וסוג 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>

אפשר גם להשתמש ב'עורך הניווט' כדי ליצור קישור עומק מרומז אל היעד:

  1. בכרטיסייה עיצוב בעורך הניווט, בוחרים את היעד של על קישור העומק.
  2. לוחצים על + בקטע קישורי עומק בחלונית מאפיינים.
  3. בתיבת הדו-שיח הוספת קישור עומק שמופיעה, מזינים את המידע קישור עומק.

    שימו לב:

    • מזהי URI ללא סכימה נחשבים ל-http או ל-https. לדוגמה, www.google.com תואם גם ל-http://www.google.com וגם https://www.google.com.
    • placeholders של פרמטרים של נתיבים בצורת {placeholder_name} תואמים לאחד או יותר תווים. לדוגמה, http://www.example.com/users/{id} תואם את http://www.example.com/users/4. רכיב הניווט מנסה לנתח את ערכי ה-placeholder לסוגים מתאימים באמצעות התאמה ל-placeholder שמות לארגומנטים המוגדרים שהם מוגדרים ליעד של קישור העומק. אם אין ארגומנט עם אותו שם הוגדר, סוג ברירת המחדל של String משמש לארגומנט עם ערך מסוים. אפשר להשתמש בתו הכללי לחיפוש *. כדי לציין התאמה ל-0 תווים או יותר.
    • אפשר להשתמש ב-placeholders של פרמטרים של שאילתות במקום או בשילוב עם בפרמטרים של הנתיב. לדוגמה, http://www.example.com/users/{id}?myarg={myarg} התאמות http://www.example.com/users/4?myarg=28.
    • placeholders של פרמטרים של שאילתות למשתנים שהוגדרו כברירת מחדל, או ערכים יכולים להיות null לא חייבים להתאים. לדוגמה, http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} התאמות http://www.example.com/users/4?arg2=28 או http://www.example.com/users/4?arg1=7. זה לא המצב כשמשתמשים בנתיב . לדוגמה, http://www.example.com/users?arg1=7&arg2=28. לא תואם לדפוס שלמעלה מכיוון שפרמטר הנתיב הנדרש לא סופק.
    • פרמטרים מיותרים של שאילתות לא משפיעים על התאמה של URI של קישור עומק. עבור לדוגמה, http://www.example.com/users/{id} תואם את http://www.example.com/users/4?extraneousParam=7, על אף extraneousParam אינו מוגדר בתבנית ה-URI.
  4. (אופציונלי) מסמנים את האפשרות אימות אוטומטי כדי לדרוש מ-Google לאמת את הזהות שלכם. הבעלים של ה-URI. מידע נוסף זמין במאמר הבא: לאמת קישורים לאפליקציות ל-Android.

  5. לוחצים על הוספה. סמל של קישור מופיעה מעל היעד שנבחר כדי לציין שליעד יש קישור עומק.

  6. לוחצים על הכרטיסייה Code כדי לעבור לתצוגת XML. <deepLink> בתוך רכיב הרכיב נוסף ליעד:

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

כדי להפעיל קישורי עומק מרומזים, צריך גם להוסיף תוספות קובץ manifest.xml. להוסיף רכיב <nav-graph> יחיד לפעילות ש שמצביע על תרשים ניווט קיים, כמו בדוגמה הבאה:

<?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>

כשיוצרים את הפרויקט, רכיב הניווט מחליף את <nav-graph> רכיב עם רכיבי <intent-filter> שנוצרו כדי להתאים לכל קישורי העומק בתרשים הניווט.

כשמפעילים קישור עומק מרומז, מצב הערימה האחורית תלוי האם Intent המשתמע הופעל באמצעות Intent.FLAG_ACTIVITY_NEW_TASK דגל:

  • אם הדגל מוגדר, המקבץ הקודם של המשימה נמחק ומוחלף יעד של קישור עומק. כמו בקישורי עומק מפורשים, תרשימי עץ, יעד ההתחלה מכל רמה של סידור — כלומר, התחלת יעד מכל רכיב <navigation> בהיררכיה — מתווסף גם אל את הערימה. המשמעות היא שכאשר משתמש לוחץ על הלחצן 'הקודם' בדף יעד של קישור, הם מנווטים חזרה למעלה במקבץ הניווט ממש כאילו הם הם נכנסו לאפליקציה מנקודת הכניסה שלה.
  • אם הדגל לא מוגדר, תישארו במקבץ המשימות של האפליקציה הקודמת שבו הופעל קישור העומק המרומז. במקרה כזה, הלחצן 'הקודם' חזרה לאפליקציה הקודמת, בזמן שהלחצן 'למעלה' מפעיל את המשימה של האפליקציה ביעד ההורה ההיררכי בתרשים הניווט.

טיפול בקישורי עומק

מומלץ מאוד להשתמש תמיד בברירת המחדל launchMode מתוך standard כשמשתמשים בניווט. כשמשתמשים במצב ההפעלה של standard, הניווט תטפל אוטומטית בקישורי עומק באמצעות קריאה handleDeepLink() כדי לעבד קישורי עומק מפורשים או מרומזים בתוך Intent. אבל, לפעמים זה לא קורה באופן אוטומטי אם נעשה שימוש חוזר ב-Activity בזמן השימוש launchMode חלופי כמו singleTop. במקרה כזה, יש צורך לביצוע קריאה ידנית אל handleDeepLink() ב-onNewIntent(), כמו שמוצג בדוגמה הבאה:

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);
}

מקורות מידע נוספים

אפשר להיעזר במקורות המידע הבאים כדי לקבל מידע נוסף על הניווט.

דוגמיות

שיעורי Lab

סרטונים