1. مرحبًا
هذا الدرس التطبيقي حول الترميز هو جزء من الوحدة 1: بدء الدورة التدريبية "أساسيات مطوّري تطبيقات Android" (الإصدار 2). ستستفيد إلى أقصى حد من هذه الدورة التدريبية إذا اطّلعت على ورشات رموز البرامج بالتسلسل:
- للحصول على القائمة الكاملة لميزات Codelabs في الدورة التدريبية، يُرجى الاطّلاع على Codelabs لدورة "أساسيات تطوير التطبيقات لنظام التشغيل Android" (الإصدار 2).
- للاطّلاع على تفاصيل عن الدورة التدريبية، بما في ذلك روابط إلى جميع فصول المفاهيم والتطبيقات والعروض التقديمية، اطّلِع على أساسيات المطوّرين على Android (الإصدار 2).
مقدمة
في هذا الدليل العملي، يمكنك الاطّلاع على مزيد من المعلومات حول دورة حياة النشاط. دورة الحياة هي مجموعة الحالات التي يمكن أن يكون فيها النشاط خلال فترة حياته بالكامل، بدءًا من إنشائه إلى إزالته واسترداد النظام لموارده. عندما ينتقل المستخدم بين الأنشطة في تطبيقك (بالإضافة إلى الانتقال إلى تطبيقك والخروج منه)، تنتقل الأنشطة بين حالات مختلفة في مراحل نشاطها.
تحتوي كل مرحلة في دورة حياة النشاط على طريقة استدعاء مقابلة: onCreate() وonStart() وonPause() وما إلى ذلك. عند تغيير حالة نشاط، يتمّ استدعاء طريقة ردّ الاتصال المرتبطة به. سبق لك الاطّلاع على إحدى هاتين الطريقتَين: onCreate(). من خلال إلغاء أيّ من طرق الاستدعاء لمراحل النشاط في فئات النشاط، يمكنك تغيير السلوك التلقائي للنشاط استجابةً لإجراءات المستخدم أو النظام.
يمكن أن تتغيّر حالة النشاط أيضًا استجابةً لتغييرات في إعدادات الجهاز، على سبيل المثال عندما يدير المستخدم الجهاز من الوضع العمودي إلى الوضع الأفقي. عند حدوث تغييرات الضبط هذه، يتم إلغاء النشاط وإعادة إنشائه في حالته التلقائية، وقد يفقد المستخدم المعلومات التي أدخلها في النشاط. لتجنُّب إرباك المستخدمين، من المهم تطوير تطبيقك لمنع فقدان البيانات بشكل غير متوقّع. في وقت لاحق من هذا البرنامج التدريبي، ستُجري تجربة على تغييرات الضبط وستتعرّف على كيفية الحفاظ على حالة النشاط استجابةً لتغييرات ضبط الجهاز وأحداث دورة حياة النشاط الأخرى.
في هذا البرنامج التدريبي، ستضيف عبارات تسجيل إلى تطبيق TwoActivities وستلاحظ تغييرات دورة حياة النشاط أثناء استخدام التطبيق. ستبدأ بعد ذلك العمل مع هذه التغييرات واستكشاف كيفية التعامل مع إدخالات المستخدمين في ظل هذه الظروف.
المتطلبات الأساسية
من المفترض أن يكون بإمكانك إجراء ما يلي:
- أنشئ مشروع تطبيق وشغِّله في استوديو Android.
- أضِف عبارات سجلّ إلى تطبيقك واطّلِع على هذه السجلات في لوحة Logcat.
- فهم النشاط والنيّة والعمل معهما، والشعور بالراحة عند التفاعل معهما
ما ستتعرّف عليه
- آلية عمل مراحل النشاط
- عند بدء نشاط وإيقافه مؤقتًا وإيقافه وإزالته.
- لمحة عن طرق طلب معاودة الاتصال المتعلّقة بمراحل النشاط
- تأثير الإجراءات (مثل تغييرات الإعدادات) التي يمكن أن تؤدي إلى أحداث دورة حياة النشاط
- كيفية الاحتفاظ بحالة النشاط في جميع أحداث رحلة المستخدِم
الإجراءات التي ستنفذّها
- أضِف رمزًا إلى تطبيق TwoActivities من الدرس العملي السابق لتنفيذ عمليات معاودة الاتصال المختلفة لمراحل النشاط لتضمين عبارات التسجيل.
- راقِب تغييرات الحالة أثناء تشغيل تطبيقك وعند التفاعل مع كل نشاط في تطبيقك.
- عدِّل تطبيقك للاحتفاظ بحالة مثيل النشاط الذي تتم إعادة إنشاؤه بشكل غير متوقّع استجابةً لسلوك المستخدم أو تغيير الإعدادات على الجهاز.
2. نظرة عامة على التطبيق
في هذا البرنامج التدريبي، ستضيف إلى تطبيق TwoActivities. يبدو التطبيق ويتصرف بشكلٍ مشابه تقريبًا لما كان عليه في ورشة رموز البرمجة الأخيرة. يحتوي على تنفيذَين لنشاط ويمنح المستخدم إمكانية إرسال البيانات بينهما. لن تؤثّر التغييرات التي تجريها على التطبيق في هذا الدليل العملي في سلوك المستخدم المرئي.
3- 3- المهمة 1: إضافة وظائف الاستدعاء المتعلّقة بمراحل النشاط إلى TwoActivities
في هذه المهمة، ستنفِّذ جميع طرق الاستدعاء المتعلّقة بمراحل نشاط النشاط لطباعة الرسائل في logcat عند استدعاء هذه الطرق. ستتيح لك رسائل السجلّ هذه معرفة الحالات التي تتغيّر فيها دورة حياة النشاط، ومدى تأثير هذه التغييرات في حالة دورة الحياة على تطبيقك أثناء تشغيله.
1.1 (اختياري) نسخ مشروع TwoActivities
بالنسبة إلى المهام في هذه التجربة العملية، عليك تعديل مشروع TwoActivities الحالي الذي أنشأته في التجربة العملية الأخيرة. إذا كنت تفضّل الاحتفاظ بمشروع TwoActivities السابق سليمًا، اتّبِع الخطوات الواردة في الملحق: الأدوات لإنشاء نسخة من المشروع.
1.2 تنفيذ عمليات الاستدعاء في MainActivity
- افتح مشروع TwoActivities في Android Studio، وافتح MainActivity في اللوحة Project (المشروع) > Android (نظام التشغيل Android).
- في طريقة onCreate()، أضِف عبارات التسجيل التالية:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- أضِف استبدالًا لطلب الاستدعاء onStart()، مع إضافة عبارة إلى السجلّ لهذا الحدث:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
للحصول على اختصار، اختَر الرمز > إلغاء طرق في "استوديو Android". يظهر مربّع حوار يتضمّن جميع الطرق الممكنة التي يمكنك إلغاء ربطها في صفك. يؤدي اختيار طريقة استدعاء واحدة أو أكثر من القائمة إلى إدراج نموذج كامل لهذه الطرق، بما في ذلك الطلب المطلوب إلى الفئة الأساسية.
- استخدِم طريقة onStart() كنموذج لتنفيذ عمليات الاستدعاء لأحداث دورة الحياة onPause() وonRestart() وonResume() وonStop() وonDestroy().
تحتوي جميع طرق الاستدعاء على التوقيعات نفسها (باستثناء الاسم). في حال نسخ دالة onStart() ولصقها لإنشاء طرق الاستدعاء الأخرى هذه، لا تنسَ تعديل المحتوى لاستدعاء الطريقة الصحيحة في الفئة الأساسية ولتسجيل الطريقة الصحيحة.
- شغِّل تطبيقك.
- انقر على علامة التبويب Logcat في أسفل "استوديو Android" لعرض لوحة Logcat. من المفترض أن تظهر لك ثلاث رسائل سجلّ تعرض حالات دورة الحياة الثلاث التي مرّ بها "النشاط" عند بدئه:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 تنفيذ عمليات الاستدعاء في إحدى مراحل النشاط في SecondActivity
بعد أن نفّذت طرق طلب معاودة الاتصال الخاصة بمراحل نشاط MainActivity، نفِّذ الأمر نفسه مع SecondActivity.
- افتح SecondActivity.
- في أعلى الفئة، أضِف ثابتًا للمتغيّر LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- أضِف طلبات الاستدعاء لمراحل النشاط وبيانات السجلّ إلى النشاط الثاني. (يمكنك نسخ طرق ردّ الاتصال ولصقها من MainActivity).
- أضِف عبارة تسجيل إلى طريقة returnReply() قبل طريقة finish() مباشرةً:
Log.d(LOG_TAG, "End SecondActivity");
1.4 مراقبة السجلّ أثناء تشغيل التطبيق**
- شغِّل تطبيقك.
- انقر على علامة التبويب Logcat في أسفل "استوديو Android" لعرض لوحة Logcat.
- أدخِل "النشاط" في مربّع البحث. يمكن أن يكون logcat في Android طويلاً ومكتظًا جدًا. بما أنّ المتغيّر LOG_TAG في كل فئة يحتوي على أيّ من الكلمات MainActivity أو SecondActivity، تتيح لك هذه الكلمة الرئيسية فلترة السجلّ للاطّلاع على العناصر التي تهمّك فقط.
جرِّب استخدام تطبيقك وتحقّق من أحداث مراحل النشاط التي تحدث استجابةً لإجراءات مختلفة. على وجه الخصوص، جرِّب ما يلي:
- استخدِم التطبيق كالمعتاد (أرسِل رسالة أو ردّ عليها برسالة أخرى).
- استخدِم زر الرجوع للعودة من "النشاط" الثاني إلى "النشاط" الرئيسي.
- استخدِم سهم السهم المتّجه للأعلى في شريط التطبيق للرجوع من "النشاط" الثاني إلى "النشاط" الرئيسي.
- يمكنك تدوير الجهاز في كلّ من النشاط الرئيسي والثاني في أوقات مختلفة في تطبيقك وملاحظة ما يحدث في * السجلّ وعلى الشاشة.
- اضغط على زر "نظرة عامة" (الزرّ المربّع على يسار "الصفحة الرئيسية") وأغلق التطبيق (انقر على الرمز X).
- ارجع إلى الشاشة الرئيسية وأعِد تشغيل التطبيق.
ملاحظة: إذا كنت تشغّل تطبيقك في محاكي، يمكنك محاكاة عملية التدوير باستخدام Ctrl + F11 أو Ctrl + 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
تعرض المقتطفات التالية من الرموز البرمجية الرمز المُضاف في SecondActivity، ولكن ليس الفئة بأكملها.
في أعلى فئة SecondActivity:
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 متوفّرًا وستظلّ البيانات في هذا Intent مستخدمة في كل مرة يتم فيها استدعاء طريقة onCreate() في النشاط الثاني.
بالإضافة إلى ذلك، قد تلاحظ أنّه في كل نشاط، يتم الاحتفاظ بأي نص كتبته في عناصر EditText للرسالة أو الردّ حتى عند تدوير الجهاز. ويعود السبب في ذلك إلى أنّه يتم تلقائيًا حفظ معلومات حالة بعض عناصر العرض في التنسيق الخاص بك عند إجراء تغييرات على الإعدادات، وتكون القيمة الحالية لعنصر EditText إحدى هذه الحالات.
وبالتالي، فإنّ حالة النشاط الوحيدة التي تهمّك هي عناصر TextView لعنوان الردّ ونص الردّ في النشاط الرئيسي. لا يظهر كلا عنصرَي TextView تلقائيًا، بل يظهران فقط بعد إرسال رسالة إلى النشاط الرئيسي من النشاط الثاني.
في هذه المهمة، ستضيف رمزًا للحفاظ على حالة مثيل عنصرَي TextView باستخدام onSaveInstanceState().
- افتح MainActivity.
- أضِف هذا التنفيذ الأساسي لطريقة onSaveInstanceState() إلى النشاط، أو استخدِم رمز > طرق الاستبدال لإدراج استبدال أساسي.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- تحقَّق ممّا إذا كان العنوان مرئيًا حاليًا، وإذا كان الأمر كذلك، ضَع حالة الرؤية هذه في حِزمة الحالة باستخدام الطريقة putBoolean() والمفتاح reply_visible.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
يُرجى العِلم أنّه يتم وضع علامة "غير مرئي" على عنوان الرد ونصه إلى أن يصل ردّ من "النشاط الثاني". إذا كان العنوان مرئيًا، يعني ذلك أنّ هناك بيانات ردّ يجب حفظها. يُرجى العِلم أنّنا لا نهتم إلا بحالة مستوى العرض هذه، ولا يلزم حفظ النص الفعلي للعنوان لأنّ هذا النص لا يتغيّر أبدًا.
- ضمن عملية التحقّق نفسها، أضِف نص الردّ إلى الحِزمة.
outState.putString("reply_text",mReplyTextView.getText().toString());
إذا كان العنوان مرئيًا، يمكنك افتراض أنّ رسالة الردّ نفسها مرئية أيضًا. لست بحاجة إلى اختبار حالة مستوى العرض الحالية لرسالة الردّ أو حفظها. لا يتم إدخال سوى النص الفعلي للرسالة في حِزمة الحالة باستخدام المفتاح "reply_text".
يمكنك حفظ حالة عناصر العرض التي قد تتغيّر بعد إنشاء "النشاط" فقط. يمكن إعادة إنشاء عناصر العرض الأخرى في تطبيقك (EditText وButton) من التنسيق التلقائي في أي وقت.
يُرجى العِلم أنّ النظام سيحفظ حالة بعض عناصر View، مثل محتوى EditText.
2.2 استعادة حالة مثيل النشاط في onCreate()
بعد حفظ حالة مثيل النشاط، عليك أيضًا استعادتها عند إعادة إنشاء النشاط. يمكنك إجراء ذلك إما في onCreate() أو من خلال تنفيذ دالة الاستدعاء onRestoreInstanceState() التي يتمّ استدعاؤها بعد onStart() بعد إنشاء النشاط.
في معظم الأحيان، يكون أفضل مكان لاستعادة حالة النشاط هو onCreate()، لضمان توفّر واجهة المستخدم، بما في ذلك الحالة، في أقرب وقت ممكن. من المفيد أحيانًا إجراء ذلك في onRestoreInstanceState() بعد الانتهاء من جميع عمليات الإعداد، أو للسماح للفئات الفرعية بتحديد ما إذا كانت ستستخدم التنفيذ التلقائي.
- في طريقة onCreate()، بعد بدء متغيّرات View باستخدام 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().
- ضمن هذا التحقّق، يمكنك الحصول على مستوى العرض الحالي (true أو false) من الحِزمة باستخدام المفتاح "reply_visible".
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- أضِف اختبارًا أسفل هذا السطر السابق للمتغيّر isVisible.
if (isVisible) {
}
إذا كان هناك مفتاح reply_visible في حِزمة الحالة (ويكون isVisible صحيحًا لذلك)، عليك استعادة الحالة.
- ضمن اختبار isVisible، اجعل العنوان مرئيًا.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- احصل على رسالة الردّ النصية من الحِزمة باستخدام المفتاح "reply_text"، واضبط TextView للردّ لعرض هذه السلسلة.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- اجعل TextView للرد مرئيًا أيضًا:
mReplyTextView.setVisibility(View.VISIBLE);
- شغِّل التطبيق. حاوِل تدوير الجهاز أو المحاكي للتأكّد من بقاء رسالة الرد (إن توفّرت) على الشاشة بعد إعادة إنشاء النشاط.
رمز حلّ المهمة 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 فارغ لتضمين العنصر الذي تم اختياره.
استخدِم نية لتمرير المعلومات من نشاط إلى آخر. تأكَّد من حفظ الحالة الحالية لقائمة التسوّق عندما يدير المستخدم الجهاز.
6- ملخّص
- دورة حياة النشاط هي مجموعة من الحالات التي ينتقل إليها النشاط، بدءًا من وقت إنشائه لأول مرة وانتهاءً عندما يسترد نظام Android الموارد لهذا النشاط.
- عندما ينتقل المستخدم من نشاط إلى آخر، داخل تطبيقك وخارجه، ينتقل كل نشاط بين الحالات في رحلة النشاط.
- تحتوي كل حالة في دورة حياة النشاط على طريقة استدعاء مقابلة يمكنك إلغاء تحديدها في فئة النشاط.
- طرق دورة النشاط هي onCreate() وonStart() وonPause() وonRestart() وonResume() وonStop() وonDestroy().
- يتيح لك إلغاء طريقة طلب معاودة الاتصال الخاصة بالنشاط إضافة سلوك يحدث عند انتقال نشاطك إلى تلك الحالة.
- يمكنك إضافة طرق إلغاء أساسية إلى فصولك في Android Studio باستخدام رمز > إلغاء.
- تؤدي تغييرات إعدادات الجهاز، مثل التدوير، إلى إتلاف "النشاط" وإعادة إنشائه كما لو كان جديدًا.
- يتم الاحتفاظ بجزء من حالة النشاط عند تغيير الإعدادات، بما في ذلك القيم الحالية لعناصر EditText. بالنسبة إلى جميع البيانات الأخرى، عليك حفظها بنفسك.
- احفظ حالة مثيل النشاط في طريقة onSaveInstanceState().
- يتم تخزين بيانات حالة المثيل كأزواج مفتاح/قيمة بسيطة في حِزمة. استخدِم طرق الحِزم لوضع البيانات في الحِزمة واستردادها منها.
- استعادة حالة المثيل في onCreate()، وهي الطريقة المفضّلة، أو onRestoreInstanceState()