كما يمكن لأحد التطبيقات إرسال بيانات إلى تطبيقات أخرى، يمكنه أيضًا تلقّي بيانات من تطبيقات أخرى. فكِّر في طريقة تفاعل المستخدمين مع تطبيقك وأنواع البيانات التي تريد تلقّيها من التطبيقات الأخرى. على سبيل المثال، قد يكون أحد تطبيقات الشبكات الاجتماعية مهتمًا بتلقّي محتوى نصي، مثل عنوان URL مثير للاهتمام على الويب، من تطبيق آخر.
يرسل مستخدمو التطبيقات الأخرى بشكل متكرر بيانات إلى تطبيقك من خلال قائمة مشاركة البيانات من Android أو أداة حلّ الأهداف. يجب أن تضبط التطبيقات التي ترسل بيانات إلى تطبيقك نوع MIME لتلك البيانات. يمكن لتطبيقك تلقّي البيانات التي يرسلها تطبيق آخر بالطرق التالية:
Activityيتضمّن علامةintent-filterمطابقة في البيان- اختصارات المشاركة التي ينشرها تطبيقك
تمثّل أهداف المشاركة المباشرة روابط عميقة تؤدي إلى `نشاط` معيّن في تطبيقك. وغالبًا ما تمثّل شخصًا أو مجموعة، وتعرضها قائمة مشاركة البيانات من Android. على سبيل المثال، يمكن لتطبيق مراسلة توفير هدف مشاركة مباشرة لشخص يؤدي إلى رابط لموضع معيّن يوجّه المستخدم مباشرةً إلى محادثة مع هذا الشخص. راجِع مقالة توفير أهداف المشاركة المباشرة للحصول على تعليمات مفصّلة.
أنواع MIME المتوافقة
من المفترض أن يكون التطبيق قادرًا على تلقّي أوسع نطاق ممكن من أنواع MIME.
على سبيل المثال، من المفترض أن يكون تطبيق المراسلة المصمّم لإرسال النصوص والصور والفيديوهات متوافقًا مع تلقّي text/* وimage/* وvideo/*. في ما يلي بعض أنواع MIME الشائعة لإرسال البيانات البسيطة وتلقّيها في Android.
| المستلِمون يسجّلون | المرسِلون يرسلون |
|---|---|
text/* |
|
`image/*` |
|
video/* |
|
| امتدادات الملفات المتوافقة | application/pdf |
راجِع السجلّ الرسمي لأنواع وسائط MIME التابع لهيئة IANA.
إنشاء أهداف مشاركة رائعة
عندما ينقر المستخدم على هدف مشاركة مرتبط بنشاط معيّن، يجب أن يكون بإمكانه تأكيد المحتوى الذي تمت مشاركته وتعديله قبل استخدامه. ويكتسب ذلك أهمية خاصة بالنسبة إلى البيانات النصية.
تلقّي البيانات باستخدام نشاط
يتضمّن تلقّي البيانات باستخدام نشاط تعديل البيان والتعامل مع المحتوى الوارد والتأكّد من أنّ المستخدم يتعرّف على تطبيقك.
تعديل البيان
تُعلم فلاتر الأهداف النظام بالأهداف التي يقبلها أحد مكوّنات التطبيق.
على غرار طريقة إنشاء هدف باستخدام إجراء ACTION_SEND في الدرس
إرسال بيانات بسيطة إلى تطبيقات أخرى
، يمكنك إنشاء فلاتر أهداف لتلقّي الأهداف باستخدام هذا الإجراء. يمكنك تحديد intent filter في البيان باستخدام العنصر <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()، يتم إدراج تطبيقك كخيار في قائمة مشاركة البيانات من 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، أو يمكن أن يكون أكثر
تعقيدًا مثل تطبيق فلتر صور مثير للاهتمام على صورة. يعود إلى تطبيقك تحديد الإجراء التالي.
مشاركة عنوان URL للقطة الشاشة
عند التقاط لقطة شاشة، يمكنك مشاركة لقطة الشاشة وأي عنوان URL مرتبط بها.
يوفّر ذلك تجربة مستخدم أفضل. عند تلقّي عنوان URL، احرص على الحصول على الحقل EXTRA_TEXT من الهدف، كما هو موضّح في المثال التالي:
override fun onCreate(savedInstanceState: Bundle?) {
...
when {
intent?.action == Intent.ACTION_SEND -> {
if (intent.type?.startsWith("image/") == true) {
handleSendImage(intent)
}
}
...
}
private fun handleSendImage(intent: Intent) {
(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
// Handle the EXTRA_TEXT as well
intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
// Update UI to reflect image being shared and the EXTRA_TEXT
// if available
}
}
...
}
التأكّد من أنّ المستخدمين يتعرّفون على تطبيقك
يتم تمثيل تطبيقك من خلال الرمز و التصنيف في قائمة مشاركة البيانات من Android وأداة حلّ الأهداف. يتم تحديد كليهما في البيان. يمكنك ضبط تصنيفات النشاط أو intent filter لتوفير المزيد من السياق.
اعتبارًا من Android 10 (مستوى واجهة برمجة التطبيقات 29)، لا تستخدم قائمة مشاركة البيانات من Android سوى الرموز التي تم ضبطها في البيان على علامة application. يتجاهل Android الرموز التي تم ضبطها على علامتَي intent-filter وactivity.