Intent ها و Filter ها - در برنامه نویسی اندروید

Intent یک توضیح انتزاعی از عملیاتی است که باید در اندروید انجام شود و با استفاده از filter ها میتوان آن را سفارشی سازی کرد. با استفاده از متدهای مانند startActivity یا startService میتوان یک اکتیویتی یا سرویس را اجرا کرد. برای اجرای یک اجزا باید از متدهای استفاده کنیم که یک intent دریافت میکنند. در این intent مشخص شده باید مشخص کنیم که چه اطلاعاتی یا چه کاری باید انجام شود.

خود intent، یک شیء Intent، یک ساختار داده غیرفعال است که توصیفی انتزاعی از یک عملیات را در خود جای داده است.

مثال ارسال ایمیل با Intent

به عنوان مثال، فرض کنید شما یک Activity دارید که باید یک سرویس گیرنده ایمیل راه اندازی کند و با استفاده از دستگاه اندروید شما ایمیلی ارسال می کند. برای این منظور، Activity شما یک ACTION_SEND به همراه intent مناسب به Android Intent Resolver ارسال می‌کند. intent مشخص شده رابط مناسبی را به کاربر می دهد تا نحوه ارسال داده های ایمیل شما را انتخاب کند.

Intent email = new Intent(Intent.ACTION_SENDTO);
email.setData(Uri.parse("mailto:abc@xyz.com"));
email.putExtra(Intent.EXTRA_SUBJECT, "تست ایمیل");
email.putExtra(Intent.EXTRA_TEXT, "متن داخلی ایمیل");
startActivity(Intent.createChooser(email, "یک برنامه را برای ارسال ایمیل انتخاب کنید..."));

دستور بالا با فراخوانی متد startActivity برای شروع اکتیویتی ایمیل است. اگر بیشتر از یک برنامه مدیریت ایمیل داشته باشید لیست آن را به شما نمایش میدهد تا یکی از آنها را انتخاب کنید. اگر فقط یک برنامه باشد بصورت مستقیم همان برنامه را باز میکند.

جستجو در وب با Intent

فرض کنید یک Activity دارید که باید URL را در یک مرورگر وب در دستگاه Android خود باز کند. برای این منظور، Activity شما ACTION_WEB_SEARCH Intent را به Android Intent Resolver ارسال می کند تا URL داده شده را در مرورگر وب باز کند. Intent Resolver فهرستی از اکتیویتی هایی را تجزیه می‌کند و یکی را انتخاب می‌کند که به بهترین نحو با هدف شما مطابقت داشته باشد. سپس Intent Resolver صفحه وب شما را به مرورگر وب منتقل می کند و فعالیت مرورگر وب را شروع می کند.

String q = "7Cloner";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);

مثال بالا متن 7cloner را در موتور جستجوی اندروید جستجو می کند و نتیجه جستجوی 7cloner را در یک اکتیویتی به شما نشان می دهد.

متدهای اجرای یک اجزا با intent

مکانیسم‌های جداگانه‌ای برای ارائه intentها به هر نوع مؤلفه – اکتیویتی ها، سرویس ها، و BroadcastReceiverها وجود دارد.

متد و توضیحات ردیف
Context.startActivity()

شی Intent برای راه اندازی یک اکتیویتی جدید یا دریافت یک اکتیویتی موجود یا برای انجام کاری جدید به این متد ارسال می شود.

1
Context.startService()

شی Intent برای راه اندازی یک سرویس یا ارائه دستورالعمل های جدید به یک سرویس در حال انجام به این متد ارسال می شود.

2
Context.sendBroadcast()
شی Intent به این متد ارسال می شود تا پیام را به همه Broadcastها تحویل دهد.
3

شئ های Intent

یک شیء Intent مجموعه ای از اطلاعات است که توسط مؤلفه دریافت کننده intent و همچنین اطلاعات مورد استفاده توسط سیستم Android استفاده می شود.

یک شی Intent بر اساس آنچه که در حال برقراری ارتباط است یا قرار است انجام دهد می تواند شامل اجزای زیر باشد:

Action

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

action در یک شی Intent را می توان با متد setAction() تنظیم کرد و توسط getAction() خواند.

Data

مشخصات data را به شی اضافه می کند. مشخصات می تواند فقط یک نوع داده (ویژگی mimeType)، فقط یک URI، یا یک نوع داده و یک URI باشد. یک URI با ویژگی های جداگانه برای هر یک از بخش های آن مشخص می شود. این ویژگی‌هایی که قالب URL را مشخص می‌کنند اختیاری هستند، اما به یکدیگر وابسته هستند:

  • اگر data برای فیلتر intent مشخص نشده باشد، تمام ویژگی های URI دیگر نادیده گرفته می شوند.
  • اگر میزبانی برای فیلتر مشخص نشده باشد، ویژگی port و تمام ویژگی های مسیر نادیده گرفته می شوند.

متد setData() داده ها را فقط به عنوانURI دریافت میکند، setType() فقط به عنوان نوع MIME و setDataAndType() آن را به عنوان URI و نوع MIME مشخص می کند. URI توسط getData() و نوع توسط getType() خوانده می شود.

برخی از نمونه‌های جفت action/data عبارتند از:

جفت Action/Data و توضیحات ردیف
ACTION_VIEW content://contacts/people/1

نمایش اطلاعات مربوط به شخصی که شناسه او “1” است.

1
ACTION_DIAL content://contacts/people/1

شماره گیر تلفن را با شخص پر شده نمایش دهید.

2
ACTION_VIEW tel:123

شماره گیر تلفن را با شماره مشخص شده نمایش دهید.

3
ACTION_DIAL tel:123

شماره گیر تلفن را با شماره مشخص شده نمایش دهید.

4
ACTION_EDIT content://contacts/people/1
اطلاعات شخصی که شناسه او “1” است را ویرایش کنید.
5
ACTION_VIEW content://contacts/people/

نمایش لیستی از افراد، که کاربر می تواند از طریق آنها مرور کند.

6
ACTION_SET_WALLPAPER

نمایش تنظیمات برای انتخاب کاغذ دیواری

7
ACTION_SYNC

همزمان سازی داده ها، مقدار ثابت android.intent.action.SYNC است.

8
ACTION_SYSTEM_TUTORIAL

آموزش تعریف شده توسط پلت فرم را شروع می کند (آموزش پیش فرض یا آموزش راه اندازی)

9
ACTION_TIMEZONE_CHANGED

باز کردن تنظیمات منطقه زمانی.

10
ACTION_UNINSTALL_PACKAGE

برای اجرای برنامه حذف نصب پیش فرض استفاده می شود.

11
Category

این Category بخشی اختیاری از شی است و یک رشته حاوی اطلاعات اضافی در مورد نوع مؤلفه ای است که باید intent را مدیریت کند. متد addCategory() یک دسته بندی را در شی شما قرار می دهد، removeCategory() دسته ای را که قبلا اضافه شده حذف می کند و getCategories() مجموعه ای از تمام دسته های موجود در شی را دریافت می کند.

می‌توانید جزئیات فیلترهای Intent را در بخش زیر بررسی کنید تا بفهمید چگونه از دسته‌ها برای انتخاب اکتیویتی مناسب مربوط به یک شی آن استفاده می‌کنیم.

Extras

این بخش بصورت جفت کلید-مقدار برای اطلاعات اضافی است که باید به اجزای ای که intent را مدیریت می کند برسد. موارد اضافی را می توان به ترتیب با استفاده از متدهای putExtras() و getExtras() تنظیم و خواند.

Flags

این flagها بخشی اختیاری از شی Intent هستند و به سیستم اندروید آموزش می‌دهند که چگونه یک اکتیویتی را راه‌اندازی کند، و چگونه با آن پس از راه‌اندازی و غیره رفتار کند. این پرچم ها جز filter های یک intent در اندروید می باشد

flagها و توضیحات ردیف
FLAG_ACTIVITY_CLEAR_TASK

هنگام تنظیم این پرچم و ارسال آن به Context.startActivity()، این پرچم باعث می شود هر کار موجود که با فعالیت مرتبط است قبل از شروع فعالیت پاک شود. یعنی فعالیت به ریشه جدید یک کار خالی تبدیل می شود و هر فعالیت قدیمی تمام می شود. این فقط می تواند همراه با FLAG_ACTIVITY_NEW_TASK استفاده شود.

1
FLAG_ACTIVITY_CLEAR_TOP

اگر این پرچم تنظیم شود، و اکتیویتی در حال راه‌اندازی از قبل در حال اجرا باشد، به جای راه‌اندازی نمونه جدیدی از آن اکتیویتی، همه اکتیویتی های دیگر در بالای آن بسته می‌شوند و این Intent به  اکتیویتی قدیمی به عنوان یک Intent جدید ارسال میشود.

2
FLAG_ACTIVITY_NEW_TASK

این پرچم معمولاً توسط اکتیویتی هایی استفاده می‌شود که می‌خواهند رفتار سبک «راه‌انداز» را ارائه دهند: آنها فهرستی از کارهای جداگانه‌ای را که می‌توان انجام داد به کاربر ارائه می‌دهد، که در غیر این صورت کاملاً مستقل از اکتیویتی که آنها را راه‌اندازی می‌کند اجرا می‌شود.

