Skip to main content

فراخانی و باز کردن اپلیکیشن های دیگر دستگاه های اندرویدی با استفاده از اینتنت ضمنی

Open other apps with implicit intents

در این درس از دوره AS Android App Development Essential Training، نحوه استفاده از implicit intents برای بازکردن برنامه‌های دیگر به صورت ایمن و بهینه مورد بررسی قرار می‌گیرد. در این آموزش، از رویکردهایی مانند استفاده از ACTION_VIEW به همراه Data URIs بهره برده شده و اهمیت بررسی وجود برنامه‌ای که بتواند intent مورد نظر را پردازش کند، قبل از فراخوانی startActivity() تأکید می‌شود. همچنین، مثال‌های کدنویسی عملی ارائه شده و نکات مهم در مدیریت ناوبری بین اپلیکیشن‌ها به گونه‌ای که تجربه کاربری بهبود یابد و از بروز خطاهای احتمالی جلوگیری شود، تشریح می‌شود. این درس به گونه‌ای طراحی شده که متخصصان و توسعه‌دهندگان با آشنایی با مفاهیم و جزئیات تخصصی بتوانند درک کاملی از روند پیاده‌سازی ارتباط میان برنامه‌ها به دست آورند.

لینک کمکی (official link) – آموزش Implicit Intents در اندروید: باز کردن اپلیکیشن‌های خارجی

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

یکیش لینک یک URL وب هستش که به صفحه فیسبوک میره و اون یکی یک آدرس ایمیل هست. من با URL وب شروع میکنم. به علاوه همونطور که می بینید یک آیتم جدید به آپشن منوم اضافه کردم. که تیترش On the web و resource ID اش action _web هستش. در Main Activity ام یک کد شرطی هم برای کنترل این آیتم جدید اضافه کردم. این کد دقیقا اینجا است. قدم اول ساخت یک شی از جنس Intent هستش. پس شروع میکنم و در اینجا تایپ می کنم Intent و اسمش رو میذارم web Intent و با استفاده از new Intent معرفی اش میکنم و اینبار میخوام از نسخه ای استفاده کنم که به یک رشته ویک URI نیاز داره.

این رشته نشون دهنده این هست که چکاری میخوام انجام بدم و برای همین میخوام از یک ثابت از کلاس اینتنت با نام ACTION_VIEW استفاده کنم. توجه داشته باشید که یک تعداد ثابت ACTION وجود داره و همه اونها میتونن برای نشون دادن اینکه چکاری میخواییم در این نقطه از برنامه انجام بدیم استفاده بشن. بعد به یک URI نیاز دارم و میخوام از رشته ای که در بالای کلاس ام اعلام کردم استفاده کنم و میخوام به عنوان یک شی Uri پارسش کنم. بد نیست بدونید از پارس برای تبدیل نوع متغیر استفاده میشه. درواقع هر موقع که بخواییم یک نوع داده رو به نوع دیگه تبدیل کنیم از این تابع استفاده میکنیم. Uri هم در واقع آدرس یک محتوارو نشون میده مثلا میتونه آدرس فایلی روی حافظه باشه که میشه همون مسیر فایل. من از کلاس Uri از android.net استفاده میکنم و متد پارس رو واسش فراخونی میکنم و web Url ام رو بهش میدم.

خب حالا شی web Intent ام میدونه که من میخوام یک چیزی رو نشون بدم و شی Uri هم میدونه که من چه چیزی میخوام نشون بدم. بعد میخوام کاری کنم که بهش میگن رفع اکتیویتی. این خیلی مهم هست که هروقت از یک اینتنت ضمنی استفاده میکنید، مطمئن بشید که برنامه ای روی دستگاهتون وجود داره، تا محتوایی که برای رسیدگی شما بهش میفرستید رو بتونه ثبت کنه. در واقع باید اون برنامه ای که قرار هست از طریق اینتنت ضمنی باهاش ارتباط برقرار کنید روی دستگاه تون نصب باشه. پس از عبارت if استفاده میکنم و متد web Intent.resolveActivity رو فراخونی میکنم و بعد get PackageManager رو بعنوان آرگومان بهش میدم.

متد resolve Activity یک شی برمیگردونه، به شرطی که یک برنامه ای که بتونه این URI رو کنترل کنه پیدا کنه ولی اگه پیدا نکرد مقدار null رو برمیگردونه. در واقع اگه برنامه ای مربوط به این URI در دستگاه اندرویدی پیدا نکرد مقدار null برمیگردونه. پس من نتیجه این متد رو با مقدار null مقایسه میکنم. اگه این عبارت true باشه یعنی برنامه مورد نظر وجود داره و میتونم پیش برم و سراغ صفحه وب بروم. خب یکبار دیگه start Activity رو فراخونی میکنم، و مقدار web Intent ا ام رو بهش میدم و کدم رو اجرا میکنم. آپشن منو رو باز میکنم و آیتم جدید On the web رو انتخاب میکنم و میبینیم که یک مرورگر باز میشه و میره سراغ URL ای که بهش دادم.

که یک صفحه فیسبوک هستش برای شرکت ساختگی ما. حالا اگه این واستون کار نکرد، مثلا اگه صفحه فیسبوکی که الان برای من باز شد دیگه دردسترس نبود، میتونید به سادگی بیایید این بالا سراغ این مقدار ثابت رشته ای اینجا، و با هر شناسه فیسبوک دیگه ای جایگزینش کنید. حالا میخوام بهتون نشون بدم چطوری یک ایمیل از برنامه اندروید بفرستید. حالا میخوام این کد وقتی اجرا بشه که کاربر دکمه floating action رو میزنه. اگه یادتون باشه دکمه floating action همیشه آیکن ایمیل داشت.

