إذا كان بإمكان تطبيقك تنفيذ إجراء قد يكون مفيدًا لتطبيق آخر، وإعداده للاستجابة لطلبات الإجراءات من خلال تحديد فلتر الأهداف المناسب في نشاطك.
على سبيل المثال، إذا
إنشاء تطبيق اجتماعي يمكنه مشاركة الرسائل أو الصور مع أصدقاء المستخدم،
تدعم هدف ACTION_SEND
.
بعد ذلك، عندما يبدأ المستخدمون "مشاركة" إجراء من تطبيق آخر، سيظهر تطبيقك كخيار في
مربّع حوار أداة الاختيار (المعروف أيضًا باسم مربّع حوار التوضيح)، كما هو موضّح في الشكل 1.
![](https://developer.android.com/static/images/training/basics/intent-chooser.png?authuser=19&hl=ar)
الشكل 1. مربع حوار أداة الاختيار.
للسماح للتطبيقات الأخرى ببدء نشاطك بهذه الطريقة، يجب إضافة <intent-filter>
.
العنصر في ملف البيان للعنصر <activity>
المقابل.
عند تثبيت تطبيقك على جهاز، يحدّد النظام هدفك.
تصفيات وتضيف المعلومات إلى قائمة داخلية تتضمّن الأهداف التي تدعمها جميع التطبيقات المثبّتة.
عند اتصال أحد التطبيقات بـ startActivity()
أو startActivityForResult()
بنية ضمنية، يتحقق النظام من الأنشطة التي يمكنها الاستجابة
والنية.
إضافة فلتر أهداف
لتحديد الأهداف التي يمكن أن يعالجها نشاطك بشكلٍ صحيح، اجعل كل فلتر أهداف تضيفه محدّدة قدر الإمكان من حيث نوع الإجراء والبيانات التي يشملها النشاط المستخدم.
قد يرسل النظام رمز Intent
محدّدًا إلى نشاط معيّن إذا كان هذا النشاط يتضمّن
فلتر أهداف يستوفي المعايير التالية للعنصر Intent
:
- الإجراء
- سلسلة تسمية الإجراء المطلوب تنفيذه. عادةً ما تكون إحدى القيم المحددة للنظام الأساسي، مثل
باسم
ACTION_SEND
أوACTION_VIEW
.حدِّد هذا الخيار في فلتر الأهداف باستخدام العنصر
<action>
. يجب أن تكون القيمة التي تحددها في هذا العنصر هي اسم السلسلة الكامل للإجراء، بدلاً من قيمة ثابتة لواجهة برمجة التطبيقات، كما هو موضّح في الأمثلة في هذه الصفحة. - البيانات
- وصف البيانات المرتبطة بالهدف.
حدِّد هذا الخيار في فلتر الأهداف باستخدام العنصر
<data>
. استخدام واحد أو أكثر من التصنيفات في هذا العنصر، يمكنك تحديد نوع MIME أو بادئة معرف موارد منتظم (URI) نظام URI، أو مجموعة من هذه المخططات وغيرها مما يشير إلى نوع البيانات مقبول.ملاحظة: إذا لم تكن بحاجة إلى تقديم تفاصيل خاصة بشأن البيانات
Uri
، على سبيل المثال، عند معالجة نشاطك من نوع آخر من النوع "الإضافي" حدد السمةandroid:mimeType
فقط لتعريف نوع البيانات التي يعالجها نشاطك، مثلtext/plain
أوimage/jpeg
- الفئة
- توفِّر طريقة إضافية لوصف النشاط الذي يعالج الهدف، والذي يرتبط عادةً
إلى إيماءة المستخدم أو الموقع الذي بدأ منه. هناك العديد من الفئات المختلفة
من قبل النظام، ولكن نادرًا ما يتم استخدام معظمها. ومع ذلك، يتم تحديد جميع الأهداف الضمنية من خلال
CATEGORY_DEFAULT
تلقائيًا.حدِّد هذا الخيار في فلتر الأهداف باستخدام
<category>
. العنصر.
في فلتر الأهداف، يمكنك توضيح المعايير التي يقبلها نشاطك
من خلال تعريف كل منها بعناصر XML مقابلة مضمّنة في <intent-filter>
العنصر.
على سبيل المثال، في ما يلي نشاط يتضمّن فلتر أهداف يعالج الغرض ACTION_SEND
من البيانات عندما يكون نوع البيانات نصًا أو صورة:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
ملاحظة: إذا أردت أن يكون الرمز في مربّع حوار أداة الاختيار مختلفًا.
من الرمز التلقائي لنشاطك، أضِف android:icon
في <intent-filter>
.
العنصر.
تحدِّد كل غرض وارد إجراء واحد فقط ونوع بيانات واحد، ولكن يمكن تعريف عدّة أهداف
أمثلة على العناصر <action>
و<category>
و<data>
في كل
<intent-filter>
.
إذا كان هناك أي زوجين من الإجراءات والبيانات متنافيان في سلوكياتهم، وإنشاء فلاتر أهداف منفصلة لتحديد الإجراءات المقبولة عند إقرانها بأنواع البيانات.
على سبيل المثال، لنفترض أنّ نشاطك يتعامل مع النصوص والصور لكلٍّ من الهدفَين ACTION_SEND
وACTION_SENDTO
. في هذه الحالة، يجب عليك تحديد اثنين
فلاتر الأهداف للإجراءين، لأنّ الغرض ACTION_SENDTO
يجب أن يستخدم البيانات Uri
لتحديد
عنوان المُستلِم باستخدام نظام معرّف الموارد المنتظم (URI) send
أو sendto
. يظهر ذلك في المثال التالي:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
ملاحظة: لتلقّي أغراض ضمنية، يجب تضمين
الفئة CATEGORY_DEFAULT
في فلتر الأهداف. تتعامل الطريقتان startActivity()
وstartActivityForResult()
مع كل الأهداف كما لو كانت.
تم الإعلان عن الفئة CATEGORY_DEFAULT
. في حال عدم الإفصاح عن ذلك
في فلتر الأهداف، لا يتم حلّ أي نوايا ضمنية في نشاطك.
لمزيد من المعلومات حول إرسال وتلقّي "ACTION_SEND
"
الأغراض التي تنفّذ سلوكيات المشاركة على شبكات التواصل الاجتماعي، راجِع تلقّي بيانات بسيطة من تطبيقات أخرى.
يمكنك أيضًا العثور على معلومات مفيدة حول مشاركة البيانات في
مشاركة البيانات البسيطة
مشاركة الملفات
تلبية المقصد من النشاط
لتحديد الإجراء الذي يجب اتخاذه في نشاطك، اقرأ
Intent
الذي يتم استخدامه لتشغيله.
عند بدء نشاطك، اتّصِل بالرقم getIntent()
لاسترداد
Intent
الذي بدأ النشاط. يمكنك إجراء ذلك في أي وقت أثناء
دورة حياة النشاط، ولكنك تفعل ذلك بشكل عام أثناء عمليات معاودة الاتصال المبكرة، مثل
onCreate()
أو onStart()
يظهر ذلك في المثال التالي:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
عرض نتيجة
إذا أردت عرض نتيجة إلى النشاط الذي استدعِ نشاطك، اتّصِل بـ setResult()
لتحديد رمز النتيجة والنتيجة Intent
. عند إتمام العملية وعودة المستخدم إلى الإعدادات الأصلية
النشاط، اتصِل بـ finish()
من أجل
نشاطك وتدميره. يظهر ذلك في المثال التالي:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
يجب عليك دائمًا تحديد رمز نتيجة مع النتيجة. بشكل عام، تكون إما RESULT_OK
أو RESULT_CANCELED
. يمكنك بعد ذلك
وتوفير بيانات إضافية مع Intent
، حسب الضرورة.
ملاحظة: يتم ضبط النتيجة على
RESULT_CANCELED
بشكل افتراضي. لذلك، إذا نقر المستخدم على زر الرجوع
قبل إكمال الإجراء وقبل تعيين النتيجة، يتلقى النشاط الأصلي
"تم الإلغاء" نتيجته.
إذا كنت تحتاج ببساطة إلى عرض عدد صحيح يشير إلى أحد خيارات النتائج العديدة، فيمكنك تعيين
رمز النتيجة إلى أي قيمة أكبر من 0. إذا استخدمت رمز النتيجة لتقديم عدد صحيح
لا يحتاجون إلى تضمين Intent
،
يمكنك الاتصال بـ setResult()
وتمرير رمز نتيجة فقط:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
في هذه الحالة، قد لا يكون هناك سوى عدد قليل من النتائج المحتملة، لذا فإن رمز النتيجة عدد صحيح محدد (أكبر من 0). تعمل هذه الميزة بشكل جيد عند عرض نتيجة إلى نشاط في تطبيقك، لأنّ النشاط الذي يتلقّى النتيجة يمكن أن يشير إلى الجمهور ثابت لتحديد قيمة رمز النتيجة.
ملاحظة: لا داعي للتحقّق ممّا إذا كان قد بدأ نشاطك.
مع startActivity()
أو startActivityForResult()
. ما عليك سوى الاتصال بالرقم setResult()
إذا كان الغرض من ذلك هو بدء نشاطك.
نتيجة لذلك. إذا كان النشاط الناشئ المسمى startActivityForResult()
، يعرضه النظام
النتيجة التي تقدّمها إلى "setResult()
" وإلا، فسيتم تجاهل النتيجة.