سبد (0)

فیلم آموزش برنامه نویسی اندروید

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

    1. شروع یک activity
    2. دریافت نتیجه

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

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

    آموزش اندروید - دریافت نتایج از Activity

    شروع یک برنامه لازم نیست که یک طرفه باشد. می توانید یک activiy دیگر را اجرا کنید و نتیجه را از آن برنامه دریافت کنید، برای دریافت نتیجه متد ()startActivityForResult را فراخوانی نمایید. (به جای ()startActivity).

    برای نمونه، برنامه ی شما می تواند دوربین را راه اندازی کند و عکس های گرفته شده را به عنوان نتیجه دریافت کند. یا، می توانید برنامه ی مخاطبین را به منظور انتخاب یک تماس شروع کرد و جزییات تمای به عنوان نتیجه دریافت شود.

    دقت نمایید که Activity که پاسخ می دهد می بایست طوری طراحی شده باشد که نتیحه را برگرداند. اگر این طور طراحی شده باشد، نتیجه را به عنوان یک شیء intent دیگر صدا می زند. برنامه ی شما Intent را با استفاده از متد ()onActivityResult دریافت می کند. 

    توجه: وقتی که از متد ()startActivityForResult استفاده می کنید می توانید از intentهای implicit یا explicit استفاده کنید. وقتی که یکی از Activityهایتان را برای دریافت نتیجه راه اندازی کردید، می بایست از Explicit intent برای تضمین دریافت نتیجه ی مورد انتظار استفاده کنید.


    شروع یک activity

    مطلب اضافه تری در مورد شیء Intent که در برگرداندن نتیجه ی activity استفاده می شود وجود ندارد، اما می بایست یک عدد صحیح اضافه تر به عنوان آرگومان به متد ()startActivityForResult ارسال کنیم.

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

    برای مثال، در زیر یک نحوه ی شروع یک activity را می بینید که به کاربر اجازه می دهد یک مخاطب را انتخاب کند:

     

    شروع یک Activity

     

    staticfinalint PICK_CONTACT_REQUEST =1; // The request code
    ...
    privatevoid pickContact(){
    Intent pickContactIntent =newIntent(Intent.ACTION_PICK,Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE);// Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
    }

    دریافت نتیجه

    وقتی کاربر با Activity جدید کارش تمام شد و به برنامه برگشت ، سیستم متد ()onActivityResult مربوط به activity شما را اجرا می کند. این متد حاوی سه آرگومان می باشد:

    • کد درخواستی که شما به ()startActivityForResult ارسال کردید.
    • کد درخواستی که توسط Activity دوم مشخص شد. این کد می تواند مقادیر RSULTT_OK باشد که نشان می دهد عملیات موفق بوده است یا می تواند مقدار RESULT_CANCELED باشد که در صورتی که کاربر به برنامه برگردد یا به هر دلیل دیگری عملیات با شکست مواجه شود، این مقدار بر می گردد.
    • یک Intent که داده های خروجی را انتقال می دهد.

    برای مثال، در زیر نحوه ی مدیریت نمایش را برای intentی که "یک مخاطب" را درخواست می کند آورده شده است:

    درخواست یک مخاطب

     
    @Override
    protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){
    // Check which request we're responding to
    if(requestCode == PICK_CONTACT_REQUEST){
    // Make sure the request was successful
    if(resultCode == RESULT_OK){
    // The user picked a contact.
    // The Intent's data Uri identifies which contact was selected.

    // Do something with the contact here (bigger example below)
    }
    }
    }
     

    در این مثال، Intent نتیجه توسط برنامه ی مخاطبین اندروید برگشت می شود. این Intent حاوی یک Uri است که مخاطبی را کاربر انتخاب کرده مشخص می کند.

    برای اینکه نتیجه با موفقیت مدیریت شود، می بایست فرمت Intent نتیجه را شناخت. وقتی که activity که نتیجه را بر می گرداند نیز یکی از Activityهای شما باشد، شناخت این فرمت بسیار آسان است. برنامه هایی که در پلاتفرم اندروید هستند نیز api مخصوص خودشان را استفاده می کنند و می توانید روی آن ها برای تنایج خاص حساب باز کنید. برای نمونه، برنامه ی مخاطبین هموراه نتیجه را به صورت URIی که مخاطب انتخاب شده را مشخص می کند بر می گرداند، و برنامه ی دوربین نیز تصاویر را در داده ی extra ارسال می کنند.

    Bonus: Read the contact data

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

    نحوه ی نمایش اطلاعات تماس

     
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
    // Check which request it is that we're responding to
    if(requestCode == PICK_CONTACT_REQUEST){
    // Make sure the request was successful
    if(resultCode == RESULT_OK){
    // Get the URI that points to the selected contact
    Uri contactUri = data.getData();
    // We only need the NUMBER column, because there will be only one row in the result
    String[] projection ={Phone.NUMBER};

    // Perform the query on the contact to get the NUMBER column
    // We don't need a selection or sort order (there's only one result for the given URI)
    // CAUTION: The query() method should be called from a separate thread to avoid blocking
    // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
    // Consider using CursorLoader to perform the query.
    Cursor cursor = getContentResolver()
    .query(contactUri, projection,null,null,null);
    cursor.moveToFirst();

    // Retrieve the phone number from the NUMBER column
    int column = cursor.getColumnIndex(Phone.NUMBER);
    String number = cursor.getString(column);

    // Do something with the phone number...
    }
    }
    }


     
    Note

    توجه: قبل از نسخه 2.3 (api 9)، اجرای پرس و جو روی Contacts Provider (مانند کد بالا) نیازمند این بود که کاربر مجوز READ_CONTACTS را داشته باشد. با این وجود، از اندروید 2.3 به بعد، برنامه ی مخاطبین به برنامه ی شما یک مجوز موقت می دهد تا از Contacts Provider بخواند. مجوز موقت تنها روی مخاطب درخواست شده اعمال می شود، بنابراین نمی توان پرس و جویی را روی مخاطبینی به جز آن چه در Uri مشخص شده است اجرا کرد، مگر اینکه مجوز READ_CONTACTS داشته باشید.

    READ MORE
  • آن چه در این درس خواهید آموخت:

    1. ذخیره ی اطلاعات وضعیت Activity
    2. بازیابی وضعیت Activity

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

    • پشتیبانی از صفحات نمایش مختلف

    خودتان امتحان کنید:

    دانلود دمو »

    ایجاد دوباره ی Activity

    خیلی کم پیش می آید که activity شما به صورت عادی خاتمه پیدا کند، یعنی کاربر دکمه ی برگشت یا Back را فشار بدهد و خودش برنامه را با فراخوانی متد ()finish خاتمه دهد. سیستم ممکن است activity شما را زمانی که در حالت stopped قرار دارد و مدت زیادی است که از آن استفاده نمی شود، خود به خود خاتمه دهد. سیستم همچنین ممکن است Activity شما را وقتی که برنامه ی فعال یا Activity فعال نیاز به منابع بیشتری دارد برنامه ی شما را خود به خود خاتمه دهد بنابراین سیستم اندروید برای بازیابی حافظه ممکن است برنامه های پس زمینه را خاتمه دهد.

    هنگامی که activity با استفاده از دکمه ی برگشت خاتمه پیدا می کند، یا اینکه خود Activity خودش را خاتمه می دهد، نمونه ی activity برای همیشه از بین رفته است، زیرا این گونه خاتمه مبین آن است که Activity بیشتر از این نیاز نبوده است. با این وجود، اگر سیستم به خاطر برخی از محدودیت ها activity را خاتمه دهد، آنگاه اگرچه نمونه واقعی activity از بین رفته است، اما سیستم به خاطر می آورد که این Activity قبلاً وجود داشته است (مانند زمانی که کاربر به آن باز می گردد)، بنابراین سیستم با استفاده از مقادیر ذخیره شده ی مربوط به وضعیت Activity قبل از خاتمه ی آن، یک نمونه ی جدید از activity را ایجاد می کند. داده های ذخیره شده ای که در سیستم اندروید استفاده می شود تا وضعیت قبلی بازیابی شود را اصطلاحاً "instance state" می نامند و در حقیقت مجموعه ای از زوج های کلید مقدار هستند که در شیء Bundle ذخیره شده است. 

    Note

    هشدار: هربار که کاربر صفحه ی نمایش را می چرخاند، Activity از بین می رود و مجدداً ایجاد می شود. هنگامی که جهت صفحه ی نمایش تغییر پیدا می کند، سیستم Activity فعال و پیش روی صفحه نمایش را از بین می برد و آن را دوباره ایجاد می کند، زیرا تنظیمات پیکربندی صفحه ی نمایش تغییر یافته است و Activity شما می بایست، منابع جدیدی (مانند چیدمان) را بارگذار کند.


    به طور پیش فرض، سیستم از وضعیت Bundle برای ذخیره ی اطلاعات مربوط به شیء View در چیدمان activity استفاده می کند (مانند متن داخل شیء EditText). بنابراین، اگر نمونه ی Activity شما  از بین رفت و مجدداً ایجاد شد، وضعیت چیدمان به حالت قبل برمی گردد بدون اینکه نیاز باشد شما کدی را بنویسید. با این وجود، ممکن است Activity اطلاعات بیشتری برای آن وضعیت داشته باشد که می بایست بازیابی شود، مانند متغیرهایی که میزان پیشرفت کاربر در activity را نشان می دهد.

    Note

    توجه: به خاطر اینکه سیستم اندروید وضعیت view ها را در activity شما بازیابی کند، هر view می بایست یک شناسه ی منحصر بفرد داشته باشد،این شناسه توسط خصوصیت android:id فراهم شده است.

    برای ذخیره ی اطلاعات بیشتر در مورد وضعیت Activity، شما می بایست متد را ()onSaveInstanceState لغو و بازنویسی کنید. سیستم هنگامی که کاربر در حال ترک activity است این متد را فراخوانی می کند، و شیء Bundle را به آن ارسال می کند تا زمانی که Activity به صورت ناخواسته از بین رفت این شیء ذخیره شود. اگر سیستم مجبور شد که نمونه ی activity را در زمان های آتی مجدداً ایجاد کند، هم به متد  ()onCreate و هم به متد ()onRestoreInstanceState شیء Bundle را پاس می دهد.

    توضیح شکل:وقتی سیستم شروع به توقف activity شما کرد، سیستم متد ()onSaveInstanceState را فراخوانی می کند (1) بنابراین شما می توانید اطلاعات بیشتری در مورد وضعیت را برای وقتی که Activity قرار است مجدداً ایجاد شود را ذخیره کنید. اگر Activity از بین رفت و Instance مشابهی می بایست ایجاد شود، سیستم اطلاعات وضعیتی که در مرحله (1) ذخیره شده بود را هم برای متد ()onCreate ارسال می کند (2) و هم برای متد ()onRestoreInstanceState ارسال می کند(3).


    ذخیره ی اطلاعات وضعیت Activity

    هنگامی که Activity متوقف شد، سیستم متد ()onSaveInstanceState را فراخوانی می کند، بنابراین Activity می تواند اطلاعات وضعیت را با استفاده از مجموعه ای از مقادیر کلید-مقدار ذخیره کند. در پیاده سازی پیش فرض این متد، اطلاعات وضعیت سلسله مراتب view مانند متن داخل EditText یا مکان اسکرول ListView ذخیره می شود.

    برای ذخیره سازی اطلاعات بیشتر در مورد وضعیت، شما می بایست متد ()onSaveInstanceState را پیاده سازی کنید و زوج های کلید مقدار را به شیء Bundle اضافه کنید. مثال زیر دقیق تر مطلب فوق را بیان می کند:



    مثال پیاده سازی ()onSaveInstanceState

     
    staticfinalString STATE_SCORE="playerScore";
    staticfinalString STATE_LEVEL="playerLevel";
    ...

    @Override
    publicvoid onSaveInstanceState(Bundle savedInstanceState){
       
    // Save the user's current game state
        savedInstanceState
    .putInt(STATE_SCORE, mCurrentScore);
        savedInstanceState
    .putInt(STATE_LEVEL, mCurrentLevel);
       
       
    // Always call the superclass so it can save the view hierarchy state
       
    super.onSaveInstanceState(savedInstanceState);
    }

    Note

    هشدار: همواره پیاده سازی مربوط به SupperClass (کلاسی که Activity از آن ارث بری می کند) را فراخوانی کنید. با این کار اطلاعات مربوط به وضعیت سلسله مراتبی view ذخیره می شود.


    بازیابی وضعیت Activity

    هنگامی که Activity از بین رفت و مجدداً ایجاد شد، می توانید وضعیت ذخیره شده ی آن را از با استفاده از شیء Bundle که سیستم برای آن Activity پاس می دهد بازیابی کنید. هم متد ()onCreate و هم متد ()onRestoreInstanceState شیء Bundle مشابهی را که حاوی اطلاعات وضعیت activity است را دریافت می کنند.

    متد ()onCreate در دو حالت صدا زده می شود: هم موقعی که سیستم یک نمونه ی جدید ایجاد می کند و هم موقعی که سیستم یک نمونه Activity قبلی را مجدداً ایجاد می کند، بنابراین شما می بایست قبل از اینکه شروع به خواندن از شیء Bundle کنید، چک کنید که آیا Bundle تهی است یا نه. اگر تهی بود، سیستم در حال ایجاد یک یک نمونه ی جدید از Activity است، در غیر این صورت سیستم می بایست وضعیت قبلی Activity را بازیابی کند.

    مثال زیر، نحوه ی بازیابی برخی از اطلاعات مربوط به وضعیت را در متد ()onCreate نشان می دهد:



    مثال بازیابی اطلاعات وضعیت

     
    @Override
    protectedvoid onCreate(Bundle savedInstanceState){
       
    super.onCreate(savedInstanceState);// Always call the superclass first
       
       
    // Check whether we're recreating a previously destroyed instance
       
    if(savedInstanceState!=null){
           
    // Restore value of members from saved state
            mCurrentScore
    = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel
    = savedInstanceState.getInt(STATE_LEVEL);
       
    }else{
           
    // Probably initialize members with default values for a new instance
       
    }
       
    ...
    }

    ممکن است بخواهید به جای بازیابی اطلاعات وضعیت در متد ()onCreate از متد ()onRestoreInstanceState استفاده کنید.

    سیستم این متد را بعد از متد ()onStart فراخوانی می کند.

    سیستم متد ()onRestoreInstanceState را تنها اگر وضعیت ذخیره شده ای برای بازیابی وجود داشته باشد بازیابی می کند، بنابراین در این حالت نیاز نیست بررسی کنید که آیا شیء Bundle تهی است یا نه.

    Title

    Code
    publicvoid onRestoreInstanceState(Bundle savedInstanceState){
       
    // Always call the superclass so it can restore the view hierarchy
       
    super.onRestoreInstanceState(savedInstanceState);
       
       
    // Restore state members from saved instance
        mCurrentScore
    = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel
    = savedInstanceState.getInt(STATE_LEVEL);
    }
     
    Note

    هشدار: همواره پیاده سازی ()onRestoreInstanceState مربوط به SupperClass (کلاسی که Activity از آن ارث بری می کند) را فراخوانی کنید. با این کار اطلاعات مربوط به وضعیت سلسله مراتبی view که قبلاً به صورت خودکار ذخیره شده بود بازیابی می شود.

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