سبد (0)

آموزش اندروید-برگرداندن نتیجه

آن چه در این آموزش فرا می گیرید:

  1. افزودن Intent Filter
  2. بررسی Intent در activity
  3. برگرداندن نتیجه

مواردی که باید مطالعه کرده باشید:

  • به اشتراک گذاری فایل ها
  • به اشتراک گذاری داده ها

آموزش اندروید - شروع Activity توسط دیگر activityها

دو آموزش اندروید قبلی، روی یک طرف داستان متمرکز شده بود: شروع Activity یک برنامه ی دیگر از داخل برنامه ی خود. حالا اگر برنامه ی شما کارهایی را انجام دهد که برای سایر برنامه ها مناسب است، آنگاه باید برنامه ی شما برای پاسخ به درخواست های سایر برنامه ها آماده شده باشد. برای مثال، اگر شما برنامه ای ایجاد کنید که پیغام ها یا عکس های یک کاربر را با دوستانش به اشتراک بگذارد، خیلی علاقه مند هستید که Intent مربوط به ACTION_SEND را پشتیبانی کنید، بنابراین کاربران می توانند در سایر برنامه ها به اشتراک گذاری را آغاز کنند و برنامه ی ما را برای تکمیل عملیات اجرا کنند.

برای اینکه به سایر برنامه ها اجازه دهیم که برنامه ی ما را اجرا کنند، نیاز داریم که عنصر <intent-filter> را در فایل منیفست برای <activity> مربوطه اضافه کنیم.

وقتی برنامه روی دستگاه اندروید نصب شد، سیستم فیلترهای intent شما را شناسایی می کند و اطلاعات مورد نظر را در کاتالوگ مربوط به intentهایی که برنامه های نصب شده پشتیبانی می کنند اضافه می کند. هنگامی که برنامه ی دیگری ()startActivity یا ()startActivityForResult را به صورت ipmlicit intent فراخوانی می کند، سیستم activityهایی که می توانند به intent پاسخ بدهند را پیدا می کند.


افزودن Intent Filter

برای اینکه به درستی مشخص کنیم که activity ما چه intentهایی را دریافت می کند می بایست هر فیلتر intentی که اضافه می کنیم می بایست تا حد امکان از نظر نوع action و نوع داده، مشخص و خاص باشد.

سیستم به شرطی یک Intent داده شده را به یک Activity ارسال کند که activity فیلتری با معیارهای متناسب با چیزی که شیء Intent درخواست داده را داشته باشد:

  • Action
    رشته ای است که actionی که قرارا است اجرا شود را مشخص می کند. معمولاً یکی از مقادیر تعریف شده در پلاتفرم است مانند ACTION_SEND یا ACTION_VIEW.
    در فیلتر مربوط به المان <action> این رشته را مشخص کنید. مقداری که شما در این المان تعریف می کنید باید نام کامل Action باشد و مقادیر ثابت API قابل قبول نیست (به مثال بعدی توجه فرمایید)
  • Data
    تعریفی است از داده های مرتبط با intent
    در فیلتر مربوط به المان <action> این مقدار را مشخص کنید. با استفاده از یک یا چند خصوصیت در این المان، می توانید نوع MIME، پیشوند URI، شمای URI یا ترکیبی از آن ها که نوع داده ی مورد قبول را مشخص می کند.
    توجه: اگر تعریف جزییات در مورد داده ی Uri لازم نیست، تنها باید خصوصیت android:mimeType را مشخص کنید و نوع داده ای که Activity مدیریت می کنید را اینگونه مشخص می نمایید. نوع text/plain یا image/jpeg مثال های نوع Mime هستند.
  • Category
    روش دیگری را برای Activity فراهم کرده که در آن مدیریت Intent توصیفو طبقه بندی شده است. چندین طبقه بندی مختلف وجود دارد که توسط سیستم اندروید پشتیبانی می شود، البته بیشتر آن ها به ندرت استفاده می شوند. با این وجود همه intentهای implicit به طور پیش فرض با CATEGORY_DEFAULT تعریف می شوند.
    داخل فیلتر با استفاده از المان <category> این گزینه تعریف می شود.

در فیلتر intent می توانید مشخص کنید که Activity شما کدام یک از معیارها را داشته باشد. این معیارها را باید به صورت المان داخل <intent-filter> مشخص کرد.

