ב-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>
אפשר גם להשתמש ב'עורך הניווט' כדי ליצור קישור עומק מרומז אל היעד:
- בכרטיסייה עיצוב בעורך הניווט, בוחרים את היעד של על קישור העומק.
- לוחצים על + בקטע קישורי עומק בחלונית מאפיינים.
בתיבת הדו-שיח הוספת קישור עומק שמופיעה, מזינים את המידע קישור עומק.
שימו לב:
- מזהי 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.
- מזהי URI ללא סכימה נחשבים ל-http או ל-https. לדוגמה,
(אופציונלי) מסמנים את האפשרות אימות אוטומטי כדי לדרוש מ-Google לאמת את הזהות שלכם. הבעלים של ה-URI. מידע נוסף זמין במאמר הבא: לאמת קישורים לאפליקציות ל-Android.
לוחצים על הוספה. סמל של קישור מופיעה מעל היעד שנבחר כדי לציין שליעד יש קישור עומק.
לוחצים על הכרטיסייה 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); }
מקורות מידע נוספים
אפשר להיעזר במקורות המידע הבאים כדי לקבל מידע נוסף על הניווט.