مشخصات مقاله
-
4580
-
0.0
-
17861
-
0
-
1
آموزش Intent در اندروید-intent چیست

دوره آموزش برنامه نویسی اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
آموزش Intent در اندروید )قسمت اول (
این فصل آموزشی شیوه ی بکارگیری intent ها به منظور برقراری ارتباط بین کامپوننت های اندروید را تشریح می کند و بر پایه ی Eclipse 4.4، Java 1.6 و Android 4.4 نوشته شده است.
فهرست محتوا
1. Intent ها و intent filter ها
Intent چیست و چه کاربردی دارد؟
راه اندازی activity مورد نظر (به وسیله ی متد startActivity (intent))
Sub-activity چیست؟
راه اندازی Services به وسیله ی intent
2. انواع intent
معرفی انواع متفاوت intent
Intent های صریح (Explicit intent)
Intent های ضمنی (Implicit intent)
3. انتقال داده بین activity ها
انتقال داده به کامپوننت مقصد (مورد نظر)
مثال : به اشتراک گذاری اطلاعات از طریق (share) intent
بازیابی و دریافت نتیجه از sub-activity
4. معرفی intent filter ها
Intent filter چه کاربردی دارد ؟
تعریف intent filter
مثال 1
ثبت یک activity برای اینتنت ACTION_SEND
5. فعال سازی رویدادها به وسیله ی intent
6. بررسی و شناسایی intent receiver های معتبر
7. تمرین : راه اندازی activity ها
هدف اصلی این تمرین
ایجاد پروژه و طرح بندی اصلی
ایجاد فایل layout جدید
ایجاد activity دیگر
راه اندازی sub-activity
ارسال داده به ResultActivity
دستیابی به داده های intent در ResultActivity
8. تمرین : دریافت داده از sub-activity ها
هدف این تمرین
برگرداندن داده از ResultActivity
ارزیابی اطلاعات بازگشتی
9. راه حل : بکارگیریintent ها
نحوه ی پیاده سازی مطالب این فصل
کد activity
10. تمرین : ثبت و تخصیص یک activity به عنوان مرورگر
هدف از این تمرین
ساختن پروژه
ثبت یک activity به عنوان مرورگر
اعتبارسنجی و تست
تمرین بیشتر : تبدیل آن به یک مرورگر کامل
11. تمرین : انتخاب تصویر به وسیله ی intent
مقصود نهایی تمرین
ایجاد پروژه
تست
12. تمرین : استفاده از intent های ضمنی مختلف
هدف تمرین
ساختن پروژه
تست برنامه
1. Intent ها و intent filter ها
Intent چیست و چه کاربردی دارد؟
Intent ها در واقع مجموعه ای از پیام های ناهمگام (asynch message) هستند که به مولفه های برنامه ی کاربردی (app components) اجازه می دهند از دیگر کامپوننت های اندروید قابلیت درخواست کند (intent در حقیقت یک مکانیزم نرم افزاری می باشد که برای کاربر این امکان را فراهم می کند، بین زیرروال ها یا عملکردهای برنامه های کاربردی هماهنگی ایجاد کرده تا یک وظیفه یا task معینی به انجام برسد). intent ها همچنین این قابلیت را ایجاد می کند که علاوه بر کامپوننت های یک برنامه با کامپوننت های برنامه های کاربردی دیگر نیز تعامل داشته باشید. به عنوان مثال می توان به activity ای اشاره کرد که فعالیتی مثل گرفتن عکس را که متعلق به activity ای دیگر (خارجی) است را راه اندازی (trigger) کند.
Intent ها اشیایی از نوع android.content.intent هستند. کدی که شما می نویسید قادر است آن ها را به سیستم اندروید ارسال کرده تا از این طریق کامپوننت های موردنظر شما تعریف شوند. به طور مثال، می توانید با استفاده از متد StartActivity () به intent دستور بدید که برنامه ی معینی را راه اندازی کند.
Intent از طریق Bundle (= به طور معمول به منظور ارسال اطلاعات بین activity های مختلف اندروید بکار می رود) قادر است اطلاعات لازمه را دربرگیرد، حال این اطلاعات توسط کامپوننت دریافت کنندهreceiving component) ) مورد استفاده قرار می گیرد.
راه اندازی activity مورد نظر (به وسیله ی متد (startActivity intent) )
جهت راه اندازی و اجرای activity، از متد startActivity (intent) استفاده کنید. متد مذکور در شی Context تعریف شده که توسط (کلاس) Activity بسط و توسعه داده می شود.
کد زیر نحوه ی راه اندازی یک activity دیگر را به وسیله ی intent نمایش می دهد.
# Start the activity connect to the
# specified class
Intent i = new Intent(this، ActivityTwo.class);
startActivity(i);
Sub-activities
عبارتند از activity هایی که توسط activity های دیگر راه اندازی می شوند.
راه اندازی Services به وسیله ی intent
همچنین می توان service ها را از طریق intent راه اندازی کرد. برای این منظور متد startService (Intent) را بکارببرید.
2. انواع intent
معرفی انواع متفاوت intent
اندروید از دو نوع intent پشتیبانی می کند : Explicit و Implicit.
یک اپلیکیشن می تواند کامپوننت مقصود را مستقیم داخل intent تعریف کند (که در آن صورت explicit intent نامیده می شود) یا از سیستم اندروید درخواست کند تا مولفه های ثبت شده (registered component) را بر اساس داده های intent ارزیابی کند (که به آن implicit intent گفته می شود).
Intent های صریح (Explicit intent)
این Intent مولفه را ( کامپوننتی را که باید توسط سیستم اندروید فراخوانده شود) با استفاده از کلاس جاوا (java class)، به عنوان شناسه، به صورت صریح تعریف می کند.
کد زیر نحوه ی ایجاد explicit intent و ارسال آن به سیستم اندروید را با مثال نمایش می دهد.
Intent i = new Intent(this، ActivityTwo.class);
i.putExtra("Value1"، "This value one for ActivityTwo ");
i.putExtra("Value2"، "This value two ActivityTwo");
شما اغلب intent های صریح را به منظور راه اندازی activity درون اپلیکیشن خود بکار می برید، در این صورت دقیق اطلاع دارید که کدام activity را می خواهید راه اندازی کنید (و دیگر نیازی به تلاش و زحمت بیشتر که لازمه ی implicit intent هست وجود ندارد).
Intent های ضمنی (Implicit intent)
برخلاف intent های صریح، intent های ضمنی واضح و مستقیم مولفه یا کامپوننتی که باید فراخوانی شود را مشخص نمی کند; به عبارتی روشن تر تنها عمل (action) ای که باید اجرا شود را تعریف می کند ( همچنین می توان با بکارگیری همزمان این نوع intent به همراه یک uri نوع داده را مشخص کرد).
برای مثال تکه کد زیر به سیستم اندروید دستور می دهد، یک صفحه ی وب را نمایش دهد.
Intent i = new Intent(Intent.ACTION_VIEW، Uri.parse("http://www.tahlildadeh.com"));
startActivity(i);
در صورت ارسال intent ضمنی به سیستم اندروید، intent به دنبال همه ی کامپوننت هایی که برای action معین تخصیص یافته و نوع داده ی مناسب آن می گردد.
چنانچه تنها یک کامپوننت یافت شود، اندروید خود به صورت مستقیم کامپوننت مزبور را راه اندازی می کند. اما اگر چندین مولفه با هم توسط سیستم اندروید شناسایی شود، کاربر یک محاوره ی انتخاب (selection dialogue) دریافت می کند که به کاربر اجازه می دهد کامپوننت مناسب را برای intent انتخاب کند.
کامپوننت این قابلیت را دارد که خود را به عملیات (actions) معینی تخصیص دهد.
3. انتقال داده بین activity ها
انتقال داده به کامپوننت مقصد (مورد نظر)
Intent حامل داده های سرآیند (header data) معینی از جمله action / عملیات دلخواه، نوع آن و غیره... می باشد. البته intent می تواند اطلاعاتی اضافه بر سازمان (بر اساس نمونه ی کلاس Bundle) دربرگیرد. نمونه ی کلاس بیان شده (کلاس Bundle) را می توان با استفاده از متد getExtras () از intent مربوط بازیابی (retrieve) کرد.
این امکان نیز وجود دارد که به کمک متدهای اضافه بارگذاری شده ی (overloaded methods) PutExtra () اشیا intent، داده های لازمه را مستقیم به کلاس Bundle اضافه یا ضمیمه کرد. متدهای Extras (= همان intent های putextra و (getextra یک جفت مقدار / کلید (key/value pair) هستند. کلید (key) نام برده همیشه از نوع string رشته است، در رابطه با value می توان علاوه بر اشیإ از نوع string، Bundle، Parceable و Serializable، از نوع داده های اولیه (primitive data types) از جمله int، float (به عنوان مقدار) نیز بهره گرفت.
مولفه ی دریافت کننده (receiving component) قادر است از طریق / با استفاده از متدهای getAction () و getData ()، به اطلاعات مذکور (در شی intent object / intent) دسترسی پیدا کند. حال خود intent object به وسیله ی متد getIntent () قابل بازیابی می باشد.
کامپوننتی که intent موردنظر را دریافت می کند، قادر است با فراخوانی متد getIntent (). getExtras () داده های اضافی را دریافت کند. این امر در تکه کد زیر با مثال به نمایش گذاشته شده.
Bundle extras = getIntent().getExtras();
if (extras == null) {
return;
}
// get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {
// do something with the data
}
مثال : به اشتراک گذاری اطلاعات از طریق (share intent)
تعداد زیادی از برنامه های کاربردی اندروید (android apps) به کاربر این امکان را می دهد تا اطلاعات یا داده های دلخواه را با دیگران به اشتراک بگذارد (از قبیل Facebook، G+، Gmail و twitter). می توانید جهت به اشتراک گذاری اطلاعات مورد نظر، اطلاعات نام برده را به یکی از این مولفه ها ارسال کنید. تکه کد زیر نمونه ای از کاربرد چنین intent ای را در محیط اپلیکیشن با مثال نمایش می دهد.
// this runs، for example، after a button click
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(android.content.Intent.EXTRA_TEXT، "News for you!");
startActivity(intent);
بازیابی نتیجه از sub-activity
همان طور که مستحضر هستید می توان یک activity را در محیط اندروید با استفاده از دکمه ی برگشت (back button) بست. در این مورد، متد finish () فراخوانی شده که در نتیجه برنامه ی مورد نظر را خاتمه می دهد. در صورتی که activity ای به وسیله ی متد startActivity (Intent) آغاز یا راه اندازی شده باشد، فراخوان (caller) دیگر نیازی به بازخورد یا نتیجه از جانب activity ای که هم اکنون بسته شده ندارد.
اما چنانچه activity با استفاده از متد startActivityForResult () فراخوانی شود، در آن صورت باید بازخوردی از جانب sub-activity به کاربر ارسال گردد. پس از این که sub-activity به پایان می رسد، متد onActivityResult () (در sub-activity مرتبط) فراخوانی می شود. اکنون می توان بر اساس نتیجه دریافتی، عملیات (actions) لازم را انجام داد.
می توانید با تعریف یک result code در متد startActivityForResult ()، این امر که در وهله ی اول کدام activity را راه اندازی کردید، تعیین و شناسایی کنید. result code بالا در حقیقت به شما بازگردانده می شود. activity راه اندازی شده نیز قادر است یک result code تنظیم کند / قرار دهد که کاربر با استفاده از آن بتواند دریابد آیا activity گفته شده لغو شده است یا خیر.
Sub-activity متد finish () را بکار می برد تا بدین وسیله intent جدیدی ایجاد کرده و داده های مورد نظر را داخل آن قرار دهد. همچنین با فراخوانی متد setResult ()، sub-activity یک نتیجه قرار می دهد (اینکه نتیجه پس از اتمام activity چه خواهد بود).
نمونه کد زیر نحوه ی فعال سازی و راه اندازی intent با استفاده از متد startActivityForResult () را نشان می دهد.
public void onClick(View view) {
Intent i = new Intent(this، ActivityTwo.class);
i.putExtra("Value1"، "This value one for ActivityTwo ");
i.putExtra("Value2"، "This value two ActivityTwo");
// set the request code to any code you like،
// you can identify the callback via this code
startActivityForResult(i، REQUEST_CODE);
}
در صورت استفاده از متد startActivityForResult ()، activity راه اندازی شده دیگر یک sub-activity محسوب می گردد.
پس از اینکه sub-activity به پایان می رسد، دیگر (sub-activity) قادر خواهد بود داده ها را از طریق intent به فراخوان (caller) برگرداند. کلیه ی این عملیات درون متد finish () صورت می گیرد.
@Override
public void finish() {
// Prepare data intent
Intent data = new Intent();
data.putExtra("returnKey1"، "Swinging on a star. ");
data.putExtra("returnKey2"، "You could be better then you are. ");
// Activity finished ok، return the data
setResult(RESULT_OK، data);
super.finish();
}
بمحض اینکه sub-activity خاتمه می یابد، متد onActivityResult () در activity فراخوان (calling activity) صدا زده می شود.
@Override
protected void onActivityResult(int requestCode، int resultCode، Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
if (data.hasExtra("returnKey1")) {
Toast.makeText(this، data.getExtras().getString("returnKey1")،
Toast.LENGTH_SHORT).show();
}
}
}