پس بهترین روش برای فرستادن ایمیل همین دکمه است. به متد on Create ام میرم جایی که تنظیمات مربوط به کنترل دکمه floating action هستش و میرم سراغ متد on Click اش، درست در اینجا. حالا، اگه یک فلش کوچیک دیدید فقط دابل کلیک کنید تا کداش باز بشن، اونوقت میتونید کدهای مربوط به on Click رو تغییر بدید. اول باید آدرس ایمیل رو مشخص کنیم که قبلا به عنوان یک مقدار ثابت تعریفش کردم و لازم هست که تو یک آرایه بذارمش. پس یک آرایه رشته ای تعریف میکنم با نام addresses و یک مقدار دقیق که همون آدرس email هستش رو بین دو تا آکولاد واسش تعریف میکنم. حالا مقدار آرایه ی addresses ام برابر شد با آدرس email ای که قبلا تعریف کرده بودم.

بعد اینتنت ام رو میسازم. ایندفعه از لیست پیشنهادات میخوام از نسخه سازنده اینتتی که فقط یک رشته میگیره استفاده کنم. که action نام داره. من از یک مقدار ثابت با نام ACTION_SENDTO استفاده میکنم. بد نیست این رو هم بدونید ACTION_SEND زمانی استفاده میشه که بخوایید یک attachment هم بفرستید و SEND_MULTIPLE هم زمانی استفاده میشه که بخوایید چند تا attachment بفرستید. چون من فقط میخوام یک ایمیل ساده بفرستم پس از SENDTO استفاده میکنم.

بعد، میخوام متدی به نام set Data رو فراخونی کنم و میخام یک شی Uri بهش بدم که براساس رشتهmailto : هستش. این یعنی من میخوام این اینتنت به طور خاص توسط یک برنامه ایمیل کنترل بشه. در دستگاه من این توسط Gmail کنترل میشه چون این تنها برنامه ایمیلی هست که من نصب شده دارمش ولی اگه برنامه های ایمیل دیگه ای داشته باشم، کاربر حتی میتونه انتخاب کنه که دوست داره، از کدوشون برای ارسال ایمیل استفاده کنه. حالا باید اطلاعاتی راجبه خود ایمیل واسش تنظیم کنم.

من متدی با نام put Extra رو برای چندین دفعه فراخونی میکنم. هر زمان که این متد رو فراخونی کنم باید بهش یک کلید و یک مقدار بدم. کلید همیشه یک مقدار ثابت از کلاس اینتنت هستش پس کافی هست تایپ کنم Intent و بعدش هم در این مورد EXTRA_EMAIL هست و بعد مقداری که باید بدم آرایه رشته ای با نام addresses هستش. خب این روشی برای فرستادن بیشتر از یک ایمیل در یک زمان هستش. باز هم با فراخونی متد intent .putExtra کلیدش رو EXTRA_SUBJECT میذارم که همون موضوع ایمیل هست و رشته information request رو به عنوان ورودی بهش میدم. یکبار دیگه متد intent .putExtra رو فراخونی میکنم و کلیدش رو EXTRA_TEXT میذارم و متنش رو میخوام رشته Please send some information! بذارم حال آماده ام تا ایمیل رو بفرستم.

یکبار دیگه، باید مطمئن بشیم که برنامه ای که بتونه این اینتنت رو کنترل کنه روی دستگاهم هست. پس عبارت if رو ایجاد میکنم و intent .resolveActivity رو فراخونی میکنم و از اون جا متد get PackageManager رو صدا میزنم و بعد با مقدار null مقایسه اش میکنم. اگه null نباشه میتونم متد start Activity رو فراخونی کنم و شی intent رو بهش بدم و کدم رو تست کنم.

الان از برنامم اجرا می گیرم، ایندفه، دکمه floating action رو در گوشه پایین سمت راست میزنم و میره به Gmail روی دستگاهم و آدرس ها و موضوع و متن ایمیل رو در جای خودشون قرار میده. در واقع این کدهایی که در جاو نوشتیم این صفحه رو ایجاد میکنه و نمیاد ایمیل رو ارسال کنه بلکه عمل فشار دادن دکمه send و کامل کردن ارسال ایمیل رو میذاره به عهده خودمون تا کاربر دکمه send رو فشار بده و ایمیل ارسال بشه. من میخوام بیخیال فرستادن این ایمیل بشم و discard رو بزنم چون درواقعیت چنین آدرس ایمیلی وجود نداره.

برمیگردم به صفحه اندروید استودیو. خب دو تا مثال از نحوه صدا زدن اکتیویتی از سایر برنامه های روی دستگاه براتون آوردم. برای URL وب برنامه Chrome رو صدا زدم و برای ارسال ایمیل برنامه Gmail رو. شما هم میتونید کارهایی مثل اینها رو برای برنامه Google Maps و سایر برنامه های موجود نصب شده روی دستگاه اندرویدی تون انجام بدید. برای کسب اطلاعات بیشتر راجع به اینتنت های ضمنی، به ثابت هایی که از کلاس اینتنت برای عملیات معمول در دسترس هستن حتما نگاهی بندازید.

دیدگاهتان را بنویسید

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

دوره ها
درس ها
Tha PMIS
طهاکو من
0