مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش جابجایی بین برنامه ها در اندروید با Intent ها

معمولا یک برنامه اندرویدی دارای چندین Activity است که حین اجرای برنامه بین این activityها جا به جا می شود. هر activity یک رابط کاربری را به کاربر نشان می دهد که به کاربر اجازه می دهد کار خاصی را انجام دهد(مثل دیدن یک عکس یا نقشه). برای جابه جایی کاربر از یک activity به activity دیگر همان طور که در این ویدیو گفته ایم از intent ها استفاده می کنیم. وقتی که شما با اسفتاده از متدی مانند startActivity یک activity را باز می کنید برنامه ابتدا به intent شما نگاه می کند و با توجه به intent ارسال شده activity مربوطه را باز می کند. اما این تنها مورد استفاده از intent ها نیست. برای کار های دیگری هم می توان از intent ها استفاده کرد. شما می توانید با استفاده از intent ها یک activity را از یک برنامه دیگر صدا بزنید و آن را فراخوانی کنید. در این قسمت توضیح می دهیم که چگونه می توان با استفاده از intent ها می توان این کار را انجام داد

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

انتقال بین برنامه های مختلف اندروید با Intentها و معرفی intent های ضمنی

فرستادن کاربر به برنامه دیگر

یکی از قابلیت های خوب اندروید این است که می تواند کاربر را از یک برنامه به برنامه دیگر بفرستد و حتی به قسمت خاصی از یک برنامه دیگر بفرستد. برای مثال شما می خواهید آدرس مشتریان خود را بر روی نقشه مشخص کنید. حال لازم نیست که خودتان یک activity طراحی کنید که شامل نقشه و امکانات انتخاب محل بر روی نقشه و موارد این چنینی را داشته باشد. شما در این حالت کاربر را از برنامه خودتان باید به سمت برنامه نقشه دستگاه اندرویدی مانند google map راهنمایی می کنید. این کار با استفاده از intentها انجام خواهد شد.

در این حالت اندروید برنامه مورد نظر را باز خواهد کرد و کاربر بعد از انتخاب نقشه نتیجه به برنامه اصلی بازگردانده خواهد شد. این عمل بسیار به شما کمک خواهد کرد. به طور معمول برای این که از یک activity به activity دیگر منتقل شویم در ورودی intent خود کلاس مقصد را وارد می کنیم. به این شکل بین این دو activity جابه جا می شوید. روش دیگری که برای استفاده از intent ها وجود دارد که روش ضمنی است.

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

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

اگر کد بالا را بنویسید و سپس دستور startActivity(callIntent) را زیر آن بنویسید و برنامه را اجرا کنید وقتی برنامه به این قسمت برسد قسمت شماره گیر تلفن شما باز خواهد شد و شماره مورد نظر را شماره گیری می کند. پس ACTION_DIAL همیشه باعث می شود که قسمت شماره گیری باز شود. حال اگر بخواهیم که برنامه قسمتی را بر روی نقشه نمایش دهد از کد زیر استفاده می کنیم.

Uri location = Uri.parse("geo:37.422219,-122.08364?z=14");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

در کد بالا ابتدا یک طول و عرض جغرافیای به برنامه داده ایم و سپس یک intent را ساخته ایم که ACTION_VIEW را فراخوانی می کند. این اکشن با توجه به ورودی که به آن می دهیم می تواند برنامه های مختلفی را باز کند و به activity های مختلف برود. برای مثال چون در کد بالا آدرس دهی از نوع موقعیت جغرافیایی است نقشه باز شده است ولی اگر ما یک آدرس وب سایت را داده باشیم برنامه ما را به مرورگر منتقل خواهد کرد. مانند کد زیر

Uri webpage = Uri.parse("http://www.tosinso.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);


انتقال به activity برنامه دیگر و انتقال داده

گاهی پیش می آید که شما بخواهید یک داده را به همراه intent خود ارسال کنید. برای مثال در برنامه خود می خواهید امکانی قرار دهید که کاربر بتواند مشخصات یک کالا را برای مدیر خود با استفاده از ایمیل ارسال کند. برای این قسمت باید مشخصات کالا به همراه intent ارسال شود. برای این کار به همان شکل که در این ویدیو توضیح داده شده است از extra و putExtra استفاده می شود. نکته ای که باید به آن دقت داشت این است که هنگامی که داده ها را از طریق intent ضمنی ارسال می کنید باید نوع داده هایی که ارسال می کنید را نیز مشخص کنید. برای مشخص کردن نوع داده از متد setType استفاده می کنیم. برای ارسال ایمیل توسط intent ها باید مانند کد زیر عمل کنید.

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);	//نوع داده ارسالی
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); //گیرنده
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); //موضوع ایمیل
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); //متن ایمیل
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); //فایل پیوست

دقت کنید که وقتی که ایمیل ارسال می کنیم نیازی با وارد کردن Uri در داخل intent نیست. استفاده از setType باعث می شود که برنامه هایی که قادر هستند عمل مورد نظر را انجام دهند فراخوانی شوند. برای مثال وقتی که شما می خواهید یک عکس راببینید از ACTION_VIEW استفاده می کنید ولی ممکن است که برنامه نقشه هم برای این کار فراخوانی شود که اگر شما setType را از نوع image انتخاب کنید این اتفاق نمی افتد.


مهدی عادلی فر
مهدی عادلی فر

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

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات