برقراری ارتباط بین اکتیویتی ها و اپلیکیشن ها در اندروید - بخش دوم

برقراری ارتباط بین اکتیویتی ها و اپلیکیشن ها در اندروید - بخش دوم

در مطلب قبلی شما را با انواع اینتنت ها آشنا کردیم، در ادامه نحوه استفاده از هریک را شرح خواهیم داد، با ما همراه باشید.

5. افزودن Extras به یک اینتنت

برخی از اینتنت ها به داده های اضافی برای عملکرد صحیح نیاز دارند، این داده های اضافی extra نامیده می شوند. یک extra در حقیقت یک جفت کلید-مقدار است که متعلق به آبجکت Bundle می باشد. استفاده از یک Bundle مشابه استفاده از HashMap با دو محدودیت است:

- کلیدها باید همیشه آبجکت های String باشند.

- مقادیر باید همیشه primitives یا آبجکت های Parcelable باشند.

استفاده از Extras با اینتنت های ضمنی و صریح امکان پذیر است، جهت افزودن یک extra به آبجکت Intent می توانید از متد ()putExtra استفاده کنید. برای مثال در زیر نحوه افزودن یک extra با کلید message و مقدار Hello نشان داده شده است:

intent.putExtra("message", "Hello");

6. استفاده از اینتنت

حال که نحوه ساخت یک اینتنت را درک کرده و داده ها و extras را به آن اضافه کردید، نحوه استفاده از آبجکت های Intent برای شروع اکتیوتی ها را شرح می دهیم. ساده ترین راه برای شروع یک اکتیویتی ارسال یک آبجکت Intent به عنوان آرگومنت متد ()startActivity می باشد.

startActivity(intent);

متد ()startActivity زمانی استفاده می شود که می خواهید بین دو اکتیویتی جابجا شوید، به بیان دیگر ()startActivity به شما کمک می کند تا کاربر را از یک صفحه از اپلیکیشن به دیگری منتقل نمایید.

چنانچه مایل به شروع اکتیویتی جهت اجرای یک عملیات خاص و دریافت نتیجه از این عملیات هستید، باید از متد ()setActivityForResult به جای متد قبلی استفاده نمایید. این متد علاوه بر آبجکت Intent به یک عدد صحیح که برای تشخیص نتیجه اکیتویتی استفاده می کنید، نیاز دارد، این عدد صحیح به عنوان request code شناخته شده است.

به علاوه، برای اینکه قادر به دریافت نتیجه اکتیویتی باشید که با کمک ()startActivityForResult شروع شده است، لازم است تا متد ()onActivityResult را اورراید نمایید. برای مثال قطعه کد زیر نحوه ساخت یک اینتنت ضمنی برای گرفتن عکس با استفاده از اپلیکیشن دوربین پیش فرض گوشی و دریافت یک تصویر بندانگشتی از عکس گرفته شده به عنوان نتیجه عملیات را نشان می دهد:

// An integer to identify the result of the

// camera app's activity

final static int CAMERA_RESULT_REQUEST_CODE = 1;

private void takePhoto() {

Intent intent = new Intent();

// Use ACTION_IMAGE_CAPTURE to refer to the

// default camera app's activity

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

// Launch the activity, and specify that

// you expect a result whose request

// code is equal to CAMERA_RESULT_REQUEST_CODE

startActivityForResult(intent, CAMERA_RESULT_REQUEST_CODE);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent result) {

// Check if requestCode matches the request

// code passed to the startActivityForResult method.

// Also check if the result is valid using the

// resultCode parameter

if(requestCode == CAMERA_RESULT_REQUEST_CODE && resultCode == RESULT_OK) {

Bitmap thumbnail =

(Bitmap)result.getExtras().get("data");

}

}

توجه داشته باشید که نتیجه اکتیوتی هم یک آبجکت  Intent می باشد. در قطعه کد بالا، اول از متد ()getExtras جهت واکشی Bundle که دربرگیرنده extrasهایی بود که به نتیجه تعلق دارند استفاده شده است و سپس متد ()get به منظور واکشی تصویر بندانگشتی به عنوان آبجکت Bitmap مورد استفاده قرار گرفته است.

7. استفاده از فیلترهای اینتنت

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

برای اینکه اکتیویتی در دسترس اپلیکیشن های دیگر قرار گیرد باید یک فیلتر اینتنت برای آن بسازید، برای این کار باید یک تگ intent-filter را در فایل AndroidManifest.xml پروژه اضافه کنید.

برای مثال اگر مایل باشید که یک اکتیویتی به نام MyCustomActivity به یک اکشن کاستوم به نام my.custom.action پاسخ دهد، باید در فایل منیفست چنین چیزی داشته باشید:

<activity android:name=".MyCustomActivity">

<intent-filter>

<action android:name="my.custom.action"/>

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

توجه کنید که در کنار تگ action که نام اکشن را نشخص می کند، تگ intent-filter نیز باید دربرگیرنده یک تگ category باشد که ویژگی name آن به android.intent.category.DEFAULT ست شده است. بدون تگ category اکتیویتی شما قادر به پاسخ گویی به اینتنت های ضمنی نخواهید بود.

با کمک فیلتر اینتنتی که ساختید، اپلیکیشن شما قادر به شروع MyCustomActivity با استفاده از کد زیر می شود:

Intent intent = new Intent();

// The string passed to the setAction method

// must match the action name mentioned in the

// intent filter

intent.setAction("my.custom.action");

startActivity(intent);

چنانچه ترجیح می دهید که بدون استفاده از فیلترهای اینتنت یک اکتیویتی را در دسترس سایر اپلیکیشن ها قرار دهید، می توانید یک ویژگی exported به تعریف اکتیویتی در فایل منیفست اضافه کرده و مقدار آن را به true ست کنید.

<activity android:name=".MyCustomActivity" android:exported="true"/>

در این شرایط سایر اپلیکیشن ها تنها با استفاده از اینتنت های صریح قادر به شروع اکتیویتی خواهند بود.

جمع بندی

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

جهت کسب اطلاعات بیشتر و جزئی تر درباره اینتنت ها می توانید به این لینک مراجعه نمایید.

 

https://code.tutsplus.com برگرفته از

اینها را هم بخوانید