مثلما يمكن للتطبيق إرسال بيانات إلى تطبيقات أخرى، يمكنه أيضًا تلقي بيانات من التطبيقات أيضًا. فكر في كيفية تفاعل المستخدمين مع تطبيقك ونوع البيانات التي تريد تلقيها من التطبيقات الأخرى. على سبيل المثال، قد يكون تطبيق الشبكات الاجتماعية مهتمًا بتلقّي محتوى نصي، مثل عنوان URL لصفحة ويب مثير للاهتمام، من تطبيق آخر.
يرسل مستخدمو التطبيقات الأخرى البيانات بشكل متكرر إلى تطبيقك من خلال Android "قائمة مشاركة البيانات" أو أداة حلّ الأهداف على التطبيقات التي ترسل البيانات إلى تطبيقك ضبط نوع ملف MIME لهذه البيانات. يمكن لتطبيقك تلقّي البيانات المُرسَلة من تطبيق آخر في الطرق التالية:
Activity
يتضمّن علامةintent-filter
مطابقة في البيان- مشاركة الاختصارات التي ينشرها تطبيقك
أهداف "المشاركة المباشرة" هي روابط لصفحات في نشاط معيّن داخل تطبيقك. وغالبًا ما تمثّل هذه الشخصيات شخصًا أو مجموعة، وتعرضها "قائمة مشاركة البيانات من Android". على سبيل المثال، يمكن أن يوفّر تطبيق المراسلة هدف "المشاركة المباشرة" للشخص الذي روابط لمواضع معينة مباشرة في محادثة مع هذا الشخص. عرض تقديم أهداف المشاركة المباشرة للحصول على تفاصيل على التعليمات
إتاحة أنواع MIME
من الأفضل أن يكون التطبيق قادرًا على تلقّي أكبر نطاق ممكن من أنواع MIME.
على سبيل المثال، تطبيق مراسلة مصمم لإرسال النصوص والصور ومقاطع الفيديو
يُفضَّل تلقّي كل من text/*
وimage/*
وvideo/*
. إليك بعض الأمثلة
أنواع MIME الشائعة لإرسال البيانات البسيطة واستلامها في نظام Android.
اشتراك المستلمين في | يرسل المرسلون |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
امتدادات الملفات المتوافقة | application/pdf |
يُرجى الرجوع إلى قاعدة بيانات المسجّلين الرسمية التابعة لـ IANA (المنظمة المعنية بأرقام الإنترنت المخصصة) لأنواع وسائط MIME.
اختيار أهداف مشاركة رائعة
عندما ينقر المستخدم على هدف مشاركة مرتبط بنشاط معيّن، يجب أن يكون قادرًا على تأكيد المحتوى المشترك وتعديله قبل استخدامه. وهذا مهم بشكل خاص بالنسبة إلى البيانات النصية.
تلقّي البيانات باستخدام نشاط
يتضمن تلقي البيانات باستخدام نشاط تحديث البيان والتعامل مع المحتوى الوارد والتأكّد من أنّ المستخدم يتعرّف على تطبيقك.
تعديل البيان
تُعلم فلاتر الأهداف النظام بالعناصر التي يقبلها مكوِّن التطبيق.
على غرار الطريقة التي أنشأت بها نية باستخدام إجراء ACTION_SEND
في درس
إرسال بيانات بسيطة إلى تطبيقات أخرى
، يمكنك إنشاء فلاتر للنيّات لتلقّي النّيّات باستخدام هذا الإجراء. إِنْتَ
حدِّد فلتر أهداف في ملف البيان باستخدام العنصر <intent-filter>
.
على سبيل المثال، إذا كان تطبيقك يعالج تلقّي محتوى نصي، يجب تقديم بيان
يتضمن صورة واحدة أو أكثر من أي نوع يشبه المقتطف التالي:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
عندما يحاول تطبيق آخر مشاركة أيٍّ من هذه العناصر من خلال إنشاء
intent ونقله إلى startActivity()
، يتم إدراج تطبيقك
كخيار في "لوحة المشاركة" أو أداة حلّ intents في Android. إذا كان المستخدم
تطبيقك، سيؤدي هذا الإجراء إلى بدء النشاط ذي الصلة (.ui.MyActivity
في
المثال السابق). الأمر متروك لك لمعالجة المحتوى بشكل مناسب
داخل التعليمات البرمجية وواجهة المستخدم.
التعامل مع المحتوى الوارد
لمعالجة المحتوى الذي يقدّمه Intent
، يمكنك الاتصال بـ
getIntent()
للحصول على عنصر Intent
. بمجرد حصولك على الكائن،
يمكنك فحص محتوياتها لتحديد ما يجب فعله بعد ذلك. إذا كان هذا النشاط يمكنه
تبدأ من أجزاء أخرى من النظام (مثل المشغِّل)، خذ هذا
في الاعتبار عند فحص المقصد.
انتبه جيدًا للبيانات الواردة، فأنت لا تعرف أبدًا ما تطبيق يمكن أن يرسله إليك تطبيق. على سبيل المثال، قد يتم ضبط نوع MIME غير صحيح، أو قد يكون حجم الصورة المُرسَلة كبيرًا جدًا. تذكر أيضًا معالجة البيانات الثنائية في سلسلة محادثات منفصلة بدلاً من سلسلة التعليمات الرئيسية
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
يمكن أن يكون تحديث واجهة المستخدم بعد تلقي البيانات بسيطًا مثل تعبئة
EditText
، أو يمكن أن تكون أكثر
أمرًا معقدًا مثل تطبيق عامل تصفية صور شيق على صورة. الأمر يعود إلى
ما سيحدث بعد ذلك لتطبيقك.
التأكّد من أنّ المستخدمين يتعرّفون على تطبيقك
يتم تمثيل تطبيقك الرمز تصنيف في Android ورقة المشاركة وأداة حلّ الأهداف ويتم تحديد كلاهما في البيان. يمكنك ضبط تصنيفات فلاتر الأنشطة أو الأهداف لتقديم مزيد من السياق.
اعتبارًا من Android 10 (المستوى 29 من واجهة برمجة التطبيقات)، لا تستخدم "قائمة مشاركة البيانات" في Android إلا الرموز المحدَّدة في
البيان في العلامة application
. يتجاهل Android الرموز المُعدّة في علامتَي
intent-filter
وactivity
.