آکادمی آموزش آنلاین طوسی

معرفی Implicit Intent ها در سیستم عامل اندروید

اهداف آموزشی این درس:

1. معرفی ها Implicit Intent 

2.معرفی Intent Resolution 

پس از آشنایی با Explicit Intent ها در آموزش های گذشته، در این آموزش قصد داریم تا با نوع دوم از Intent ها تحت عنوان Implicit Intent آشنا شویم.

واژه Implicitدر لغت به معنی "غیر آشکار"و "ضمنی" می باشد. به طور مثال زمانیکه نیت انجام کاری را داشته باشیم اما دقیقاً مشخص نکنیم که کدام بخش از سیستم عامل اندروید وظیفه انجام آن کار را دارا است بلکه صرفاً اطلاعاتی کافی از هدفی که داریم را در اختیار اندروید قرار داده و خود سیستم عامل به طور مثال Component مناسب را برگزیده و هدف ما را عملی خواهد ساخت:

همانطور که در تصویر فوق مشخص است در سمت چپ Activity اول قرار دارد که حاوی یک Implicit Intent است مبنی بر این که یک سایت اینترنتی را به نمایش در آورد. در حقیقت Activity اول از کل اطلاعات مورد نیاز برای یک Intent فقط یک آدرس را دارا است اما این در حالی است که با همین یک آدرس اندروید قادر است تا بخشی از سیستم عامل را که مسئول نمایش یک آدرس اینترنتی است را فرا خوانده و نیت ما را عملی سازد. چنانچه بخواهیم به برخی از مثال های Implicit Intent ها در اندروید اشاره کنیم می توانیم فرایند ارسال پیام کوتاه، فعال سازی گوگل مپ، ارسال ایمیل، سرچ در اینترنت و برقراری یک تماس تلفنی را نام برد.

در ارتباط با Implicit Intent ها همواره بایستی این نکته را به خاطر داشت باشیم که به هیچ وجه نمی بایست نام Component خاصی را برای Intent مد نظر خود مشخص کنیم تا از آن استفاده کند بلکه با اطلاعات کافی که در اختیار سیستم قرار می دهیم، خود سیستم Component مناسب را انتخاب خواهد کرد.

 

معرفی Intent Resolution 

همانطور که در بالا اشاره شد، ما به عنوان یک توسعه دهنده اندروید این اجازه را نداریم تا برای Implicit Intent ها یک Component خاصی را مشخص کنیم بلکه این اجازه را می بایست به خود سیستم عامل دهیم تا بر اساس اطلاعات موجود در Intent خود Component مناسب را برگزیند که به این فراید اصطلاحاً Intent Resolution گفته می شود.به طور کلی واژه انگلیسی Resolution دارای معانی متعددی است که از آن جمله می توان به "حل، تفکیک پذیری، تحلیل و تصمیم گیری" اشاره کرد. به طور خلاصه پس از ایجاد یک Intent از نوع Implicit سیستم عامل اطالعات مرتبط با آن Intent را مد نظر قرار خواهد داد سپس بعد از آنکه متوجه شد که این Intent قرار است چه کاری انجام دهد به آرشیو خود مراجعه نموده و کلیه تگ های مربوط به نصب شده در اپلیکیشن را مورد بررسی دقیق قرار داده و در نهایت راه کاری که با شرح فعالیت Intent ما همخوانی داشته باشد را انتخاب خواهد کرد. در واقع در فرایند Intent Resolution سیستم عامل اندروید یکی از موارد Service ،Activity یا Broadcast Receiver را به عنوان Component هدف انتخاب خواهد کرد که اینکار از طریق Intent Filter ها انجام خواهد شد (لازم به ذکر است که گاهی بیش از یک Component برای اجرای یک Intent از نوع Implicit مد نظر قرار داده خواهد شد).

به طور کلی یک Implicit Intent را می توان در قالب تصویر زیر متصور شد:

همانطور که در تصویر فوق مشخص است یک Activity تحت عنوان X داریم. حال این Activity قرار است که کاری را به انجام برساند اما ما به هیچ وجه به طور دقیق Component خاصی را برای این Activity مشخص نکرده ایم بلکه از طریق یک Intent هدفی و کاری که قصد انجام آن را داریم را تعریف کرده ایم. حال کاری که این Intent که از نوع Implicit هم می باشد قرار است انجام دهد این است که همانطور که در تصویر فوق مشخص است تک به تک Component های مرتبط با Activity P که در سمت راست قرار دارند را مورد بررسی قرار دهد تا ببیند که آیا کدامیک از آنها با نیازی که Activity ما دارد همخوانی بیشتری دارند. حال اگر مورد اول همخوانی نداشت به سراغ مورد دوم رفته و اگر همخوانی داشت آن را به عنوان یکی از گزینه های مناسب مد نظر قرار داده اما کار خود را متوقف نخواهد کرد بلکه کار خود را ادامه داده تا ببیند آیا می تواند گزینه های بیشتری بیابد یا خیر.

