همانطور که یک برنامه میتواند به برنامههای دیگر داده ارسال کند، میتواند از برنامههای دیگر نیز داده دریافت کند. به این فکر کنید که کاربران چگونه با برنامه شما تعامل دارند و چه نوع دادههایی را میخواهید از برنامههای دیگر دریافت کنید. به عنوان مثال، یک برنامه شبکه اجتماعی ممکن است علاقهمند به دریافت محتوای متنی، مانند یک URL وب جالب، از برنامه دیگری باشد.
کاربران برنامههای دیگر مرتباً از طریق برگه اشتراکگذاری اندروید یا تحلیلگر intent، دادهها را به برنامه شما ارسال میکنند. برنامههایی که دادهها را به برنامه شما ارسال میکنند، باید یک نوع MIME برای آن دادهها تنظیم کنند. برنامه شما میتواند دادههای ارسال شده توسط برنامه دیگری را به روشهای زیر دریافت کند:
- یک
Activityبا تگintent-filterمنطبق در مانیفست - اشتراکگذاری میانبرهای منتشر شده توسط برنامه شما.
اهداف اشتراکگذاری مستقیم، پیوندهای عمیقی به یک فعالیت خاص در برنامه شما هستند. آنها اغلب نمایانگر یک شخص یا یک گروه هستند و صفحه اشتراکگذاری اندروید آنها را نشان میدهد. به عنوان مثال، یک برنامه پیامرسان میتواند یک هدف اشتراکگذاری مستقیم برای شخصی ارائه دهد که مستقیماً به مکالمه با آن شخص پیوند عمیق میدهد. برای دستورالعملهای دقیق، به ارائه اهداف اشتراکگذاری مستقیم مراجعه کنید.
پشتیبانی از انواع MIME
در حالت ایدهآل، یک برنامه باید بتواند وسیعترین طیف ممکن از انواع MIME را دریافت کند. به عنوان مثال، یک برنامه پیامرسان که برای ارسال متن، تصویر و ویدیو طراحی شده است، در حالت ایدهآل از دریافت text/* ، image/* و video/* پشتیبانی میکند. در اینجا چند نوع MIME رایج برای ارسال و دریافت دادههای ساده در اندروید آورده شده است.
| ثبت نام گیرندگان برای | فرستندهها ارسال میکنند |
|---|---|
text/* |
|
`image/*` |
|
video/* |
|
| پسوندهای فایل پشتیبانی شده | application/pdf |
به رجیستری رسمی IANA از انواع رسانههای MIME مراجعه کنید.
اهداف سهم بزرگی را تعیین کنید
وقتی کاربری روی یک هدف اشتراکگذاری مرتبط با یک فعالیت خاص ضربه میزند، باید بتواند قبل از استفاده از محتوای اشتراکگذاری شده، آن را تأیید و ویرایش کند. این امر به ویژه برای دادههای متنی اهمیت دارد.
دریافت دادهها با یک فعالیت
دریافت دادهها با یک اکتیویتی شامل بهروزرسانی مانیفست، مدیریت محتوای ورودی و اطمینان از شناسایی برنامه توسط کاربر میشود.
مانیفست خود را بهروزرسانی کنید
فیلترهای Intent به سیستم اطلاع میدهند که یک کامپوننت برنامه کدام intentها را میپذیرد. مشابه نحوه ساخت یک intent با اکشن ACTION_SEND در درس ارسال دادههای ساده به برنامههای دیگر ، شما فیلترهای intent را برای دریافت intentها با این اکشن ایجاد میکنید. شما یک فیلتر intent را در manifest خود با استفاده از عنصر <intent-filter> تعریف میکنید. به عنوان مثال، اگر برنامه شما دریافت محتوای متنی را مدیریت میکند، یک manifest که شامل یک یا چند تصویر از هر نوع است، مانند قطعه کد زیر خواهد بود:
<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() به اشتراک بگذارد، برنامهی شما به عنوان یک گزینه در برگهی اشتراکگذاری اندروید یا تحلیلگر intent فهرست میشود. اگر کاربر برنامهی شما را انتخاب کند، activity مربوطه ( .ui.MyActivity در مثال قبلی) شروع میشود. سپس این به شما بستگی دارد که محتوا را به طور مناسب در کد و رابط کاربری خود مدیریت کنید.
مدیریت محتوای ورودی
برای مدیریت محتوای ارائه شده توسط یک Intent ، تابع getIntent() را برای دریافت شیء Intent فراخوانی کنید. پس از دریافت شیء، میتوانید محتوای آن را بررسی کنید تا مشخص شود در مرحله بعد چه کاری باید انجام دهید. اگر این فعالیت میتواند از سایر بخشهای سیستم (مانند لانچر) شروع شود، هنگام بررسی intent این نکته را در نظر بگیرید.
برای بررسی دادههای ورودی دقت بیشتری داشته باشید، شما هرگز نمیدانید که برنامههای دیگر چه چیزی ممکن است برای شما ارسال کنند. برای مثال، ممکن است نوع MIME اشتباه تنظیم شده باشد، یا تصویری که ارسال میشود بسیار بزرگ باشد. همچنین، به یاد داشته باشید که دادههای باینری را به جای نخ اصلی ("UI") در یک نخ جداگانه پردازش کنید.
کاتلین
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 } }
جاوا
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 باشد، یا میتواند پیچیدهتر باشد، مانند اعمال یک فیلتر عکس جالب روی یک تصویر. اینکه در مرحله بعد چه اتفاقی بیفتد، به برنامه شما بستگی دارد.
مطمئن شوید که کاربران اپلیکیشن شما را میشناسند
برنامه شما توسط آیکون و برچسب آن در برگه اشتراکگذاری اندروید و تحلیلگر intent نمایش داده میشود. هر دوی این موارد در مانیفست تعریف شدهاند. میتوانید برچسبهای فیلتر activity یا intent را برای ارائه زمینه بیشتر تنظیم کنید.
از اندروید ۱۰ (سطح API ۲۹)، صفحه اشتراکگذاری اندروید فقط از آیکونهای تنظیمشده در مانیفست روی تگ application شما استفاده میکند. اندروید آیکونهای تنظیمشده روی تگهای intent-filter و activity را نادیده میگیرد.