Intent و Intent Filter

Intent یک شی حاوی یک سری اطلاعات که برای درخواست یک کار از  برنامه دیگر مورد استفاده قرار می گیرد.همچنین Intent ارتباط بین اجزای اصلی یک برنامه را تسهیل می کند.سه مورد کاربرد اصلی را می توان برای Intent نام برد:

  1. اجرا کردن یک activity
  2. اجرا کردن یک service
  3. تحویل دادن یک broadcast

انواع Intent

Intentها را می توان به دو نوع تقسیم بندی کرد:

  1. Explicit intent:استفاده از intent به وسیله نام کامل component مورد نظر.برای مثال زمانی که شما می خواهید یک activity را اجرا کنید و آن activity در برنامه خودتان وجود دارد.
  2. Implicit intent:به جای استفاده از نام کامل component, یک action کلی را مشخص می کنید ,که کدام یک از سایر برنامه های قابلیت اجرای action مورد نظر ما را دارند.برای مثال اگر می خواهید موقعیت کاربر را در نقشه نشانش دهید از Implicit intent استفاده می کنید و به وسیله آن یک درخواست برای برنامه هایی که قادر به نشان دادن نقشه هستند ارسال می کنید.

intent-filters

شکل بالا نشان دهنده چگونگی باز کردن یک activity بوسیلهImplicit intent است.

زمانی که ما از Implicit intent استفاده می کنیم سیستم اندروید بدنبال برنامه ای می گردد که قادر به پردازش درخواست ما باشد.سیستم از طریق intent filterهایی که در مانیفست باقی برنامه نوشته شده این کار را انجام می دهد.اگر یک برنامه پیدا کند آن برنامه را باز می کند ولی اگر بیشتر از یک برنامه پیدا کند سیستم به ما قابلیت انتخاب بین آنها را می دهد.

intent filter عبارتی است که در  فایل manifest نوشته می شود و به عبارتی انواع intentی است که برنامه تمایل به دریافت آن ها را دارد.همچنین با تعریف intent filter برای یک activity باقی برنامه ها قادر به اجرای activity شما از طریق intentها خواهند بود.

نکته امنیتی:برای اجرا کردن سرویس ها همیشه سعی کنید از explicit intent استفاده کنید.بنابراین سعی کنید که intent filter برای سرویسهای خود تعریف نکنید.از Android 5.0 به بعد اگر بخواهید bindService() را به وسیله implicit intent فراخوانی کنید سیستم خطا می دهد.

استفاده ازintent

شی intent شامل اطلاعاتی که سیستم برای اجرا کردن یک component از آن استفاده می کند و همچنین دارای اطلاعاتی برای انجام دادن عملیات مورد نظر توسط component درخواستی نیز است.

اطلاعات اصلی intent:

  • نام component:این مقدار optional است .ولی وجه تمایز بین یک implicit intent و explicit intent است.به عبارتی با مشخص کردن نام component باعث ساخت یک explicit intent می شویم ولی اگر ذکر نکنیم باعث می شود که سیستم تصمیم بگیرد که کدام component  از کدام app باید اجرا شود.همچنین برای set کردن این مقدار از نام کامل باید استفاده شود.برای مثال com.example.ExampleActivity.
  • Action:این مقدار مشخص کننده یک action عمومی برای انجام است.برای مثال استفاده از ACTION_VIEW به همراه startActivity() زمانی استفاده می شود که نیاز باشد به کاربر چیزی را نشان دهیم.مثل عکسی که در گالری ذخیره شده و یا آدرسی در نقشه.همچنین از ACTION_SEND به همراه startActivity() زمانی استفاده می شود که داده ای داریم که کاربر می تواند آن را به اشتراک بگذارد.
  • Data:یک URI است که به یک داده ی خاص اشاره می کند.همچنین بهتر است هنگام استفاده از اطلاعات MIME type آن را نیز مشخص کنید.برای مثال activity که قابلیت نمایش عکس را دارد با activity که قابلیت پخش فایل موسیقی را دارد با هم متفاوت هستند برای همین موضوع بهتر است MIME type را مشخص کنیم.MIME type کمک می کند که سیستم اندروید بتواند بهترین component را برای رسیدگی به درخواست ما پیدا کند.
  • Category:یک رشته حاوی اطلاعاتی اضافی برای مشخص کردن componentهایی که باید intent مورد نظر ما را هندل کنند.

همچنین intent شامل یک سری اطلاعات دیگر نیز می شود:

  • Extra:یک  Key-value pairs است که به component مورد نظر برای انجام یک action ارسال می شود.
  • Flags:مشخص کننده متادیتا برای یک intent است و همچنین تعیین می کند که سیستم اندروید چگونه یک activity اجرا کند(مثلا  به کدام Task اختصاص دهد)  و همچنین  بعد از اجرا چگونه با activity رفتار کند.

مثالی از explicit intent:

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

مثالی از implicit intent:

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

کد بالا واضح است ولی اگر به if داخل کد دقت کنید متوجه خواهید شد که ابتدا با این کار از وجود  component مورد نظر برای پاسخگویی به intent خودمان مطمئن شده ایم  و سپس startActivity را صدا می زنیم.به این علت که اگر componentی برای هندل کردن intent ما در سیستم وجود نداشته باشد برنامه ما کرش خواهد کرد.

 

یک دیدگاه برای “Intent و Intent Filter”

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *