كيفية استخدام دورة حياة النشاط وحالته

1- مرحبًا

يشكّل هذا الدرس التطبيقي العملي حول الترميز جزءًا من الوحدة 1: البدء في الدورة التدريبية "أساسيات مطوّري برامج Android" (الإصدار 2). ستحصل على أقصى قيمة من هذه الدورة التدريبية إذا عملت من خلال الدروس التطبيقية حول الترميز بالتسلسل:

  • للحصول على القائمة الكاملة للدروس التطبيقية حول الترميز في الدورة التدريبية، يمكنك الاطّلاع على هذه الميزة.
  • ولمعرفة تفاصيل حول الدورة التدريبية، بما في ذلك روابط تؤدي إلى جميع فصول المفاهيم والتطبيقات والشرائح، يمكنك الاطّلاع على أساسيات مطوّري برامج Android (الإصدار 2).

مقدمة

في هذا العملي، تتعلم المزيد عن دورة حياة النشاط. دورة الحياة هي مجموعة الحالات التي يمكن أن يكون فيها النشاط طوال عمره، بدءًا من وقت إنشائه وحتى وقت تدميره واستعادة النظام لموارده. عندما يتنقل المستخدم بين الأنشطة في تطبيقك (وداخله وخارجه)، تنتقل الأنشطة بين حالات مختلفة في دورات حياتها.

مشكلة مضاعفة

لكل مرحلة في دورة حياة النشاط طريقة رد استدعاء مقابلة: onCreate() وonStart() وonPause() وما إلى ذلك. عند تغيير حالة نشاط، يتم استدعاء طريقة معاودة الاتصال المرتبطة. لقد رأيت سابقًا إحدى الطريقتَين التاليتَين: onCreate(). ومن خلال إلغاء أي من طرق معاودة الاتصال في مراحل النشاط ضمن فئات الأنشطة، يمكنك تغيير السلوك التلقائي للنشاط استجابةً لإجراءات المستخدم أو النظام.

يمكن أن تتغيّر حالة النشاط أيضًا استجابةً للتغييرات في إعدادات الجهاز، مثلاً عندما يتدوير المستخدم الجهاز من الوضع العمودي إلى الوضع الأفقي. عند حدوث تغييرات الإعدادات هذه، يتم إتلاف النشاط وإعادة إنشائه في حالته التلقائية، وقد يفقد المستخدم المعلومات التي أدخلها في النشاط. لتجنّب إرباك المستخدمين، من المهم تطوير تطبيقك لتجنُّب فقدان البيانات بشكل غير متوقّع. في وقت لاحق من هذا التطبيق العملي، يمكنك تجربة تغييرات الإعدادات والتعرّف على كيفية الحفاظ على حالة النشاط استجابةً للتغييرات في إعدادات الجهاز وأحداث مراحل نشاط النشاط الأخرى.

في هذا العمل العملي، يمكنك إضافة عبارات تسجيل إلى تطبيق TwoActivity وملاحظة التغيرات في مراحل نشاطها أثناء استخدام التطبيق. وتبدأ بعد ذلك العمل على هذه التغييرات واستكشاف كيفية التعامل مع البيانات التي أدخلها المستخدم في ظل هذه الظروف.

المتطلبات الأساسية

ومن المفترض أن تكون قادرًا على:

  • إنشاء مشروع تطبيق وتشغيله في استوديو Android
  • أضِف بيانات السجلّ إلى تطبيقك واطّلِع على هذه السجلات في لوحة Logcat.
  • فهم النشاط والهدف والعمل عليهما، والشعور بالراحة في التفاعل معهم.

المعلومات التي ستطّلع عليها

  • آلية عمل مراحل نشاط النشاط
  • عندما يبدأ نشاط ويتوقف مؤقتًا ويتوقف ويتم إتلافه.
  • لمحة عن طرق معاودة الاتصال في مراحل النشاط والمرتبطة بالتغييرات في النشاط
  • تأثير الإجراءات (مثل التغييرات في الإعدادات) التي يمكن أن تؤدي إلى أحداث مراحل نشاط النشاط.
  • كيفية الاحتفاظ بحالة النشاط في جميع أحداث مراحل النشاط

الإجراءات التي ستنفذّها

  • أضف رمزًا إلى تطبيق TwoActivities من العملية العملية السابقة لتنفيذ عمليات معاودة الاتصال في مراحل نشاط النشاط المختلفة لتضمين بيانات التسجيل.
  • يمكنك ملاحظة تغيّر الحالة أثناء تشغيل تطبيقك وأثناء تفاعلك مع كل نشاط في تطبيقك.
  • عليك تعديل تطبيقك للاحتفاظ بحالة المثيل لنشاط تتم إعادة إنشائه بشكل غير متوقّع استجابةً لسلوك المستخدم أو تغيير في الإعدادات على الجهاز.

2. نظرة عامة على التطبيق

في هذا العمل العملي، تتم إضافة التطبيق إلى TwoActivities: إلى أنّ مظهر التطبيق وعمله مشابه لما كان عليه في الدرس التطبيقي الأخير حول الترميز. يحتوي على اثنين من عمليات تنفيذ النشاط ويمنح المستخدم القدرة على الإرسال بينهما. لن تؤثر التغييرات التي تجريها على التطبيق في هذا الإجراء العملي على سلوك المستخدم المرئي.

3- 3- المهمة 1: إضافة معاودة الاتصال في دورة الحياة إلى Two Activity

في هذه المهمة، ستُنفذ جميع طرق معاودة الاتصال خلال مراحل نشاط النشاط لطباعة الرسائل لتسجيل الدخول عند استدعاء هذه الطرق. ستتيح لك رسائل السجلّ هذه معرفة متى تتغيّر حالة النشاط خلال مراحل النشاط، ومدى تأثير هذه التغييرات في مراحل النشاط في تطبيقك أثناء تشغيله.

1.1 (اختياري) نسخ مشروع {1/}

بالنسبة إلى المهام في هذا العملي، ستقوم بتعديل مشروع TwoActivities الحالي الذي أنشأته في العمل العملي الأخير. إذا كنت تفضّل الاحتفاظ بمشروع TwoActivity السابق بدون تغيير، اتّبِع الخطوات الواردة في الملحق: الأدوات المساعدة لإنشاء نسخة من المشروع.

1.2 تنفيذ عمليات معاودة الاتصال في MainActivity

  1. افتح مشروع Two Activity في "استوديو Android"، وافتح MainActivity في جزء المشروع > Android.
  2. في طريقة onCreate()، أضف بيانات السجل التالية:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. أضف تجاوزًا لمعاودة الاتصال onStart() ، مع عبارة إلى السجل لهذا الحدث:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

للحصول على اختصار، اختَر الرمز > إلغاء الطُرق في "استوديو Android". يظهر مربع حوار يحتوي على جميع الطرق الممكنة التي يمكنك تجاوزها في فئتك. يؤدي اختيار طريقة واحدة أو أكثر من طرق معاودة الاتصال من القائمة إلى إدراج نموذج كامل لتلك الطرق، بما في ذلك الطلب المطلوب للفئة العليا.

  1. استخدم طريقة onStart() كنموذج لتنفيذ عمليات استدعاء دورة حياة onPause() وonComplete() وonPause() وonStop() ودالة onDestroy()

تحتوي جميع طرق معاودة الاتصال على التوقيعات نفسها (باستثناء الاسم). إذا قمت بنسخ ولصق onStart() لإنشاء هذه الطرق الأخرى لمعاودة الاتصال، لا تنس تحديث المحتويات لاستدعاء الطريقة الصحيحة في الفئة الرئيسية، وتسجيل الطريقة الصحيحة.

  1. شغِّل تطبيقك.
  2. انقر على علامة التبويب Logcat في أسفل "استوديو Android" لعرض لوحة Logcat. من المفترَض أن تظهر لك ثلاث رسائل سجلّ تعرض حالات دورة الحياة الثلاث التي انتقل من خلالها النشاط عند بدئه:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 تنفيذ طلبات معاودة الاتصال خلال مراحل النشاط في سكتشن

الآن بعد أن نفذت طرق معاودة الاتصال في دورة الحياة لـ MainActivity، افعل الشيء نفسه مع سكتشن.

  1. افتح IIActivity.
  2. في أعلى الصف، أضِف ثابتًا للمتغير LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. أضف استدعاءات دورة الحياة وبيانات السجل إلى النشاط الثاني. (يمكنك نسخ طرق معاودة الاتصال ولصقها من MainActivity).
  2. أضف عبارة سجل إلى طريقة returnreply() قبل طريقة الانتهاء() مباشرةً:
Log.d(LOG_TAG, "End SecondActivity");

1.4 مراقبة السجلّ أثناء تشغيل التطبيق**

  1. شغِّل تطبيقك.
  2. انقر على علامة التبويب Logcat في أسفل "استوديو Android" لعرض لوحة Logcat.
  3. أدخِل "النشاط" في مربّع البحث. يمكن أن تكون أداة Logcat لنظام Android طويلة جدًا وغير منظمة. نظرًا لأن متغير LOG_TAG في كل فئة يحتوي على الكلمتين MainActivity أو secondActivity، تتيح لك هذه الكلمة الرئيسية تصفية السجل للعناصر التي تهتم بها فقط.

مشكلة مضاعفة

نفِّذ تجارب باستخدام تطبيقك ولاحظ أن أحداث مراحل النشاط التي تحدث استجابةً لإجراءات مختلفة. على وجه الخصوص، جرِّب ما يلي:

  • استخدام التطبيق بشكل طبيعي (إرسال رسالة أو الردّ برسالة أخرى)
  • استخدم زر الرجوع للرجوع من النشاط الثاني إلى النشاط الرئيسي.
  • استخدم السهم لأعلى في شريط التطبيق للرجوع من النشاط الثاني إلى النشاط الرئيسي.
  • يُرجى تدوير الجهاز في كل من النشاط الرئيسي والنشاط الثاني في أوقات مختلفة في تطبيقك ومراقبة ما يحدث في * السجل وعلى الشاشة.
  • اضغط على زر النظرة العامة (الزر المربّع على يسار الشاشة الرئيسية) وأغلق التطبيق (انقر على X).
  • ارجع إلى الشاشة الرئيسية وأعِد تشغيل التطبيق.

نصيحة: إذا كنت تشغّل تطبيقك في محاكي، يمكنك محاكاة التدوير باستخدام Control+F11 أو Control+Function+F11.

رمز حل المهمة 1

تعرض مقتطفات الرمز التالية رمز الحلّ للمهمة الأولى.

MainActivity

تعرض مقتطفات الرمز التالية الرمز المضاف في MainActivity، ولكن ليس الفئة بأكملها.

طريقة onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Log the start of the onCreate() method.
        Log.d(LOG_TAG, "-------");
        Log.d(LOG_TAG, "onCreate");

        // Initialize all the view variables.
        mMessageEditText = findViewById(R.id.editText_main);
        mReplyHeadTextView = findViewById(R.id.text_header_reply);
        mReplyTextView = findViewById(R.id.text_message_reply);
}

طرق دورة الحياة الأخرى:

@Override
protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
}

@Override
protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
}

@Override
protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
}

@Override
protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume");
}

@Override
protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
}

@Override
protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
}

SecondActivity

تعرض مقتطفات الرمز التالية الرمز المُضاف في ndActivity، ولكن لا تعرض الفئة بأكملها.

في الجزء العلوي من فئة IIActivity:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

طريقة returnreply():

public void returnReply(View view) {
        String reply = mReply.getText().toString();
        Intent replyIntent = new Intent();
        replyIntent.putExtra(EXTRA_REPLY, reply);
        setResult(RESULT_OK, replyIntent);
        Log.d(LOG_TAG, "End SecondActivity");
        finish();
}

طرق دورة الحياة الأخرى:

تمامًا كما في MainActivity أعلاه.

4. 4. المهمة 2: حفظ حالة مثيل النشاط واستعادتها

استنادًا إلى موارد النظام وسلوك المستخدم، قد يتم تدمير كل نشاط في تطبيقك وإعادة بنائه بشكل متكرر أكثر مما تعتقد.

ربما لاحظت هذا السلوك في القسم الأخير عند تدوير الجهاز أو المحاكي. إنّ تدوير الجهاز هو أحد الأمثلة على تغيير إعدادات الجهاز. وبالرغم من أن عملية التدوير هي الأكثر شيوعًا، فإن جميع تغييرات الإعدادات تؤدي إلى إتلاف النشاط الحالي وإعادة إنشائه كما لو كان جديدًا. وإذا لم تأخذ هذا السلوك في الحسبان عند حدوث تغيير في الإعدادات، قد يعود تنسيق النشاط إلى مظهره التلقائي وقيمه الأولية، وقد يفقد المستخدمون مكانهم أو بياناتهم أو حالة مستوى التقدّم في تطبيقك.

يتم تخزين حالة كل نشاط كمجموعة من أزواج المفتاح/القيمة في عنصر حزمة يُسمى حالة مثيل النشاط. يحفظ النظام معلومات الحالة التلقائية لحزمة الحالة الافتراضية قبل إيقاف النشاط مباشرةً، ويمرر هذه الحزمة إلى مثيل "النشاط" الجديد لاستعادتها.

لمنع فقدان البيانات في نشاط عند إتلافه وإعادة إنشائه بشكل غير متوقع، تحتاج إلى تنفيذ طريقة onSaveInstanceState(). يستدعي النظام هذه الطريقة في نشاطك (بين onPause() وonStop()) عندما يكون هناك احتمال بأن يتم إتلاف النشاط وإعادة إنشائه.

تقتصر البيانات التي تحفظها في حالة المثيل على هذا المثيل فقط من هذا النشاط المحدَّد أثناء جلسة التطبيق الحالية. عند إيقاف جلسة تطبيق جديدة وإعادة تشغيلها، تُفقد حالة "النشاط" ويعود "النشاط" إلى مظهره التلقائي. إذا كنت بحاجة إلى حفظ بيانات المستخدمين بين جلسات التطبيق، استخدِم الإعدادات المفضّلة المشتركة أو قاعدة بيانات. تتعرف على كليهما في عملية لاحقة.

2.1 حفظ حالة مثيل النشاط باستخدام onSaveInstanceState()

ربما لاحظت أن تدوير الجهاز لا يؤثر على حالة النشاط الثاني على الإطلاق. وهذا بسبب إنشاء تخطيط وحالة النشاط الثاني من التنسيق وIntent الذي نشّطه. حتى إذا تمت إعادة إنشاء النشاط، يظل Intent موجودًا ويستمر استخدام البيانات في هذا الهدف في كل مرّة يتم فيها استدعاء طريقة onCreate() في النشاط الثاني.

بالإضافة إلى ذلك، قد تلاحظ أنّه في كل "نشاط"، يتم الاحتفاظ بأي نص كتبته في رسالة أو ردّ على عناصر EditText حتى عند تدوير الجهاز. وذلك لأنه يتم حفظ معلومات حالة بعض عناصر العرض في التنسيق تلقائيًا عبر تغييرات التهيئة، والقيمة الحالية لـ EditText هي إحدى هذه الحالات.

لذا فإن حالة النشاط الوحيدة التي تهتم بها هي عناصر TextView لرأس الرد ونص الرد في النشاط الرئيسي. ولا يظهر عنصرا TextView بشكل تلقائي، ولا يظهران إلا بعد إرسال رسالة إلى النشاط الرئيسي من النشاط الثاني.

في هذه المهمة، تضيف تعليمة برمجية للحفاظ على حالة المثيل لهذين العنصرين TextView باستخدام onSaveInstanceState().

  1. افتح MainActivity.
  2. أضف هذا الهيكل الأساسي لـ onSaveInstanceState() إلى النشاط، أو استخدم الرمز > طرق التجاهل لإدراج تجاوز الهيكل.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. تحقق مما إذا كان العنوان مرئيًا حاليًا، وإذا كان الأمر كذلك، يمكنك وضع حالة الرؤية هذه في مجموعة الحالة باستخدام طريقة ()putBoolean() والمفتاح "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

