1. خوش آمدید
یہ عملی کوڈ لیب یونٹ 1 کا حصہ ہے: Android Developer Fundamentals (ورژن 2) کورس میں شروعات کریں۔ اگر آپ ترتیب وار کوڈ لیبز کے ذریعے کام کرتے ہیں تو آپ کو اس کورس سے زیادہ سے زیادہ قیمت ملے گی۔
- کورس میں کوڈ لیبز کی مکمل فہرست کے لیے، دیکھیں Android Developer Fundamentals (V2) کے لیے Codelabs۔
- کورس کے بارے میں تفصیلات کے لیے، بشمول تمام تصوراتی ابواب، ایپس، اور سلائیڈز کے لنکس، دیکھیں اینڈرائیڈ ڈویلپر کے بنیادی اصول (ورژن 2)۔
تعارف
اس پریکٹیکل میں آپ سرگرمی لائف سائیکل کے بارے میں مزید جانیں گے۔ لائف سائیکل ریاستوں کا مجموعہ ہے جس میں کوئی سرگرمی اپنی پوری زندگی کے دوران ہوسکتی ہے، جب یہ تخلیق ہوتی ہے تب سے لے کر اسے تباہ ہونے تک اور نظام اپنے وسائل پر دوبارہ دعویٰ کرتا ہے۔ جیسا کہ صارف آپ کی ایپ میں سرگرمیوں (نیز آپ کی ایپ کے اندر اور باہر) کے درمیان نیویگیٹ کرتا ہے، سرگرمیاں ان کے لائف سائیکل میں مختلف ریاستوں کے درمیان منتقل ہوتی ہیں۔
سرگرمی کے لائف سائیکل کے ہر مرحلے میں کال بیک کا ایک طریقہ ہوتا ہے: onCreate(), onStart(), onPause()، وغیرہ۔ جب کوئی سرگرمی حالت بدلتی ہے، تو متعلقہ کال بیک کا طریقہ استعمال کیا جاتا ہے۔ آپ ان طریقوں میں سے ایک کو پہلے ہی دیکھ چکے ہیں: onCreate()۔ اپنی سرگرمی کی کلاسوں میں لائف سائیکل کال بیک کے کسی بھی طریقے کو اوور رائیڈ کر کے، آپ صارف یا سسٹم کی کارروائیوں کے جواب میں سرگرمی کے پہلے سے طے شدہ رویے کو تبدیل کر سکتے ہیں۔
آلہ کی ترتیب میں ہونے والی تبدیلیوں کے جواب میں سرگرمی کی حالت بھی بدل سکتی ہے، مثال کے طور پر جب صارف آلہ کو پورٹریٹ سے زمین کی تزئین میں گھماتا ہے۔ جب یہ کنفیگریشن تبدیلیاں رونما ہوتی ہیں، تو سرگرمی تباہ ہو جاتی ہے اور اس کی ڈیفالٹ حالت میں دوبارہ تخلیق ہو جاتی ہے، اور صارف وہ معلومات کھو سکتا ہے جو اس نے سرگرمی میں داخل کی ہے۔ اپنے صارفین کو الجھانے سے بچنے کے لیے، یہ ضروری ہے کہ آپ ڈیٹا کے غیر متوقع نقصان کو روکنے کے لیے اپنی ایپ تیار کریں۔ بعد میں اس پریکٹیکل میں آپ کنفیگریشن کی تبدیلیوں کے ساتھ تجربہ کرتے ہیں اور سیکھتے ہیں کہ ڈیوائس کنفیگریشن کی تبدیلیوں اور دیگر سرگرمی لائف سائیکل ایونٹس کے جواب میں کسی سرگرمی کی حالت کو کیسے محفوظ رکھا جائے۔
اس پریکٹیکل میں آپ TwoActivities ایپ میں لاگنگ سٹیٹمنٹس شامل کرتے ہیں اور ایپ کو استعمال کرتے وقت ایکٹیویٹی لائف سائیکل تبدیلیوں کا مشاہدہ کرتے ہیں۔ اس کے بعد آپ ان تبدیلیوں کے ساتھ کام کرنا شروع کر دیتے ہیں اور ان حالات میں صارف کے ان پٹ کو ہینڈل کرنے کا طریقہ دریافت کرتے ہیں۔
شرطیں
آپ کو قابل ہونا چاہئے:
- اینڈرائیڈ اسٹوڈیو میں ایپ پروجیکٹ بنائیں اور چلائیں۔
- اپنی ایپ میں لاگ سٹیٹمنٹس شامل کریں اور ان لاگز کو Logcat پین میں دیکھیں۔
- ایک سرگرمی اور ارادے کو سمجھیں اور اس کے ساتھ کام کریں، اور ان کے ساتھ بات چیت کرنے میں آرام سے رہیں۔
آپ کیا سیکھیں گے۔
- سرگرمی کا لائف سائیکل کیسے کام کرتا ہے۔
- جب کوئی سرگرمی شروع ہوتی ہے، رک جاتی ہے، رک جاتی ہے، اور تباہ ہو جاتی ہے۔
- سرگرمی کی تبدیلیوں سے وابستہ لائف سائیکل کال بیک طریقوں کے بارے میں۔
- اعمال کا اثر (جیسے کنفیگریشن تبدیلیاں) جس کے نتیجے میں سرگرمی لائف سائیکل واقعات ہو سکتے ہیں۔
- لائف سائیکل ایونٹس میں سرگرمی کی حالت کو کیسے برقرار رکھا جائے۔
تم کیا کرو گے
- لاگنگ اسٹیٹمنٹس کو شامل کرنے کے لیے مختلف ایکٹیویٹی لائف سائیکل کال بیکس کو لاگو کرنے کے لیے سابقہ پریکٹیکل سے TwoActivities ایپ میں کوڈ شامل کریں۔
- جب آپ کی ایپ چلتی ہے اور جب آپ اپنی ایپ میں ہر ایک سرگرمی کے ساتھ تعامل کرتے ہیں تو ریاست کی تبدیلیوں کا مشاہدہ کریں۔
- کسی سرگرمی کی مثالی حالت کو برقرار رکھنے کے لیے اپنی ایپ میں ترمیم کریں جو صارف کے رویے یا آلہ پر کنفیگریشن تبدیلی کے جواب میں غیر متوقع طور پر دوبارہ بنائی گئی ہے۔
2. ایپ کا جائزہ
اس پریکٹیکل میں آپ TwoActivities ایپ میں شامل کرتے ہیں۔ ایپ تقریباً ویسا ہی نظر آتی ہے اور برتاؤ کرتی ہے جیسا کہ اس نے آخری کوڈ لیب میں کیا تھا۔ اس میں دو ایکٹیویٹی نفاذ ہیں اور صارف کو ان کے درمیان بھیجنے کی صلاحیت فراہم کرتا ہے۔ اس پریکٹیکل میں آپ ایپ میں جو تبدیلیاں کرتے ہیں وہ اس کے مرئی صارف کے رویے کو متاثر نہیں کرے گی۔
3. 3. ٹاسک 1: لائف سائیکل کال بیکس ٹو ایکٹیویٹیز میں شامل کریں۔
اس کام میں آپ تمام سرگرمی لائف سائیکل کال بیک طریقوں کو لاگو کریں گے تاکہ پیغامات کو لاگ کیٹ پر پرنٹ کرنے کے لیے جب ان طریقوں کو استعمال کیا جائے گا۔ یہ لاگ میسجز آپ کو یہ دیکھنے کی اجازت دیں گے کہ ایکٹیویٹی لائف سائیکل کی حالت کب بدلتی ہے، اور وہ لائف سائیکل حالت کی تبدیلیاں آپ کی ایپ کے چلنے پر کیسے اثر انداز ہوتی ہیں۔
1.1 (اختیاری) TwoActivity پروجیکٹ کو کاپی کریں۔
اس پریکٹیکل کے کاموں کے لیے، آپ موجودہ ٹو ایکٹیویٹی پروجیکٹ میں ترمیم کریں گے جسے آپ نے آخری پریکٹیکل میں بنایا تھا۔ اگر آپ پچھلے TwoActivities پروجیکٹ کو برقرار رکھنے کو ترجیح دیتے ہیں، تو ضمیمہ میں درج مراحل پر عمل کریں: پروجیکٹ کی کاپی بنانے کے لیے یوٹیلیٹیز ۔
1.2 مین ایکٹیویٹی میں کال بیکس لاگو کریں۔
- اینڈرائیڈ اسٹوڈیو میں ٹو ایکٹیویٹی پروجیکٹ کھولیں، اور پروجیکٹ> اینڈرائیڈ پین میں مین ایکٹیویٹی کھولیں۔
- onCreate() طریقہ میں، درج ذیل لاگ اسٹیٹمنٹس شامل کریں:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- onStart() کال بیک کے لیے ایک اوور رائڈ شامل کریں، اس ایونٹ کے لاگ میں ایک بیان کے ساتھ:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
شارٹ کٹ کے لیے، اینڈرائیڈ اسٹوڈیو میں کوڈ> اوور رائڈ طریقے منتخب کریں۔ ایک ڈائیلاگ ان تمام ممکنہ طریقوں کے ساتھ ظاہر ہوتا ہے جنہیں آپ اپنی کلاس میں اوور رائڈ کر سکتے ہیں۔ فہرست میں سے ایک یا زیادہ کال بیک طریقوں کا انتخاب ان طریقوں کے لیے ایک مکمل ٹیمپلیٹ داخل کرتا ہے، بشمول سپر کلاس کو مطلوبہ کال۔
- onPause(), onRestart(), onResume(), onStop()، اور onDestroy() لائف سائیکل کال بیکس کو لاگو کرنے کے لیے ایک ٹیمپلیٹ کے طور پر onStart() طریقہ استعمال کریں۔
کال بیک کے تمام طریقوں میں ایک جیسے دستخط ہوتے ہیں (سوائے نام کے)۔ اگر آپ ان دیگر کال بیک طریقوں کو بنانے کے لیے onStart() کو کاپی اور پیسٹ کرتے ہیں، تو سپر کلاس میں صحیح طریقہ کو کال کرنے کے لیے مواد کو اپ ڈیٹ کرنا اور صحیح طریقہ کو لاگ کرنے کے لیے مت بھولیں۔
- اپنی ایپ چلائیں۔
- Logcat پین کو دکھانے کے لیے Android Studio کے نیچے Logcat ٹیب پر کلک کریں۔ آپ کو تین لاگ پیغامات نظر آنے چاہئیں جو تین لائف سائیکل ریاستوں کو دکھاتے ہیں جو کہ سرگرمی شروع ہوتے ہی منتقل ہو چکی ہے:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 سیکنڈ ایکٹیویٹی میں لائف سائیکل کال بیکس کو لاگو کریں۔
اب جب کہ آپ نے مین ایکٹیویٹی کے لیے لائف سائیکل کال بیک کے طریقے نافذ کر لیے ہیں، سیکنڈ ایکٹیویٹی کے لیے بھی ایسا ہی کریں۔
- سیکنڈ ایکٹیویٹی کھولیں۔
- کلاس کے اوپری حصے میں، LOG_TAG متغیر کے لیے ایک مستقل شامل کریں:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- لائف سائیکل کال بیکس اور لاگ اسٹیٹمنٹس کو دوسری سرگرمی میں شامل کریں۔ (آپ MainActivity سے کال بیک کے طریقوں کو کاپی اور پیسٹ کر سکتے ہیں۔)
- Finish() طریقہ سے ٹھیک پہلے returnReply() طریقہ میں لاگ اسٹیٹمنٹ شامل کریں:
Log.d(LOG_TAG, "End SecondActivity");
1.4 ایپ کے چلتے ہی لاگ کا مشاہدہ کریں**
- اپنی ایپ چلائیں۔
- Logcat پین کو دکھانے کے لیے Android Studio کے نیچے Logcat ٹیب پر کلک کریں۔
- تلاش کے خانے میں سرگرمی درج کریں۔ اینڈرائیڈ لاگ کیٹ بہت لمبی اور بے ترتیبی ہو سکتی ہے۔ چونکہ ہر کلاس میں LOG_TAG متغیر میں MainActivity یا SecondActivity کے الفاظ ہوتے ہیں، یہ کلیدی لفظ آپ کو لاگ کو صرف ان چیزوں کے لیے فلٹر کرنے دیتا ہے جن میں آپ کی دلچسپی ہے۔
اپنی ایپ کا استعمال کرتے ہوئے تجربہ کریں اور نوٹ کریں کہ زندگی کے مختلف واقعات جو مختلف اعمال کے جواب میں ہوتے ہیں۔ خاص طور پر، ان چیزوں کو آزمائیں:
- ایپ کو عام طور پر استعمال کریں (پیغام بھیجیں، دوسرے پیغام کے ساتھ جواب دیں)۔
- دوسری سرگرمی سے مرکزی سرگرمی پر واپس جانے کے لیے بیک بٹن کا استعمال کریں۔
- دوسری سرگرمی سے مرکزی سرگرمی پر واپس جانے کے لیے ایپ بار میں اوپر والے تیر کا استعمال کریں۔
- ڈیوائس کو اپنی ایپ میں مختلف اوقات میں مرکزی اور دوسری سرگرمی دونوں پر گھمائیں اور دیکھیں کہ * لاگ اور اسکرین پر کیا ہوتا ہے۔
- جائزہ بٹن دبائیں (ہوم کے دائیں جانب مربع بٹن) اور ایپ کو بند کریں (X کو تھپتھپائیں)۔
- ہوم اسکرین پر واپس جائیں اور اپنی ایپ کو دوبارہ شروع کریں۔
ٹپ: اگر آپ اپنی ایپ کو ایمولیٹر میں چلا رہے ہیں، تو آپ Control+F11 یا Control+Function+F11 کے ساتھ گردش کی نقل کر سکتے ہیں۔
ٹاسک 1 حل کوڈ
درج ذیل کوڈ کے ٹکڑے پہلے کام کے لیے حل کوڈ دکھاتے ہیں۔
مین ایکٹیویٹی
درج ذیل کوڈ کے ٹکڑے مین ایکٹیویٹی میں شامل کوڈ کو دکھاتے ہیں، لیکن پوری کلاس میں نہیں۔
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");
}
دوسری سرگرمی
درج ذیل کوڈ کے ٹکڑے سیکنڈ ایکٹیویٹی میں شامل کوڈ کو دکھاتے ہیں، لیکن پوری کلاس میں نہیں۔
سیکنڈ ایکٹیویٹی کلاس کے اوپری حصے میں:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
واپسی کا جواب () طریقہ:
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() کے ساتھ محفوظ کریں
آپ نے دیکھا ہوگا کہ ڈیوائس کو گھمانے سے دوسری سرگرمی کی حالت بالکل متاثر نہیں ہوتی ہے۔ اس کی وجہ یہ ہے کہ دوسری ایکٹیویٹی لے آؤٹ اور سٹیٹ اس ترتیب اور اس کو چالو کرنے والے ارادے سے تیار ہوتے ہیں۔ یہاں تک کہ اگر ایکٹیویٹی کو دوبارہ بنایا گیا ہے، ارادہ اب بھی موجود ہے اور جب بھی دوسری ایکٹیویٹی میں onCreate() طریقہ بلایا جاتا ہے تو اس میں موجود ڈیٹا اب بھی استعمال ہوتا ہے۔
اس کے علاوہ، آپ دیکھ سکتے ہیں کہ ہر ایک سرگرمی میں، آپ نے جو بھی ٹیکسٹ میسج میں ٹائپ کیا ہے یا EditText عناصر کا جواب دیا ہے وہ برقرار رہتا ہے یہاں تک کہ جب ڈیوائس کو گھمایا جاتا ہے۔ اس کی وجہ یہ ہے کہ آپ کے لے آؤٹ میں کچھ ویو عناصر کی ریاستی معلومات خود بخود کنفیگریشن تبدیلیوں میں محفوظ ہو جاتی ہیں، اور EditText کی موجودہ قدر ان صورتوں میں سے ایک ہے۔
لہذا صرف ایکٹیویٹی اسٹیٹ جس میں آپ کی دلچسپی ہے وہ ہیں جوابی ہیڈر کے لیے ٹیکسٹ ویو عناصر اور مین ایکٹیویٹی میں جوابی متن۔ دونوں TextView عناصر ڈیفالٹ کے لحاظ سے پوشیدہ ہیں۔ وہ صرف اس وقت ظاہر ہوتے ہیں جب آپ دوسری سرگرمی سے مرکزی سرگرمی کو واپس پیغام بھیجتے ہیں۔
اس کام میں آپ onSaveInstanceState() کا استعمال کرتے ہوئے ان دو TextView عناصر کی مثالی حالت کو محفوظ رکھنے کے لیے کوڈ شامل کرتے ہیں۔
- مین ایکٹیویٹی کھولیں۔
- onSaveInstanceState() کے اس سکیلیٹن نفاذ کو سرگرمی میں شامل کریں، یا سکیلیٹن اوور رائڈ داخل کرنے کے لیے Code > Override Methods استعمال کریں۔
@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، بٹن) کو کسی بھی وقت ڈیفالٹ لے آؤٹ سے دوبارہ بنایا جا سکتا ہے۔
نوٹ کریں کہ سسٹم کچھ ویو عناصر کی حالت کو محفوظ کرے گا، جیسے ایڈیٹ ٹیکسٹ کے مواد۔
2.2 onCreate() میں سرگرمی کی مثال کی حالت کو بحال کریں
ایک بار جب آپ ایکٹیویٹی مثال کی حالت کو محفوظ کر لیتے ہیں، تو آپ کو اسے بحال کرنے کی بھی ضرورت ہوتی ہے جب سرگرمی دوبارہ بنائی جاتی ہے۔ آپ یہ یا تو onCreate() میں کر سکتے ہیں، یا onRestoreInstanceState() کال بیک کو لاگو کر کے، جسے onStart() ایکٹیویٹی بننے کے بعد کہا جاتا ہے۔
زیادہ تر وقت سرگرمی کی حالت کو بحال کرنے کی بہتر جگہ onCreate() میں ہوتی ہے، تاکہ یہ یقینی بنایا جا سکے کہ UI، بشمول ریاست، جلد از جلد دستیاب ہو۔ تمام ابتداء ہو جانے کے بعد اسے onRestoreInstanceState() میں کرنا بعض اوقات آسان ہوتا ہے، یا ذیلی طبقات کو یہ فیصلہ کرنے کی اجازت دینا کہ آیا آپ کے پہلے سے طے شدہ نفاذ کو استعمال کرنا ہے۔
- onCreate() طریقہ میں، findViewById() کے ساتھ View متغیرات شروع ہونے کے بعد، یہ یقینی بنانے کے لیے ایک ٹیسٹ شامل کریں کہ savedInstanceState null نہیں ہے۔
// 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() میں ذخیرہ کردہ ڈیٹا کے ساتھ ایک بنڈل موجود ہوتا ہے۔
- اس چیک کے اندر، کلید "reply_visible" کے ساتھ بنڈل سے موجودہ مرئیت (سچ یا غلط) حاصل کریں۔
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- isVisible متغیر کے لیے اس پچھلی لائن کے نیچے ایک ٹیسٹ شامل کریں۔
if (isVisible) {
}
اگر اسٹیٹ بنڈل میں ایک ریپلائی_ویسیبل کلید ہے (اور isVisible اس لیے درست ہے)، آپ کو ریاست کو بحال کرنے کی ضرورت ہوگی۔
- isVisible ٹیسٹ کے اندر، ہیڈر کو مرئی بنائیں۔
mReplyHeadTextView.setVisibility(View.VISIBLE);
- کلید "reply_text" کے ساتھ بنڈل سے ٹیکسٹ جوابی پیغام حاصل کریں، اور اس سٹرنگ کو دکھانے کے لیے Reply TextView سیٹ کریں۔
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- جواب ٹیکسٹ ویو کو بھی مرئی بنائیں:
mReplyTextView.setVisibility(View.VISIBLE);
- ایپ چلائیں۔ اس بات کو یقینی بنانے کے لیے آلہ یا ایمولیٹر کو گھمانے کی کوشش کریں کہ ایکٹیویٹی کو دوبارہ بنانے کے بعد جوابی پیغام (اگر کوئی ہے) اسکرین پر موجود رہے۔
ٹاسک 2 حل کوڈ
مندرجہ ذیل کوڈ کے ٹکڑے اس کام کے حل کوڈ کو دکھاتے ہیں۔
مین ایکٹیویٹی
درج ذیل کوڈ کے ٹکڑے مین ایکٹیویٹی میں شامل کوڈ کو دکھاتے ہیں، لیکن پوری کلاس میں نہیں۔
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);
}
}
}
مکمل منصوبہ:
اینڈرائیڈ اسٹوڈیو پروجیکٹ: ٹو ایکٹیویٹی لائف سائیکل
5. کوڈنگ
چیلنج: صارف جو فہرست بنا رہا ہے اس کے لیے ایک اہم سرگرمی کے ساتھ ایک سادہ شاپنگ لسٹ ایپ بنائیں، اور عام شاپنگ آئٹمز کی فہرست کے لیے دوسری سرگرمی۔
- مرکزی سرگرمی میں بنانے کے لیے فہرست ہونی چاہیے، جو دس خالی ٹیکسٹ ویو عناصر پر مشتمل ہونی چاہیے۔
- مرکزی سرگرمی پر شامل آئٹم بٹن ایک دوسری سرگرمی شروع کرتا ہے جس میں عام شاپنگ آئٹمز (پنیر، چاول، سیب وغیرہ) کی فہرست ہوتی ہے۔ اشیاء کو ظاہر کرنے کے لیے بٹن عناصر کا استعمال کریں۔
- کسی آئٹم کا انتخاب صارف کو مرکزی سرگرمی کی طرف لوٹاتا ہے، اور منتخب کردہ آئٹم کو شامل کرنے کے لیے خالی ٹیکسٹ ویو کو اپ ڈیٹ کرتا ہے۔
ایک سرگرمی سے دوسری کو معلومات منتقل کرنے کے لیے ایک ارادے کا استعمال کریں۔ یقینی بنائیں کہ جب صارف ڈیوائس کو گھماتا ہے تو خریداری کی فہرست کی موجودہ حالت محفوظ ہوجاتی ہے۔
6. خلاصہ
- ایکٹیویٹی لائف سائیکل ریاستوں کا ایک مجموعہ ہے جس میں ایکٹیویٹی منتقل ہوتی ہے، اس کی شروعات اس وقت ہوتی ہے جب یہ پہلی بار بنتی ہے اور اس وقت ختم ہوتی ہے جب اینڈرائیڈ سسٹم اس سرگرمی کے لیے وسائل کا دوبارہ دعوی کرتا ہے۔
- جیسا کہ صارف ایک سرگرمی سے دوسری سرگرمی میں اور آپ کی ایپ کے اندر اور باہر نیویگیٹ کرتا ہے، ہر ایک سرگرمی ایکٹیویٹی لائف سائیکل میں ریاستوں کے درمیان منتقل ہوتی ہے۔
- ایکٹیویٹی لائف سائیکل میں ہر ریاست میں کال بیک کا ایک طریقہ ہوتا ہے جسے آپ اپنی ایکٹیویٹی کلاس میں اوور رائڈ کر سکتے ہیں۔
- لائف سائیکل کے طریقے ہیں onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy()۔
- لائف سائیکل کال بیک طریقہ کو اوور رائیڈ کرنا آپ کو اس طرز عمل کو شامل کرنے کی اجازت دیتا ہے جو اس وقت ہوتا ہے جب آپ کی سرگرمی اس حالت میں منتقل ہوتی ہے۔
- آپ کوڈ> اوور رائڈ کے ساتھ اینڈرائیڈ اسٹوڈیو میں اپنی کلاسوں میں سکیلیٹن اوور رائڈ کے طریقے شامل کر سکتے ہیں۔
- ڈیوائس کی ترتیب میں تبدیلیاں جیسے گردش کے نتیجے میں سرگرمی تباہ ہو جاتی ہے اور اس طرح دوبارہ بنائی جاتی ہے جیسے یہ نئی ہو۔
- ایکٹیویٹی سٹیٹ کا ایک حصہ کنفیگریشن تبدیلی پر محفوظ ہے، بشمول EditText عناصر کی موجودہ اقدار۔ دیگر تمام ڈیٹا کے لیے، آپ کو واضح طور پر اس ڈیٹا کو خود محفوظ کرنا چاہیے۔
- onSaveInstanceState() طریقہ میں سرگرمی کی مثال کی حالت کو محفوظ کریں۔
- مثال کے طور پر اسٹیٹ ڈیٹا بنڈل میں سادہ کلید/قدر کے جوڑے کے طور پر محفوظ کیا جاتا ہے۔ بنڈل میں ڈیٹا ڈالنے اور ڈیٹا کو بنڈل سے واپس حاصل کرنے کے لیے بنڈل کے طریقے استعمال کریں۔
- مثال کی حالت کو onCreate() میں بحال کریں، جو کہ ترجیحی طریقہ ہے، یا onRestoreInstanceState()۔ پیچھے