در خاتمه سه حالت می تواند اتفاق افتد:

حالت اول اینکه یک مورد مناسب پیدا شود که در این صورت سیستم عامل اندروید آن را به عنوان Component مناسب انتخاب کرده و آن را اجرا خواهد کرد..

حالت دوم این است که هیچ موردی با نیازی که Activity ما دارد پیدا نشود که در این صورت یک Exception یا خطا رخ خواهد داد و اپلیکیشن ما اصطلاحاً Crash خواهد کرد.

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

به طور کلی می توان گفت که Intent ها بوسیله Intent Filter ها به Component های مختلف مرتبط می شوند. Intent Filter ها در فایل AndroidManifest یا در خود فایل جاوا تعریف می شوند و این در حالی است که اگر بخواهیم در فایل جاوا دست به تعریف فیلترها بزنیم می بایست از کلاس IntentFilter و متدهای مرتبط با آن استفاده کنیم.

در واقع می توان گفت که Intent Filter ها دارای دو وظیفه اصلی هستند:

اول آنکه این وظیفه را دارند تا Component مناسبی را برای Intent ما برگزینند. به عبارت دیگر فرض کنیم که Intent یی ایجاد کرده ایم که می بایست کار خاصی را به انجام برساند. حال وظیفه ای که Intent Filter دارد این است که "تست" کند تا Component یی که با نیاز Intent ما هم خوانی دارد را برگزیند:

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

وظیفه دیگری که Intent Filter ها دارند این است که برخی قابلیت ها و یا ویژگی های یک Component خاصی را معرفی کنند. به عبارت دیگر می توان به طور مثال از یک Intent Filter به منظور معرفی قابلیت های Activity ها یا Service ها و یا Broadcast Receiver ها استفاده کرد.

همانطور که پیش از این اشاره کردیم هر Intent دارای بخش های مختلفی همچون Action و Data و Extras و Category و Flag است. حال برای آنکه Intent Filter ها بتوانند وظیفه خود را به انجام برسانند نیاز دارند تا از بخش های فوق موارد Action و نوع Data و Category را در فیلتر تست کنند تا بتوانند بر اساس تجزیه و تحلیل اطلاعات موجود در آنها Component مناسب را انتخاب نمایند..

در واقع در PackageManager اطلاعات مرتبط با Action و Data و Category مورد تجزیه و تحلیل قرار گرفته تا Component یی که می تواند نیازهای Intent تعریف شده توسط ما را برآورده سازد را بیابد (منظور از PackageManager کلاسی در سیستم عامل اندروید است که این وظیفه را دارا است تا کلیه اطلاعات مرتبط با پکیج های یک اپلیکیشن را که روی دستگاه اندرویدی نصب هستند را مورد بررسی قرار دهد).

به طور خلاصه برای آنکه یک Implicit Intent به Component یی تحویل داده شود می بایست از هر سه تست مرتبط با Action و Data و Category سر بلند بیرون بیاید. حتی اگر یکی از این موارد سه گانه نیز با شکست مواجه شود سیستم عامل اندروید از ارتباط دادن Intent مد نظر به یک Component سر باز خواهد زد. اما جای امیدواری اینجا است که از آنجا که یک Intent می تواند بیش از یک Intent Filter داشته باشد، این امید هست Intent ما بتواند از سد فیلترهای دیگر بگذرد

در حقیقت قرار است تا ما Intent خود را چه از جنس Explicit باشد و چه از جنس Implicit در فایل جاوای اپلیکیشن خود ایجاد کنیم. در واقع در ارتباط با Explicit Intent وضعیت اینگونه است که همه چیز مشخص است و Component هدف نیز مشخص است و نیازی به هیچ گونه فیلتری برای Intent خود نداریم تا Component های مناسب با آن را پیدا نماید. اما در مورد Explicit Intent ها قضیه متفاوت است.

 

پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:

1. تفاوت Implicit Intent ها با Explicit Intent ها چیست؟

2. منظور از Intent Resolution چیست؟

3. منظور از Intent Filter چیست؟

4. کدامیک از بخش های پنج گانه یک Intent در Intent Filter تست می شوند؟

5. در تستی که در یک Intent Filter اتفاق می افتد سه حالت متفاوت ممکن است اتفاق افتد. این سه حالت کدامند؟

6. آیا یک Intent می تواند بیش از یک Intent Filter داشته باشد یا خیر؟

 

برای مشاهده نظرات وارد سایت شوید یا ثبت‌نام کنید.

54th_Session,_Implicit_Intents.pdf

لینک دانلود فایل درس معرفی Implicit Intent ها در سیستم عامل اندروید

سرفصل های آموزشی دوره رایگان برنامه نویسی اندروید Android

منبع این درس در سایت سکان (www.sokanacademy.com)