تذكر أنه يتم تمييز عنوان الرد ونصه بأنه غير مرئي إلى أن يكون هناك رد من النشاط الثاني. إذا كان العنوان مرئيًا، يعني ذلك أنّه يجب حفظ بيانات الردود. ملاحظة: نحن مهتمون فقط بحالة مستوى الرؤية هذه، فالنص الفعلي للرأس لا يتطلّب حفظه لأنّ هذا النص لا يتغيّر أبدًا.

  1. داخل عملية التحقّق نفسها، أضِف نص الرد إلى الحزمة.
outState.putString("reply_text",mReplyTextView.getText().toString());

إذا كان الرأس مرئيًا، يمكنك افتراض أن رسالة الرد نفسها مرئية أيضًا. لا تحتاج إلى اختبار حالة الظهور الحالية لرسالة الرد أو حفظها. ويتم إدخال النص الفعلي فقط للرسالة في الحزمة التي تتضمّن المفتاح "reply_text".

يمكنك حفظ حالة عناصر العرض هذه فقط التي قد تتغير بعد إنشاء النشاط. يمكن إعادة إنشاء عناصر العرض الأخرى في تطبيقك (EditText، الزر) من التخطيط الافتراضي في أي وقت.

لاحظ أن النظام سيحفظ حالة بعض عناصر العرض، مثل محتويات EditText.

2.2 استعادة حالة مثيل النشاط في onCreate()

بعد حفظ حالة المثيل، ستحتاج أيضًا إلى استعادته عند إعادة إنشاء النشاط. يمكنك القيام بذلك إما في onCreate()، أو عن طريق تنفيذ معاودة الاتصال onRestoreInstanceState()، والتي يتم استدعائها بعد onStart() بعد إنشاء النشاط.

في معظم الأوقات، يكون المكان الأفضل لاستعادة حالة النشاط هو onCreate()، لضمان توفر واجهة المستخدم، بما في ذلك الحالة، في أقرب وقت ممكن. وقد يكون من المريح أحيانًا تنفيذ ذلك في onRestoreInstanceState() بعد اكتمال عملية الإعداد، أو السماح للفئات الفرعية بتحديد ما إذا كان يجب استخدام طريقة التنفيذ التلقائية أم لا.

  1. في طريقة onCreate()، بعد تهيئة متغيرات العرض باستخدام findViewById()، أضف اختبارًا للتأكد من أن savedInstanceState ليست فارغة.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);

// Restore the state.
if (savedInstanceState != null) {
}

عند إنشاء نشاطك، يمرّر النظام مجموعة الحالة إلى onCreate() كوسيطة الوحيدة لها. في المرة الأولى التي يتم فيها استدعاء onCreate() وبدء تطبيقك، تكون الحزمة فارغة، ولا توجد حالة حالية عند بدء تشغيل تطبيقك لأول مرة. تحتوي الاستدعاءات اللاحقة إلى onCreate() على حزمة مملوءة بالبيانات التي خزنتها في onSaveInstanceState().

  1. داخل هذا التحقق، احصل على مستوى الرؤية الحالي (true أو false) من الحزمة باستخدام المفتاح "reply_visible".
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. أضف اختبارًا أسفل السطر السابق للمتغير isvisible.
if (isVisible) {
}

إذا كان هناك مفتاح Reply_visible في الحالة (وبالتالي تكون قيمة isvisible true)، ستحتاج إلى استعادة الحالة.

  1. داخل الاختبار isمرئي، اجعل العنوان مرئيًا.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. احصل على رسالة الرد النصي من الحِزمة مع المفتاح "reply_text"، واضبط الرد TextView لإظهار تلك السلسلة.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. جعل طريقة عرض النص في الرد مرئية أيضًا:
mReplyTextView.setVisibility(View.VISIBLE);
  1. شغِّل التطبيق. جرِّب تدوير الجهاز أو المحاكي لضمان بقاء رسالة الرد (في حال توفّرها) على الشاشة بعد إعادة إنشاء النشاط.

رمز حل المهمة 2

تعرض مقتطفات الرمز التالية رمز الحلّ لهذه المهمة.

MainActivity

تعرض مقتطفات الرمز التالية الرمز المضاف في MainActivity، ولكن ليس الفئة بأكملها.