3
نام اجزا

این فیلد اختیاری یک شیء ComponentName اندروید است که کلاس Activity، Service یا BroadcastReceiver را نشان می‌دهد که تنظیم شود، شی Intent به نمونه ای از کلاس تعیین شده تحویل داده می شود، در غیر این صورت Android از اطلاعات دیگری در شی Intent برای تعیین مکان یک هدف مناسب استفاده می کند.

نام کامپوننت توسط setComponent()یا  setClass() یا setClassName() تنظیم میشود و توسط getComponent() دریافت می شود.

انواع intent

دو نوع intent در زیر وجود دارد که توسط Android پشتیبانی می شوند:

Android Intent Types

intentهای صریح

این نوع صریح به دنیای داخلی برنامه متصل می شود، فرض کنید اگر می خواهید یک اکتیویتی را به اکتیویتی دیگر متصل کنید، تصویر زیر با کلیک کردن روی دکمه، اکتیویتی اول را به اکتیویتی دوم متصل می کند.

Android Intent Activity

این نوع مؤلفه هدف را با نام آن مشخص می‌کنند و معمولاً برای پیام‌های داخلی برنامه استفاده می‌شوند – مانند اکتیویتی که یک سرویس زیرمجموعه را شروع می‌کند یا یک اکتیویتی برادر را راه‌اندازی می‌کند. بعنوان مثال:

// intent صریح با تعیین نام کلاس آن
Intent i = new Intent(FirstActivity.this, SecondActivity.class);

// شروع اکتیویتی هدف
startActivity(i);
intent ضمنی

این نوع یک هدف را نام نمی برند و فیلد نام مؤلفه خالی می ماند. مقاصد ضمنی اغلب برای فعال کردن مؤلفه ها در سایر برنامه ها استفاده می شود. مثلا :

Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);

کد بالا مطابق شکل زیر نتیجه خواهد داد :

Android Intent Contacts

اجزای هدفی که intent را دریافت می کند می تواند از متد getExtras() برای دریافت dataهای اضافی ارسالی توسط جزء منبع استفاده کند. مثلا:

// شیء Bundle  را در مکان مناسب در کد خود دریافت کنید
Bundle extras = getIntent().getExtras();

// استخراج داده ها با استفاده از کلیدهای ارسال شده
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر نیاز است تا ابتدا وارد سایت شوید.

هیچ نظری ارسال نشده است.

قیمت آموزش
رایگان
نوع دسترسی
رایگان

این مقاله در حال حاضر تنها به روش رایگان در دسترس می باشد.

ناصر خالدی
مدرس دوره

ناصر خالدی

مهندس شبکه, امنیت, برنامه نویسی تلفن های هوشمند, طراح وب سایت و متخصص هوش مصنوعی

گفتگوی برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن

مقالات پیشنهادی

هوش مصنوعی

هوش مصنوعی یا هوش ماشینی, به هوشمندی نشان داده شده توسط ماشین در شرایط مختلف گفته میشود که مقابل هوش طبیعی در انسان ها قرار دارد که ...


۸۶۰
۰
۱۱ آذر ۱۳۹۹

وردپرس

وردپرس یک سیستم مدیریت محتوای قوی می باشد که با استفاده از آن می توان وب سایت ها و وبلاگ های گوناگونی با هر شرایطی را طراحی کرد چرا که این سیستم و ...


۸۰۶
۰
۱۳ آذر ۱۳۹۹

اندروید

اندروید یک سیستم عامل می باشد که توسط گوگل توسعه داده میشود, این سیستم عامل بر پایه نسخه ی اصلاح شده ی هسته ی لینوکس و دیگر نرم افزار های متن باز طراحی شده است و ...


۱۰۵۴
۰
۲۹ آبان ۱۳۹۹

نود جی اس

توسعه دهندگان نود جی اس, زبان جاوا اسکریپت را از یک زبان قابل اجرا در مرورگر خارج کرده و به زبانی تبدیل کردن که بتوان آن را بصورت یه اپلیکیشن مستفل اجرا کرد و ...


۹۱۲
۰
۱۲ آذر ۱۳۹۹

Fatal error: Uncaught wfWAFStorageFileException: Unable to verify temporary file contents for atomic writing. in /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php:52 Stack trace: #0 /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php(659): wfWAFStorageFile::atomicFilePutContents('/home/clonerco/...', '<?php exit('Acc...') #1 [internal function]: wfWAFStorageFile->saveConfig('livewaf') #2 {main} thrown in /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php on line 52