יצירת קישורי עומק לתוכן האפליקציה

כאשר קישור שלחצו עליו או בקשה פרוגרמטית מפעילים Intent URI של אינטרנט, מערכת Android מנסה כל אחת מהפעולות הבאות, בסדר רציף, עד שהבקשה מצליחה:

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

כדי ליצור קישורים לתוכן ולבדוק אותם צריך לפעול לפי השלבים הבאים. אפשר גם להשתמש להוספה של App Links ל-Assistant ב-Android Studio קישורים לאפליקציות ל-Android.

הערה: גרסה גנרית, החל מ-Android 12 (רמת API 31) אובייקט Intent באינטרנט מפנה לפעילות באפליקציה שלכם רק אם האפליקציה אושרה עבור הדומיין הספציפי שנכלל ב-Intent האינטרנט הזה. אם האפליקציה לא אושרה עבור הדומיין, ה-Intent באינטרנט מפנה לאפליקציית הדפדפן שהוגדרה כברירת מחדל של המשתמש במקום זאת.

הוספת מסנני Intent לקישורים נכנסים

כדי ליצור קישור לתוכן של האפליקציה, צריך להוסיף מסנן Intent מכיל את הרכיבים וערכי המאפיינים הבאים במניפסט:

<action>
יש לציין את פעולת ה-Intent ACTION_VIEW שניתן להגיע למסנן Intent מחיפוש Google.
<data>
אפשר להוסיף ערך אחד או יותר <data> תגים, שכל אחד מהם מייצג פורמט URI שמפנה לפעילות. לכל הפחות, התג <data> חייב לכלול android:scheme .

אפשר להוסיף עוד מאפיינים כדי לצמצם עוד יותר את סוג ה-URI שהפעילות מקבלת. עבור לדוגמה, ייתכן שיש כמה פעילויות שמקבלות מזהי URI דומים, אבל ההבדלים ביניהן פשוט על סמך שם הנתיב. במקרה כזה, משתמשים מאפיין android:path או את וריאציות pathPattern או pathPrefix שלו, כדי להבדיל הפעילות שהמערכת צריכה לפתוח עבור נתיבי URI שונים.

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

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

קטע הקוד הבא בפורמט XML מראה איך מציינים מסנן Intent במניפסט של קישורי עומק. מזהי ה-URI “example://gizmos” ו- שתיהן “http://www.example.com/gizmos” מסמנות את הפעילות הזו.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

חשוב לשים לב ששני מסנני Intent שונים רק ברכיב <data>. למרות שאפשר לכלול מספר רכיבי <data> באותו מסנן, חשוב ליצור מסננים נפרדים כאשר הכוונה שלכם היא לציין ערכים ייחודיים כתובות URL (למשל, שילוב ספציפי של scheme ו-host), כי מספר רכיבי <data> באותו מסנן Intent למעשה ממוזגים יחד כדי להביא בחשבון את כל הווריאציות של המאפיינים המשולבים. נניח, לדוגמה, את הדברים הבאים:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

יכול להיות שנראה שהדבר תומך רק ב-https://www.example.com וב- app://open.my.app. אבל הוא תומך בפועל בשני הרכיבים האלה, וגם באלה: app://www.example.com וגם https://open.my.app

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

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

מידע נוסף על הגדרה של מסנני Intent זמין מתן אישור לאפליקציות אחרות להתחיל את הפעילות שלכם.

קריאת נתונים מ-Intents נכנסים

אחרי שהמערכת מתחילה את הפעילות שלכם באמצעות מסנן Intent, אתם יכולים: להשתמש בנתונים שסופקו על ידי Intent כדי לקבוע מה צריך לעבד. שיחת טלפון getData() וגם getAction() לאחזור הנתונים הפעולה המשויכת ל-Intent הנכנס. אפשר להפעיל שיטות כאלה בכל שלב במחזור החיים של הפעילות, אבל בדרך כלל צריך לעשות זאת במהלך התקשרות חזרה מוקדמת, onCreate() או onStart().

הנה קטע קוד שמראה איך לאחזר נתונים Intent:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

כדי לשפר את חוויית המשתמש, כדאי לפעול לפי השיטות המומלצות הבאות:

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

בדיקה של קישורי העומק

אפשר להשתמש בכלי לניפוי באגים ב-Android גשר עם הכלי 'מנהל הפעילות' (am) כדי לבדוק שמסנן Intent מזהי ה-URI שציינתם לקישורי עומק מפנים לפעילות הנכונה באפליקציה. שלך יכולים להריץ את פקודת adb על מכשיר או על אמולטור.

התחביר הכללי לבדיקת URI של מסנן Intent עם adb הוא:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

לדוגמה, הפקודה הבאה מנסה להציג פעילות יעד באפליקציה משויך ל-URI שצוין.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

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

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