09- اجازه دادن به برنامه های دیگر برای شروع activity شما
مترجم: الهه اشجعی
آدرس: http://developer.android.com/training/basics/intents/filters.html
دو درس قبلی در یک طرف داستان متمرکز شده است: شروع activity های برنامه
دیگر از برنامه شما. اما اگر برنامه شما می تواند عملی را که ممکن است برای
یکی دیگر از برنامه ها مفید است را انجام دهد، برنامه شما باید برای پاسخ
به درخواست از برنامه های دیگر آماده باشد. برای مثال، اگر شما یک برنامه
اجتماعی که می تواند پیام ها و یا عکس ها را با دوستان کاربر به اشتراک
بگذارد بسازید، برای حمایت از مفهوم ACTION_SEND یکی از علاقه مندی های
شماست که کاربران می توانند یک "بخش" از برنامه دیگر را راه اندازی کنند و
برنامه خود را برای عملیاتی کردن اجرا کنید.
برای اجازه دادن به برنامه های دیگر برای شروع activity شما، نیاز به اضافه کردن یک عنصر در فایل مانیفست خود برای عنصر
مربوطه می باشد. هنگامی که نرم افزار شما بر روی یک دستگاه نصب می شود،
سیستم فیلتر هدف شما را شناسایی و اطلاعات را به کاتالوگ داخلی مفاهیم
پشتیبانی شده توسط تمام برنامه های نصب شده اضافه می کند.
هنگامی که یک
برنامه startActivity() و یا startActivityForResult() با هدف ضمنی
فراخوانی می شود، سیستم activity (یا activity هایی) که می توانند به هدف
پاسخ دهند را پیدا می کند.
اضافه کردن فیلتر مفهومی
به منظور درستی تعریف از اینکه activity های شما کدام مفاهیم را می تواند
اداره کند، هر فیلتر هدفی که شما اضافه می کنید باید از نظر نوع عمل و داده
هایی که با عنوان خاص فعالیت می کنند، امکان پذیر باشد.
این سیستم ممکن است قصد داده شده را به یک activity بفرستد، در صورتی که
activity دارای یک فیلتر مفهوم باشد، معیارهای زیر مفهوم را برآورده می
سازد:
Activity
رشته نامگذاری شده برای انجام عملیات. معمولا یکی از مقادیر پلت فرم های تعریف شده مانند ACTION_SEND یا ACTION_VIEW می باشد.
اطلاعات
شرح اطلاعات مرتبط با هدف.
این را در فیلتر مفهوم خود با عنصر مشخص کنید. با استفاده از یک یا
چند ویژگی در این عنصر، شما می توانید فقط نوع MIME، فقط یک پیشوند URI،
فقط یک طرح URI، و یا ترکیبی از این و دیگران که نوع داده مورد قبول را
نشان می دهد، تعیین کنید.
توجه: اگر شما نیازی به اعلام جزئیات در مورد داده Uri ندارید(مانند زمانی
که activity های خود را دسته به نوع دیگری از داده های" اضافی"، به جای یک
URI)، شما باید تنها اندروید را مشخص کنید:صفت خاصه mimeType برای اعلان
نوع داده هایی که activity های شما را اداره می کند، از جمله متن / ساده و
یا تصویر / JPEG.
دسته بندی
ارائه یک روش اضافی برای مشخص کردن activity های دست یابی به هدف، معمولا
به ژست کاربر و یا مکانی که از آن آغاز شده مرتبط است. چندین دسته مختلف
پشتیبانی شده توسط سیستم وجود دارد، اما اغلب آنها به ندرت استفاده می شود.
با این حال، تمام مفاهیم ضمنی با CATEGORY_DEFAULT به طور پیش فرض تعریف
شده است.
این مساله را در فیلتر مفهوم خود با عنصر مشخص کنید.
در فیلتر مفهوم خود، می توانید اعلام کنید که activity های شما چه معیاری
را با اعلام هر یک از آنها با عناصر XML مربوطه تو در تو در عنصر
می پذیرد. به عنوان مثال، در اینجا یک activity با یک فیلتر مفهوم که
مفهوم ACTION_SEND را زمانی که نوع داده یا متن یا یک تصویر است را مدیریت
می کند:
< activity android:name="ShareActivity">
< intent-filter>
< action android:name="android.intent.action.SEND"/>
< category android:name="android.intent.category.DEFAULT"/>
< data android:mimeType="text/plain"/>
< data android:mimeType="image/*"/>
< /intent-filter>
< /activity>
هر مفهوم ورودی تنها یک عمل و یک نوع داده را مشخص می کند، اما آن برای اعلان چندین نمونه از یک ، و عناصر در هر مشکلی ندارد.
اگر هر دو جفت از عمل و داده ها در رفتارهای خود متقابلا منحصر به فرد
باشند، شما باید فیلتر مفهوم جداگانه ایجاد کنید تا مشخص باشد که کدام
اقدامات زمانی با انواع داده های زوج قابل قبول است.
به عنوان مثال، فرض کنید activity های شما هر دو دسته متن و تصاویر را برای
هر دو ACTION_SEND و مفاهیم ACTION_SENDTO مدیریت می کند. در این مورد،
شما باید دو فیلتر مفهوم جداگانه را برای دو عمل تعریف کنید چرا که یک
ACTION_SENDTO باید از داده های UrI برای شناسایی آدرس گیرنده با استفاده
از ارسال و یا طرح URI sendto استفاده کند.برای مثال:
< activity android:name="ShareActivity">
< intent-filter>
< action android:name="android.intent.action.SENDTO"/>
< category android:name="android.intent.category.DEFAULT"/>
< data android:scheme="sms" />
< data android:scheme="smsto" />
< /intent-filter>
< intent-filter>
< action android:name="android.intent.action.SEND"/>
< category android:name="android.intent.category.DEFAULT"/>
< data android:mimeType="image/*"/>
< data android:mimeType="text/plain"/>
< /intent-filter>
< /activity>
توجه: به منظور دریافت مفاهیم ضمنی، شما باید دسته CATEGORY_DEFAULT را
در فیلتر مفهوم اضافه کنید. روش startActivity() و
startActivityForResult() چنانچه تمام مفاهیم به عنوان دسته آنها
CATEGORY_DEFAULT اعلام شده باشد، اینگونه رفتار می کند. اگر شما آن را در
فیلتر مفهوم خود اعلام نکنید، هیچ مفهوم ضمنی ای activity های دوباره شما
را حل نخواهد کرد.
جهت کسب اطلاعات بیشتر در مورد ارسال و دریافت مفاهیم ACTION_SEND که انجام
رفتارهای اجتماعی به اشتراک می گذارد، فصل در مورد دریافت اطلاعات ساده از
دیگر نرم افزارها را مشاهده کنید.
بکار بردن مفهوم در activity شما
به منظور تصمیم گیری در باره ایکه چه اقداماتی را در activity های خود بکار
ببرید، شما می توانید از مفهومی که در شروع آن مورد استفاده قرار گرفت را
بخوانید.
هنگامی که activity های شما آغاز می شود،() getIntent را برای بازیابی
مفهومی که activity را آغاز کرده است، فراخوانی کنید. شما می توانید در هر
زمان در طول چرخه عمر activity را انجام دهید، اما شما به طور کلی باید
این کار را در طول تماس مجدد زودهنگام فرم هایی نظیر OnCreate() و یا
onStart() انجام دهید.
برای مثال:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}
بازگرداندن نتیجه
اگر می خواهید نتیجه را به استناد خود به activity بازگردانید، به سادگی می
توانید setResult() را برای تعیین نتیجه و در نتیجه مفهوم فراخوانی کنید.
هنگامی که عملیات شما انجام می شود و کاربر باید به activity های اصلی
بازگردد، finish() را برای بستن (و نابود کردن) activity های خود فراخوانی
کنید.برای مثال:
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();
شما باید همیشه یک کد نتیجه با نتیجه را مشخص کنید. به طور کلی، آن چه RESULT_OK یا RESULT_CANCELED است. بعد از آن شما می توانید اطلاعات بیشتری را با مفهوم، در صورت لزوم فراهم آورید.
توجه: نتیجه تنظیم کردن RESULT_CANCELED به طور پیش فرض است. بنابراین در صورتی که کاربر دکمه برگشت را قبل از اتمام عمل و قبل از اینکه شما نتیجه را تنظیم کنید بفشارد، activity اصلی نتیجه "لغو" را دریافت می کند.
چنانچه شما به سادگی نیاز به بازگشت به یک عدد صحیح که نشان دهنده یکی از گزینه های مختلف نتیجه است داشته باشد، شما می توانید کد نتیجه را به هر مقدار بالاتر از 0 تنظیم کنید. این کار به خوبی انجام می شود، زمانی که شما در حال بازگرداندن یک نتیجه به یک activity در برنامه های خود هستید، چرا که activity ای که نتیجه را دریافت می کند، می تواند ثابت ای عمومی برای تعیین ارزش نتیجه مرجع باشد.
توجه : هیچ نیازی برای بررسی اینکه آیا activity خود را با startActivity() و یا startActivityForResult() آغاز کرده اید، وجود ندارد. چنانچه از مفهومی که activity شما را آغاز کرده است، انتظارحصول نتیجه می رود setResult() را فراخوانی کنید. چنانچه منشا activity به نام startActivityForResult() بود، آنگاه سیستم نتیجه ای را که شما به setResult() عرضه می کنید را می رساند، در غیر اینصورت نتیجه نادیده گرفته می شود.
- ۹۳/۰۳/۰۲
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.