إنشاء رابط لصفحة في التطبيق لوجهة

في نظام Android، الرابط لصفحة في التطبيق هو رابط ينقلك مباشرةً إلى صفحة المقصودة داخل التطبيق.

يتيح لك مكوِّن التنقل إنشاء نوعين مختلفين من الروابط لمواضع معيَّنة: صريحًا وضمنيًا.

إنشاء رابط صريح لصفحة في التطبيق

الرابط الفاضح لصفحة في التطبيق هو نسخة واحدة. من رابط لصفحة في التطبيق يستخدم PendingIntent لتوجيه المستخدمين إلى مكان محدد داخل تطبيقك. قد تعرض رابط صريح لصفحة في التطبيق كجزء من إشعار أو تطبيق مصغّر على سبيل المثال.

عندما يفتح أحد المستخدمين تطبيقك من خلال رابط صريح لصفحة في التطبيق، يتم استخدام حزمة مهام محوها واستبدالها بوجهة الرابط لصفحة في التطبيق. فعندما الرسوم البيانية المتداخلة، وجهة البداية من كل مستوى من مستويات التداخل - أي وجهة البداية من كل عنصر <navigation> في التدرج الهرمي، تتم إضافته أيضًا إلى الحزمة. هذا يعني أنه عندما يضغط المستخدم على الزر "رجوع" من رابط لموضع معيّن الوجهة، فإنهم يتنقلون إلى أعلى حزمة التنقل كما لو دخل إلى تطبيقك منذ نقطة دخوله.

يمكنك استخدام NavDeepLinkBuilder. لإنشاء PendingIntent، كما هو موضح في المثال أدناه. لاحظ أنه إذا لم يكن السياق المقدم Activity، تستخدم الدالة الإنشائية 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، يمكنك تمريره مباشرة إلى المنشئ:

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
    • تتطابق العناصر النائبة لمَعلمات المسار على شكل {placeholder_name} مع عنصر واحد أو أكثر. الأحرف. على سبيل المثال، http://www.example.com/users/{id} يطابق http://www.example.com/users/4 يحاول مكوِّن التنقل تحليل قيم العنصر النائب إلى أنواع مناسبة من خلال مطابقة العنصر النائب بأسماء للوسيطات المحددة التي يتم تحديدها لوجهة الرابط لموضع معيّن. إذا لم تكن هناك وسيطة مع تم تحديد الاسم نفسه، ويتم استخدام نوع String تلقائي للوسيطة. يمكنك استخدام حرف البدل .* لمطابقة 0 حرف أو أكثر.
    • ويمكن استخدام العناصر النائبة لمعاملات طلب البحث بدلاً من أو جنبًا إلى جنب مع مَعلمات المسارات. على سبيل المثال: http://www.example.com/users/{id}?myarg={myarg} مطابقة http://www.example.com/users/4?myarg=28
    • العناصر النائبة لمَعلمات طلب البحث للمتغيرات التي تم تحديدها باستخدام الإعداد التلقائي أو لا يلزم تطابق القيم القابلة للقيم. على سبيل المثال: 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. انقر على علامة التبويب الرمز للتبديل إلى عرض 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);
}

مصادر إضافية

لمعرفة المزيد من المعلومات حول التنقّل، يُرجى الاطّلاع على المراجع التالية.

نماذج

الدروس التطبيقية حول الترميز

الفيديوهات