آموزش اندروید-ارسال به دیگر appها
آن چه در این آموزش فرا می گیرید:
- ساخت Implicit Intent
- آیا برنامه ای Intent را دریافت می کند
- شروع Activity با Intent
- نمایش پنجره انتخاب برنامه
مواردی که باید مطالعه کرده باشید:
- اشتراک گذاری اطلاعات
آموزش اندروید - ارسال کاربر به دیگر برنامه ها
یکی از مهمترین ویژگی های اندروید ارسال کاربر به یک برنامه ی دیگر می باشد که این کار بر اساس یک "عملیات" ممکن است انجام شود. برای مثال، اگر در برنامه ی خود قصد دارید آدرسی را روی نقشه نمایش دهید، نیاز نیست که یک activity به برنامه اضافه کنید که نقشه را نشان دهد. در عوض، می توانید یک درخواست مشاهده ی آدرس را با استفاده از Intent ایجاد کنید. سیستم اندروید درخواست را دریافت می نماید و برنامه ای را راه اندازی می کند که قادر است آدرس را روی نقشه نمایش دهد.
همانطور که در اولین آموزش اندروید، آموزش اندروید-ایجاد اولین برنامه، توضیح داده شد، از Intentها باید برای چرخش بین activity های برنامه ی خودتان استفاده کنید. این کار را با explicit intent انجام می دادیم. در explicit intent نام دقیق کلاس کامپوننتی که می خواستیم شروع شود را ذکر می کردیم. با این وجد، وقتی که می خواهید یک برنامه ای به غیر از برنامه ی خودتان کاری را انجام دهد، مانند "مشاهده نقشه" باید از implicit intentها استفاده کنیم.
در این آموزش اندروید، نحوه ی ایجاد implicit intent آموزش داده خواهد شد، همچنین نحوه ی استفاده از implicit intent برای راه اندازی یک activity و اجرای action در برنامه ی دیگر توضیح داده خواهد شد.
ساخت Implicit Intent
Implicit intentها نام کلاس کامپوننتی که باید راه اندازی شود را مشخص نمی کنند، بلکه به جای آن "action" که باید انجام شود را مشخص می کنند. action کاری که باید انجام شود مانند مشاهده، ویرایش، ارسال یا دریافت چیزی را مشخص می کند. Intentها اغلب حاوی اطلاعات مرتبط با عملیات هستند، اطلاعاتی مانند آدرسی که می خواهید مشاهده کنید، یا پیغام ایمیلی که می خواهید ارسال کنید. بر اساس intent ایجاد شده، داده ها ممکن است یک Uri باشند، انواع داده ی مشخص شده باشند یا ممکن است intent نیاز به داده ای نداشته باشد.
اگر داده های همراه با intent، داده های Uri باشد، سازنده ی ()Intent که برای ساخت action و data استفاده می شود ساده است.
برای مثال، نحوه ی ایجاد یک intent، برای شروع یک تماس تلفنی از طریق داده Uri نمایش داده شده است:
ایجاد یک Intent
Uri number =Uri.parse("tel:5551234");
Intent callIntent =new Intent(Intent.ACTION_DIAL, number);
وقتی که برنامه شما intent بالا را با فراخوانی ()startActivity آغاز کرد، برنامه ی تماس راه اندازی می شود و شروع به تماس شماره تلفن داده شده می کند.
در زیر چند intent دیگر و actionها و Uriهایشان آمده است
- مشاهده ی نقشه:
ایجاد intent مشاهده نقشه
// Map point based on address
Uri location =Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent =newIntent(Intent.ACTION_VIEW, location); - مشاهده ی صفحه وب:
ایجاد intent مشاهده صفحه وب
Uri webpage =Uri.parse("http://www.android.com");
Intent webIntent =newIntent(Intent.ACTION_VIEW, webpage);
نمونه های دیگری از implicit intentها هستند که نیاز به نوع داده ی "extra" دارند تا انواع مختلف مانند رشته و ... را فراهم کنند. می توانید یک یا چند مورد اطلاعاتی بیشتر را با استفاده از متدهای ()putExtra به intent تحویل دهید.
به طور پیش فرض، سیستم نوع MIME مورد نیاز intent را بر اساس نوع Uriی که همراه Intent قرار دارد مشخص می کند. حال اگر Uriی در Intent قرار نگرفت، برای مشخص کردن نوع داده ی مربوط به intent می بایست از متد ()setIntent استفاده کرد. علاوه بر این، تنظیم MIME مشخص می کند که چه activityهایی intent را دریافت کنند.
در زیر چند نمونه از intetnهایی که اطلاعات بیشتر را با مشخص کردن action مورد نظر ارسال می کند نشان داده شده است:
- ارسال یک ایمیل و ضمیمه ی آن:
Intent emailIntent =newIntent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL,newString[]{"این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید"});// recipients
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"));
// You can also attach multiple items by passing an ArrayList of Uris - ایجاد رویدادهای تقویم:
Intent calendarIntent =new Intent(Intent.ACTION_INSERT,Events.CONTENT_URI);
Calendar beginTime =Calendar.getInstance().set(2012,0,19,7,30);
Calendar endTime =Calendar.getInstance().set(2012,0,19,10,30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE,"Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION,"Secret dojo");توجه: intent تقویم تنها در APIهای 14 به بعد پشتیبانی می شود.
تشخیص دادن اینکه آیا برنامه ی دیگری برای دریافت Intent وجود دارد
اگرچه پلاتفرم اندروید تضمین می کند که Intentهای مشخص حتماً به یکی از برنامه های نصب شده ی سیستم تحویل داده می شود (مانند برنامه های تماس، ایمیل، یا تقویم)، اما می بیاست حتماً قبل از درخواست از صحت این موضوع قبل از درخواست intent باخبر شوید.
هشدار: اگر intentی را درخواست کردید و هیچ برنامه ای روی دستگاه وجود نداشت که intent را دریافت کند، برنامه ی شما با شکست مواجه می شود. |
برای تشخیص اینکه حتماً یک activity به Intent پاسخ می دهد، متد ()qeryIntetnActivities را برای دریافت لیستی از activityهایی که Intent شما را دریافت می کنند فراخوانی کنید. اگر لیست برگردانده شده خالی نبود، می توانید به طور با خاطری آسوده از intent استفاده کنید. برای مثال:
تشخیص وجود activity برای پاسخ به Intent
getPackageManager()
;List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,0);
boolean isIntentSafe = activities.size()>0;
اگر isIntentSafe مقدار صحیح یا true باشد، آنگاه حداقل یک برنامه به intent پاسخ می دهد. اگر false باشد، آنگاه هیچ برنامه ای وجود ندارد که intent را مدیریت کند.
نکته: بررسی فوق را باید در ابتدای برنامه ی خود انجام دهید. اگر نیاز بود برخی از ویژگی ها را قبل از اینکه کاربر بخواهد آنها را استفاده کند، غیر فعال می کنید. اگر بدانید برنامه ی خاصی روی سیستم هست که intent شما را مدیریت می کند، می توانید لینک دانلود آن را ایجاد کنید و در اختیار کاربر قرار دهید. |
شروع Activity با Intent
وقتی Intent را ایجاد کردید و اطلاعات اضافی را ارسال کردید، برای ارسال intent به سیستم متد startActivity را فراخوانی نمایید. اگر سیستم بیش از یک Activity را برای مدیریت intent تشخیص داد، یک پنجره به کاربر نمایش می دهد تا کاربر برنامه ای که می خواهد استفاده کند را انتخاب کند. این موضوع در شکل روبه رو نمایش داده شده است. اگر تنها یک برنامه intent را مدیریت می کند، آنگاه سیستم بلافاصله آن را اجرا می کند.
startActivity(intent);
مثال زیر مثال کاملی است که نحوه ی ایجاد یک intent برای مشاهده ی نقشه را نمایش می دهد، در این مثال ابتدا بررسی می شود که آیا برنامه ای هست که intent را دریافت کند یا نه، سپس آن برنامه اجرا می شود:
مثال کامل ایجاد intent
// Build the intent
Uri location =Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent =newIntent(Intent.ACTION_VIEW, location);
// Verify it resolves
PackageManager packageManager =getPackageManager()
;
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent,0);
boolean isIntentSafe = activities.size()>0;
// Start an activity if it's safe
if(isIntentSafe){
startActivity(mapIntent);
}
نمایش پنجره انتخاب برنامه
دقت فرمایید هنگامی که بیش از یک activity وجود دارد که به intent شما پاسخ می دهد، کاربر می تواند یک برنامه را به عنوان پیش فرض انتخاب کند (با تیک زدن گزینه ای که در پایین پنجره نشان داده می شود، گزینه ی منتخب به عنوان پیش فرض انتخاب می شود). این انتخاب زمانی موثر است که کاربر همواره بخواهد یک برنامه را انتخاب کند، مانند وقتی که یک صفحه ی وب را باز می کند (همیشه یک مرورگر را انتخاب کند)یا زمانی که قصد عکاسی دارد (کاربر تنها یک نرم افزار دوربین را ترجیح می دهد.)
با این وجود، اگر Actionی که قرار است اجرا شود، امکان اجرا توسط چند برنامه را داشته باشد، و کاربر هر بار یک برنامه را ترجیح دهد _ مانند زمانی که قصد به اشتراک گذاری دارد، هر بار کاربر از برنامه ی خاصی می خواهد برای به اشتراک گذاری فایل هایش استفاده کند_ می بایست پنجره ی انتخاب برنامه را همانگونه که در شکل روبه رونمایش داده شده است به کاربر نشان دهیم. پنجره ی انتخاب برنامه، کاربر را مجبور می کند هر بار برنامه ای را برای Action اجرای انتخاب کند.
برای نمایش پنجره ی نمایشگر، Intent را با استفاده از ()createChooser ایجاد کنید و سپس آن را به ()startActivity ارسال نمایید:
نمایش پنجره ی انتخاب برنامه
Intent intent =newIntent(Intent.ACTION_SEND);
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser =Intent.createChooser(intent, title);
// Verify the intent will resolve to at least one activity
if(intent.resolveActivity(getPackageManager())!=null){
startActivity(chooser);
}
این کد، پنجره ای را نمایش می دهد که دارای لیستی از برنامه هاست که به intent پاسخ می دهد، و می توان منتی را برای عنوان پنجره انتخاب کرد.پ
- نوشته شده توسط مظاهر نصوحی
- بازدید: 8158