استفاده از مفاهیم ضمنی (implicit intents)
تماشای برخط [لینک مستقیم] فیلم «آموزش نحوه استفاده از مفاهیم ضمنی»
زیرنویس انگلیسی [English Subtitile]
دریافت نسخه ی pdf این آموزش [2.78 مگابایت]
حالا که خوب مفاهیم آشکار رو متوجه شدیم، وقتشه که به مفاهیم ضمنی بپردازیم، برای درک بهتر از یه مثال شروع میکنیم.
خوب برگردیم به ادامه آموزش، گفتیم که برنامهی Gallery با استفاده از یه مفهوم (intent) یه پیغام به سیستم میفرسته، حالا از کجا بفهمیم، این مفهوم چه پیغامی رو به فرستاده؟ برای اینکار دکمهی share رو تو شبیهساز میزنیم بعد به ایکلیپس میریم و اگه تو LogCat نگاه کنیم، خط های آخرش نوشته :
Starting: Intent { act=android.intent.action.SEND type=image/jpeg ...
android.intent.action.SEND یه مفهوم ضمنیه، که همراه با خودش نوع دادهای تصویر از نوع jpeg رو داره.
۲.بیاید یه برنامه بسازیم که بتونه به پیغامی که دکمهی share میده، جواب بده. اول یه پروژهی جدید میسازیم، بعد به AndroidManifest.xml میریم، جایی که میتونیم یه مفهوم ضمنی بسازیم، توی پروژه یه فعالیت (activity) اصلی داریم که من اسمشو گذاشتم main. و مشاهده میکنید که برای این فعالیت یه intent-filter وجود داره که قبلا دریارهاش توضیح دادم. برای ساختن یه مفهوم دیگه، همون بلوک intent-filter رو کپی میکنیم، هر کدوم از این بلوکها به سیستم میگه که این فعالیت قادر به مدیریت این مفاهیمه.
در قسمت action کد جدید به جای MAIN می نویسیم، SEND.
برای category هم مقدار DEFAULT رو به جای LAUNCHER مینویسیم. این category به سیستم میگه که این مفهوم ا چه نوعیه که معمولا همون مقدار پیش فرض رو می ذاریم و خلاص :دی
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
۳.مورد بعدی که باید اضافه کنیم، یه تگ data است که نوع دادهای که میتونیم با این مفهوم مدیریت کنیم رو به اندروید میگه. یکی از حصوصیاتش mimetype هست که مساوی */image می ذاریم به این معنی که هرنوع عکسی رو می تونه مدیریت کنه.
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter>
با اضافه کردن همین چند خط کد، برنامه مون این توانایی رو پیدا میکنه که اگه کسی خواست عکسی رو بفرسته و روی دکمهی share کلیک کرد، ما هم میتونیم اون رو براش مدیریت کنیم.
۴.وقتی عکس از برنامهی Gallery برامون فرستاده شد، بیاید یه راهی برای نمایش اون فراهم کنیم. به فایل main.xml داخل layout میریم و اون فیلد متنی رو پاک میکنیم. و از ستون سمت چپ تو قسمت Images & Media یه کدوم از گزینه هایی که می تونه تصویر رو نشون بده رو انتخاب میکنیم، و یه عکس الکی می ذاریم روش.
بعد به فایل جاوای مربوط به این xml میریم، که main.java هست. اول یه مرجع از اون imageView که تو فایل xml گذاشتیم میگیریم. با نوشتن این کد (قبلا مفصل توضیح داده شده):
ImageView image = (ImageView) findViewById(R.id.imageView1);
۵.حالا میخوایم اون عکسی که از Gallery برامون فرستاده میشه رو به عنوان محتویات این imageView قرار بدیم. با استفاده از تابع setImageURI از کلاس imageView. این تابع باید به جایی اشاره کنه که قراره از اونجا محتویات تصویر مشخص بشه. و ما میخوایم این محتویات رو از مفهوم ضمنی بگیریم، پس مینویسیم (تو پست قبل توضیح دادم):
image.setImageURI(getIntent().getExtras().get(Intent.EXTRA_STREAM));
از setImageURI خطا میگیره، باید crtl+1 رو بزنید و اولین گزینه ی تصحیح اینه که cast کنید. پس اینجوری می شه:
image.setImageURI((Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM));
این Intent.EXTRA_STREAM تمام رشته ای که این مفهوم میفرسته رو میگیره که در واقع آدرس URI همون عکسه است.
۶.برنامه رو run کنید. وقتی بالا میاد یه خطا میگیره که انتظارش هم میرفت، چون وقتی همین جوری برنامه رو اجرا کنید آدرس هیچ عکسی فرستاده نشده و موقعی که دارید واقعا برنامه تولید میکنید باید به این خطاها فکر کنید و راه حلی براشون پیدا کنید.
۷.حالا به Gallery میریم و روی عکس دکمهی share رو میزنیم، و میبینیم که برنامهی ما هم به لیستی که میتونه این کارو انجام بده اضافه شده!
و با انتخاب برنامهی خودمون میبینیم که عکس فرستاده شده نمایش داده میشه.
خیلی خوب و پرحوصله توضیح دادید. عالی