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 پشتیبانی می شوند:
intentهای صریح
این نوع صریح به دنیای داخلی برنامه متصل می شود، فرض کنید اگر می خواهید یک اکتیویتی را به اکتیویتی دیگر متصل کنید، تصویر زیر با کلیک کردن روی دکمه، اکتیویتی اول را به اکتیویتی دوم متصل می کند.
این نوع مؤلفه هدف را با نام آن مشخص میکنند و معمولاً برای پیامهای داخلی برنامه استفاده میشوند – مانند اکتیویتی که یک سرویس زیرمجموعه را شروع میکند یا یک اکتیویتی برادر را راهاندازی میکند. بعنوان مثال:
// 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);
کد بالا مطابق شکل زیر نتیجه خواهد داد :
اجزای هدفی که intent را دریافت می کند می تواند از متد getExtras() برای دریافت dataهای اضافی ارسالی توسط جزء منبع استفاده کند. مثلا:
// شیء Bundle را در مکان مناسب در کد خود دریافت کنید Bundle extras = getIntent().getExtras(); // استخراج داده ها با استفاده از کلیدهای ارسال شده String value1 = extras.getString("Key1"); String value2 = extras.getString("Key2");