في نظام التشغيل Android، الرابط لصفحة في التطبيق هو رابط ينقلك مباشرةً إلى وجهة معيّنة داخل تطبيق.
يتيح لك مكوّن التنقّل إنشاء نوعَين مختلفَين من الروابط لصفحات في التطبيق: صريح وضمني.
إنشاء رابط صريح لصفحة في التطبيق
الرابط الصريح لصفحة في التطبيق هو مثيل واحد
لرابط لصفحة في التطبيق يستخدم رمز PendingIntent
لنقل المستخدمين إلى موقع معيّن في تطبيقك. يمكنك مثلاً عرض
رابط صريح لصفحة في التطبيق كجزء من إشعار أو تطبيق مصغّر.
عندما يفتح المستخدم تطبيقك من خلال رابط صريح لصفحة في التطبيق، تتم clearing إزالة تسلسل المهام للخلف واستبداله بوجهة الرابط لصفحة في التطبيق. عند
تداخل الرسوم البيانية، تتم أيضًا إضافة وجهة البدء من كل مستوى من التداخل، أي وجهة البدء
من كل عنصر <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 فتح تطبيقك للوصول إلى الوجهة المقابلة.
يمكن مطابقة الروابط لصفحات في التطبيق حسب عنوان URL وإجراءات الأهداف وأنواع MIME. يمكنك تحديد أنواع مطابقة متعددة لرابط لصفحة في التطبيق واحد، ولكن يُرجى العِلم أنّه يتم منح الأولوية لمطابقة ملف تعريف الارتباط أولاً، ثم الإجراء، ثم نوع MIME.
في ما يلي مثال على رابط لصفحة معيّنة يحتوي على معرّف موارد منتظم وإجراء ونوع 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>
يمكنك أيضًا استخدام "أداة التنقّل" لإنشاء رابط لصفحة في التطبيق ضمني إلى وجهة على النحو التالي:
- في علامة التبويب تصميم ضمن "محرر التنقّل"، اختَر الوجهة ل الرابط لصفحة في التطبيق.
- انقر على + في قسم الروابط لصفحات في التطبيق ضمن لوحة السمات.
في مربّع الحوار إضافة رابط لصفحة في التطبيق الذي يظهر، أدخِل معلومات رابطك لصفحة في التطبيق.
ملاحظات:
- يُفترض أنّ معرّفات الموارد المنتظمة التي لا تحتوي على مخطّط هي إما 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
مع النمط أعلاه لأنّه لم يتم تقديم مَعلمة المسار المطلوبة. - لا تؤثّر مَعلمات طلب البحث غير ذات الصلة في مطابقة معرّف الموارد المنتظم للرابط المؤدي لصفحة معيّنة. على سبيل المثال، يتطابق
http://www.example.com/users/{id}
معhttp://www.example.com/users/4?extraneousParam=7
، على الرغم من عدم تحديدextraneousParam
في نمط معرّف الموارد المنتظم.
- يُفترض أنّ معرّفات الموارد المنتظمة التي لا تحتوي على مخطّط هي إما http أو https. على سبيل المثال،
(اختياري) ضَع علامة في المربّع إثبات الملكية تلقائيًا لطلب Google التحقّق من أنّك مالك عنوان URL. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التحقّق من روابط تطبيقات Android.
انقر على إضافة. يظهر رمز رابط فوق الوجهة المحدّدة للإشارة إلى أنّ هذه الوجهة تحتوي على رابط لصفحة في التطبيق.
انقر على علامة التبويب الرمز للتبديل إلى عرض 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
، يعالج Navigation
الروابط لصفحات في التطبيق تلقائيًا من خلال استدعاء
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); }
مصادر إضافية
لمزيد من المعلومات عن التنقّل، يُرجى الاطّلاع على المراجع التالية.