طريقة onSaveInstanceState():

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   // If the heading is visible, message needs to be saved.
   // Otherwise we're still using default layout.
   if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
       outState.putBoolean("reply_visible", true);
       outState.putString("reply_text", 
                      mReplyTextView.getText().toString());
   }
}

طريقة onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Log.d(LOG_TAG, "-------");
   Log.d(LOG_TAG, "onCreate");

   // Initialize all the view variables.
   mMessageEditText = findViewById(R.id.editText_main);
   mReplyHeadTextView = findViewById(R.id.text_header_reply);
   mReplyTextView = findViewById(R.id.text_message_reply);

   // Restore the saved state. 
   // See onSaveInstanceState() for what gets saved.
   if (savedInstanceState != null) {
       boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
       // Show both the header and the message views. If isVisible is
       // false or missing from the bundle, use the default layout.
       if (isVisible) {
           mReplyHeadTextView.setVisibility(View.VISIBLE);
           mReplyTextView.setText(savedInstanceState
                                  .getString("reply_text"));
           mReplyTextView.setVisibility(View.VISIBLE);
       }
   }
}

المشروع الكامل:

مشروع استوديو Android: TwoActivitiesLifecycle

5- الترميز

التحدي: قم بإنشاء تطبيق قائمة تسوق بسيط مع نشاط رئيسي للقائمة التي ينشئها المستخدم، ونشاط ثاني لقائمة من عناصر التسوق الشائعة.

  • يجب أن يحتوي النشاط الرئيسي على القائمة المراد إنشاؤها، والتي يجب أن تتكون من عشرة عناصر TextView فارغة.
  • يؤدي زر "إضافة عنصر" في النشاط الرئيسي إلى تشغيل نشاط ثاني يحتوي على قائمة بعناصر التسوق الشائعة (الجبن والأرز والتفاح وما إلى ذلك). استخدم عناصر الأزرار لعرض العناصر.
  • يؤدي اختيار عنصر إلى إرجاع المستخدم إلى النشاط الرئيسي، وتحديث TextView فارغ لتضمين العنصر الذي تم اختياره.

استخدِم Intent لتمرير المعلومات من نشاط إلى آخر. احرص على حفظ الحالة الحالية لقائمة التسوّق عندما يتدوير المستخدم الجهاز.

6. ملخّص

  • دورة حياة النشاط هي مجموعة من الحالات التي ينتقل خلالها النشاط، بدءًا من تاريخ إنشائه وينتهي عندما يسترد نظام Android الموارد المرتبطة بذلك النشاط.
  • أثناء انتقال المستخدِم من "نشاط" إلى آخر، ومن داخل تطبيقك وخارجه، يتنقل كل "نشاط" بين الحالات في دورة حياة النشاط.
  • لكل حالة في دورة حياة النشاط طريقة مقابلة لمعاودة الاتصال يمكنك تجاوزها في فئة النشاط.
  • طرق دورة الحياة هي onCreate() وonStart() وonPause() وonComplete() وoncomplete() وonStop() وonDestroy().
  • ويتيح لك تجاوز طريقة معاودة الاتصال خلال دورة الحياة إضافة سلوك يحدث عند انتقال نشاطك إلى تلك الحالة.
  • يمكنك إضافة طرق إلغاء الهيكل الأساسي إلى صفوفك في "استوديو Android" من خلال الرمز > إلغاء.
  • التغييرات في إعدادات الجهاز، مثل تدوير نتائج النشاط، يتم إتلافها وإعادة إنشائها كما لو كانت جديدة
  • يتم الاحتفاظ بجزء من حالة النشاط عند تغيير الإعدادات، بما في ذلك القيم الحالية لعناصر EditText. بالنسبة إلى جميع البيانات الأخرى، يجب عليك حفظ تلك البيانات بنفسك صراحةً.
  • حفظ حالة مثيل النشاط بطريقة onSaveInstanceState().
  • يتم تخزين بيانات حالة المثيل كأزواج مفتاح/قيمة بسيطة في حزمة. استخدم طرق الحزمة لإدخال البيانات في الحزمة واسترجاعها منها.
  • استعادة حالة المثيل في onCreate()، وهي الطريقة المفضلة، أو onRestoreInstanceState(). رجوع