برای مثال، در زیر یک activity آورده شده است که یک فیلتر intent که عمل ACTION_SEND را مدیریت می کند و دارای نتوع داده ی متن یا تصویر است:

تعریف فیلتر intent

<activityandroid:name="ShareActivity">
<intent-filter>
<actionandroid:name="android.intent.action.SEND"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:mimeType="text/plain"/>
<dataandroid:mimeType="image/*"/>
</intent-filter>
</activity>



هر intent ورودی فقط یک action و یک data را مشخص می کند، اما اشکالی ندارد که در هر عنصر <intent-filter> چندین عنصر <action> <category> یا <data> را مشخص کنیم.

اگر یک زوج Action و data فقط باید با هم باشند و یک زوج دیگر نیز باید با همدیگر باشند، آنگاه بایست هر زوج action و data را در یک فیلتر جداگانه تعریف کرد.

برای مثال، تصور کنید activity شما هم متن و هم تصویر را از طریق intentهای ACTION_SEND و ACTION_SENDTO مدیریت کنند. در این حالت، شما می بایست دو فیلتر مجزا برای هر یک از actionها بنویسید زیرا ACTION_SEND باید با داده ی Uri باشد تا آدرس گیرنده را با استفاده از send یا sendto مشخص کند.

تعریف فیلترهای مجزا

 
<activityandroid:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<actionandroid:name="android.intent.action.SENDTO"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:scheme="sms"/>
<dataandroid:scheme="smsto"/>
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<actionandroid:name="android.intent.action.SEND"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:mimeType="image/*"/>
<dataandroid:mimeType="text/plain"/>
</intent-filter>
</activity>
Note

توجه: به منظور دریافت intentهای implicit، می بایست CATEGORY_DEFAULT را به فیلتر افزود. متدهای ()startActivity و ()startActivityForResult به intentهایی می پردازند که طبقه بندی CATEGORY_DEFAULT را داشته باشند. اگر در فیلترتان آن را تعریف نکنید، هیچ implicit intentی به آن نمی پردازد.


بررسی Intent در activity

In order to decide what action to take in your activity, you can read the Intent that was used to start it.

برای تصمیم اینکه چه Actionی در Activity شما راه اندازی شود، می بایست Intent را بخوانید.

وقتی که activity شما شروع شد، متد ()getIntent برای بازیابی Intentی که Activity را آغاز کرده است فراخوانی کنید. این کار را هر زمان در طول چرخه ی حیات activity انجام بدهید، اما به طور کلی بیشتر این کار را در توابع ()onCreate و ()onStart انجام دهید.

برای مثال:


 
@Override
protectedvoid 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 ...
}elseif(intent.getType().equals("text/plain")){
// Handle intents with text ...
}
}

برگرداندن نتیجه

اگر می خوانید نتیجه را به activity که برنامه ی شما را فراخوانی کرده است، برگردانید،خیلی ساده متد ()setResult را فراخوانی کنید تا کد نتیجه و intent نتیجه را مشخص کند. هنگامی که کارتان انجام شد و کاربر می بایست به activity اصلی بازگردد، متد ()finish را فراخوانی کنید تا activity شما را خاتمه دهد.

مثال (آموزش اندروید-برگرداندن نتیجه)

 
// Create intent to deliver some kind of result data
Intent result =newIntent("com.example.RESULT_ACTION",Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();


 

می بایست کد نتیجه را به همراه نتیجه مشخص کنید، به طور کلی این کد نتیجه یا RESULT_OK یا RESULT_CANCELED می باشد. می توانید اطلاعات بیشتری را در صورت نیاز برای Intent فراهم کنید.

Note

توجه: به صورت پیش فرض کد نتیجه با RESULT_CANCELED تکمیل می شود. بنابراین اگر کاربر قبل از اینکه کار برنامه تمام شود و کد نتیجه پرشود، دکمه ی بازگشت را فشار دهد، آنگاه activity اصلی نتیجه ی canceled را دریافت می کند.

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

 

مثال (آموزش اندروید-برگرداندن نتیجه)

 
setResult(RESULT_COLOR_RED);
finish();
تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehiمجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامیپرداخت آنلاین -  بانک ملتمعرفی بیاموز در شبکه سهپرداخت آنلاین - بانک اقتصاد نوینپرداخت آنلاین - بانک سامان