1. স্বাগতম
এই ব্যবহারিক কোডল্যাবটি ইউনিট 1 এর অংশ: অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টাল (সংস্করণ 2) কোর্সে শুরু করুন। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন:
- কোর্সের কোডল্যাবগুলির সম্পূর্ণ তালিকার জন্য, অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টালস (V2) এর জন্য কোডল্যাবগুলি দেখুন৷
- সমস্ত ধারণা অধ্যায়, অ্যাপস এবং স্লাইডের লিঙ্ক সহ কোর্স সম্পর্কে বিশদ বিবরণের জন্য, Android বিকাশকারীর মৌলিক বিষয়গুলি (সংস্করণ 2) দেখুন৷
ভূমিকা
এই ব্যবহারিক আপনি কার্যকলাপ জীবনচক্র সম্পর্কে আরো জানুন. জীবনচক্র হল এমন রাজ্যগুলির সেট যা একটি কার্যকলাপ তার সমগ্র জীবনকালের মধ্যে থাকতে পারে, যখন এটি তৈরি হয় তখন থেকে এটি ধ্বংস হয়ে যায় এবং সিস্টেমটি তার সংস্থানগুলি পুনরায় দাবি করে। যেহেতু একজন ব্যবহারকারী আপনার অ্যাপের ক্রিয়াকলাপগুলির মধ্যে নেভিগেট করে (সেইসাথে আপনার অ্যাপের মধ্যে এবং বাইরে), তাদের জীবনচক্রে বিভিন্ন রাজ্যের মধ্যে কার্যকলাপের স্থানান্তর।
একটি কার্যকলাপের জীবনচক্রের প্রতিটি পর্যায়ে একটি সংশ্লিষ্ট কলব্যাক পদ্ধতি রয়েছে: onCreate(), onStart(), onPause(), এবং আরও অনেক কিছু। যখন কোনো কার্যকলাপের অবস্থা পরিবর্তন হয়, তখন সংশ্লিষ্ট কলব্যাক পদ্ধতিটি চালু করা হয়। আপনি ইতিমধ্যে এই পদ্ধতিগুলির একটি দেখেছেন: onCreate()। আপনার অ্যাক্টিভিটি ক্লাসে যেকোনও লাইফসাইকেল কলব্যাক পদ্ধতিকে ওভাররাইড করে, আপনি ব্যবহারকারী বা সিস্টেম অ্যাকশনের প্রতিক্রিয়া হিসাবে কার্যকলাপের ডিফল্ট আচরণ পরিবর্তন করতে পারেন।
ডিভাইস-কনফিগারেশন পরিবর্তনের প্রতিক্রিয়াতে কার্যকলাপের অবস্থাও পরিবর্তিত হতে পারে, উদাহরণস্বরূপ যখন ব্যবহারকারী ডিভাইসটিকে প্রতিকৃতি থেকে ল্যান্ডস্কেপে ঘোরান। এই কনফিগারেশন পরিবর্তনগুলি ঘটলে, কার্যকলাপটি ধ্বংস হয়ে যায় এবং তার ডিফল্ট অবস্থায় পুনরায় তৈরি করা হয় এবং ব্যবহারকারীরা কার্যকলাপে প্রবেশ করা তথ্য হারাতে পারে। আপনার ব্যবহারকারীদের বিভ্রান্ত না করার জন্য, অপ্রত্যাশিত ডেটা ক্ষতি রোধ করতে আপনার অ্যাপটি বিকাশ করা গুরুত্বপূর্ণ৷ পরে এই ব্যবহারিকটিতে আপনি কনফিগারেশন পরিবর্তন নিয়ে পরীক্ষা করবেন এবং ডিভাইস কনফিগারেশন পরিবর্তন এবং অন্যান্য কার্যকলাপের জীবনচক্র ইভেন্টগুলির প্রতিক্রিয়া হিসাবে একটি কার্যকলাপের অবস্থা কীভাবে সংরক্ষণ করবেন তা শিখবেন।
এই ব্যবহারিকটিতে আপনি TwoActivities অ্যাপে লগিং স্টেটমেন্ট যোগ করেন এবং অ্যাপ ব্যবহার করার সাথে সাথে কার্যকলাপের জীবনচক্র পরিবর্তনগুলি পর্যবেক্ষণ করেন। তারপরে আপনি এই পরিবর্তনগুলির সাথে কাজ শুরু করুন এবং এই অবস্থার অধীনে ব্যবহারকারীর ইনপুট কীভাবে পরিচালনা করবেন তা অন্বেষণ করুন।
পূর্বশর্ত
আপনি সক্ষম হতে হবে:
- অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যাপ প্রকল্প তৈরি করুন এবং চালান।
- আপনার অ্যাপে লগ স্টেটমেন্ট যোগ করুন এবং লগক্যাট প্যানে সেই লগগুলি দেখুন।
- একটি কার্যকলাপ এবং একটি অভিপ্রায়কে বুঝুন এবং কাজ করুন এবং তাদের সাথে যোগাযোগ করতে স্বাচ্ছন্দ্য বোধ করুন৷
আপনি কি শিখবেন
- কিভাবে কার্যকলাপ জীবনচক্র কাজ করে.
- যখন একটি ক্রিয়াকলাপ শুরু হয়, বিরতি দেয়, থেমে যায় এবং ধ্বংস হয়ে যায়।
- কার্যকলাপ পরিবর্তনের সাথে যুক্ত জীবনচক্র কলব্যাক পদ্ধতি সম্পর্কে।
- অ্যাকশনের প্রভাব (যেমন কনফিগারেশন পরিবর্তন) যার ফলে অ্যাক্টিভিটি লাইফসাইকেল ইভেন্ট হতে পারে।
- কিভাবে জীবনচক্র ইভেন্ট জুড়ে কার্যকলাপ অবস্থা বজায় রাখা.
আপনি কি করবেন
- লগিং স্টেটমেন্ট অন্তর্ভুক্ত করার জন্য বিভিন্ন অ্যাক্টিভিটি লাইফসাইকেল কলব্যাক বাস্তবায়নের জন্য আগের ব্যবহারিক থেকে TwoActivities অ্যাপে কোড যোগ করুন।
- আপনার অ্যাপ্লিকেশান চলাকালীন এবং আপনার অ্যাপের প্রতিটি অ্যাক্টিভিটির সাথে ইন্টারঅ্যাক্ট করার সময় অবস্থার পরিবর্তনগুলি পর্যবেক্ষণ করুন।
- ডিভাইসে ব্যবহারকারীর আচরণ বা কনফিগারেশন পরিবর্তনের প্রতিক্রিয়ায় অপ্রত্যাশিতভাবে পুনরায় তৈরি করা একটি ক্রিয়াকলাপের দৃষ্টান্তের অবস্থা বজায় রাখতে আপনার অ্যাপটি পরিবর্তন করুন।
2. অ্যাপ ওভারভিউ
এই ব্যবহারিক ক্ষেত্রে আপনি TwoActivities অ্যাপে যোগ করুন। অ্যাপটি দেখায় এবং মোটামুটি একই আচরণ করে যেমনটি এটি গত কোডল্যাবে করেছিল। এটিতে দুটি কার্যকলাপ বাস্তবায়ন রয়েছে এবং ব্যবহারকারীকে তাদের মধ্যে পাঠানোর ক্ষমতা দেয়। এই ব্যবহারিক অ্যাপটিতে আপনি যে পরিবর্তনগুলি করবেন তা এর দৃশ্যমান ব্যবহারকারীর আচরণকে প্রভাবিত করবে না।
3. 3. টাস্ক 1: টু অ্যাক্টিভিটি-তে লাইফসাইকেল কলব্যাক যোগ করুন
এই টাস্কে আপনি লগক্যাটে বার্তা প্রিন্ট করার জন্য অ্যাক্টিভিটি লাইফসাইকেল কলব্যাক পদ্ধতিগুলি প্রয়োগ করবেন যখন সেই পদ্ধতিগুলি চালু করা হয়। এই লগ মেসেজগুলি আপনাকে দেখার অনুমতি দেবে যে কখন অ্যাক্টিভিটি লাইফসাইকেল স্টেট পরিবর্তিত হয় এবং কীভাবে সেই লাইফসাইকেল স্টেট পরিবর্তনগুলি আপনার অ্যাপ্লিকেশান চলাকালীন প্রভাবিত করে৷
1.1 (ঐচ্ছিক) TwoActivity প্রজেক্ট কপি করুন
এই ব্যবহারিক কাজের জন্য, আপনি সর্বশেষ ব্যবহারিক সময়ে তৈরি করা বিদ্যমান TwoActivities প্রকল্পটি পরিবর্তন করবেন। আপনি যদি পূর্ববর্তী 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() কপি এবং পেস্ট করেন, তাহলে সুপারক্লাসে সঠিক পদ্ধতিতে কল করতে এবং সঠিক পদ্ধতিতে লগ করতে বিষয়বস্তু আপডেট করতে ভুলবেন না।
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন। আপনি তিনটি লগ বার্তা দেখতে পাবেন যে তিনটি জীবনচক্রের অবস্থা দেখানো হয়েছে যে কার্যকলাপটি শুরু হওয়ার সাথে সাথে স্থানান্তরিত হয়েছে:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 সেকেন্ড অ্যাক্টিভিটিতে লাইফসাইকেল কলব্যাক প্রয়োগ করুন
এখন আপনি মেইনঅ্যাক্টিভিটির জন্য লাইফসাইকেল কলব্যাক পদ্ধতি প্রয়োগ করেছেন, সেকেন্ডঅ্যাক্টিভিটির জন্যও একই কাজ করুন।
- সেকেন্ড অ্যাক্টিভিটি খুলুন।
- ক্লাসের শীর্ষে, LOG_TAG ভেরিয়েবলের জন্য একটি ধ্রুবক যোগ করুন:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- দ্বিতীয় কার্যকলাপে লাইফসাইকেল কলব্যাক এবং লগ স্টেটমেন্ট যোগ করুন। (আপনি মেইনঅ্যাক্টিভিটি থেকে কলব্যাক পদ্ধতিগুলি কপি এবং পেস্ট করতে পারেন।)
- Finish() পদ্ধতির ঠিক আগে returnReply() পদ্ধতিতে একটি লগ স্টেটমেন্ট যোগ করুন:
Log.d(LOG_TAG, "End SecondActivity");
1.4 অ্যাপটি চলার সাথে সাথে লগটি পর্যবেক্ষণ করুন**
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন।
- অনুসন্ধান বাক্সে কার্যকলাপ লিখুন. অ্যান্ড্রয়েড লগক্যাট খুব দীর্ঘ এবং বিশৃঙ্খল হতে পারে। যেহেতু প্রতিটি ক্লাসের LOG_TAG ভেরিয়েবলে হয় MainActivity বা SecondActivity শব্দগুলি থাকে, এই কীওয়ার্ডটি আপনাকে শুধুমাত্র আপনার আগ্রহের জিনিসগুলির জন্য লগ ফিল্টার করতে দেয়৷
আপনার অ্যাপ ব্যবহার করে পরীক্ষা করুন এবং মনে রাখবেন যে জীবনচক্রের ঘটনাগুলি বিভিন্ন কর্মের প্রতিক্রিয়ায় ঘটে। বিশেষ করে, এই জিনিসগুলি চেষ্টা করুন:
- অ্যাপটি সাধারণভাবে ব্যবহার করুন (একটি বার্তা পাঠান, অন্য বার্তার সাথে উত্তর দিন)।
- দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে ব্যাক বোতামটি ব্যবহার করুন।
- দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে অ্যাপ বারে উপরের তীরটি ব্যবহার করুন।
- আপনার অ্যাপে বিভিন্ন সময়ে প্রধান এবং দ্বিতীয় উভয় ক্রিয়াকলাপে ডিভাইসটিকে ঘোরান এবং * লগ এবং স্ক্রিনে কী ঘটছে তা পর্যবেক্ষণ করুন।
- ওভারভিউ বোতাম টিপুন (হোমের ডানদিকে বর্গাকার বোতাম) এবং অ্যাপটি বন্ধ করুন (এক্সে আলতো চাপুন)।
- হোম স্ক্রিনে ফিরে যান এবং আপনার অ্যাপটি পুনরায় চালু করুন।
টিপ: আপনি যদি একটি এমুলেটরে আপনার অ্যাপ চালাচ্ছেন, তাহলে আপনি 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();
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() দিয়ে অ্যাক্টিভিটি ইনস্ট্যান্স স্টেট সেভ করুন
আপনি হয়তো লক্ষ্য করেছেন যে ডিভাইসটি ঘোরানো দ্বিতীয় কার্যকলাপের অবস্থাকে মোটেই প্রভাবিত করে না। এর কারণ হল দ্বিতীয় অ্যাক্টিভিটি লেআউট এবং স্টেট তৈরি করা হয় লেআউট থেকে এবং যে ইন্টেন্ট এটিকে সক্রিয় করেছে। এমনকি যদি অ্যাক্টিভিটি পুনরায় তৈরি করা হয়, তবুও ইন্টেন্টটি সেখানেই থাকে এবং প্রতিবার দ্বিতীয় অ্যাক্টিভিটির onCreate() মেথড কল করার সময় সেই ইন্টেন্টের ডেটা এখনও ব্যবহার করা হয়।
এছাড়াও, আপনি লক্ষ্য করতে পারেন যে প্রতিটি ক্রিয়াকলাপে, আপনি যে কোনও পাঠ্য বার্তায় টাইপ করেছেন বা EditText এলিমেন্টের উত্তর দিয়েছেন এমনকি ডিভাইসটি ঘোরানো থাকলেও তা বজায় থাকে। এর কারণ হল আপনার লেআউটের কিছু ভিউ এলিমেন্টের স্টেট ইনফরমেশন কনফিগারেশন পরিবর্তনের মাধ্যমে স্বয়ংক্রিয়ভাবে সংরক্ষিত হয় এবং একটি EditText এর বর্তমান মান সেই ক্ষেত্রেগুলির মধ্যে একটি।
তাই শুধুমাত্র অ্যাক্টিভিটি স্টেট যেটিতে আপনি আগ্রহী তা হল উত্তর শিরোনামের জন্য টেক্সটভিউ উপাদান এবং মূল অ্যাক্টিভিটির উত্তর পাঠ্য। উভয় TextView উপাদান ডিফল্টরূপে অদৃশ্য; আপনি দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে একটি বার্তা পাঠালেই সেগুলি দেখা যায়।
এই টাস্কে আপনি onSaveInstanceState() ব্যবহার করে এই দুটি TextView উপাদানের ইনস্ট্যান্স অবস্থা সংরক্ষণ করতে কোড যোগ করুন।
- মেইন অ্যাক্টিভিটি খুলুন।
- ক্রিয়াকলাপে onSaveInstanceState() এর এই কঙ্কাল বাস্তবায়ন যোগ করুন, অথবা একটি কঙ্কাল ওভাররাইড সন্নিবেশ করতে কোড > ওভাররাইড পদ্ধতি ব্যবহার করুন।
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- শিরোনামটি বর্তমানে দৃশ্যমান কিনা তা পরীক্ষা করে দেখুন, এবং যদি তাই হয় তাহলে পুটবুলিয়ান() পদ্ধতি এবং "reply_visible" কী দিয়ে স্টেট বান্ডেলে সেই দৃশ্যমান অবস্থাটি রাখুন।
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
মনে রাখবেন যে উত্তরের শিরোনাম এবং পাঠ্যটি অদৃশ্য হিসাবে চিহ্নিত করা হয়েছে যতক্ষণ না দ্বিতীয় কার্যকলাপ থেকে উত্তর আসে। যদি শিরোনামটি দৃশ্যমান হয়, তাহলে উত্তরের ডেটা আছে যা সংরক্ষণ করা প্রয়োজন। মনে রাখবেন যে আমরা শুধুমাত্র সেই দৃশ্যমান অবস্থাতে আগ্রহী — হেডারের প্রকৃত পাঠ্য সংরক্ষণ করার প্রয়োজন নেই, কারণ সেই পাঠ্যটি কখনই পরিবর্তিত হয় না।
- একই চেকের ভিতরে, বান্ডেলে উত্তরের পাঠ্য যোগ করুন।
outState.putString("reply_text",mReplyTextView.getText().toString());
হেডারটি দৃশ্যমান হলে আপনি অনুমান করতে পারেন যে উত্তর বার্তাটিও দৃশ্যমান। আপনাকে উত্তর বার্তাটির বর্তমান দৃশ্যমানতার অবস্থা পরীক্ষা বা সংরক্ষণ করার দরকার নেই। "রিপ্লাই_টেক্সট" কী সহ শুধুমাত্র বার্তাটির প্রকৃত পাঠ্যই স্টেট বান্ডিলে যায়।
আপনি শুধুমাত্র সেই দৃশ্য উপাদানগুলির অবস্থা সংরক্ষণ করেন যা কার্যকলাপ তৈরি হওয়ার পরে পরিবর্তিত হতে পারে। আপনার অ্যাপের অন্যান্য ভিউ উপাদানগুলি (এডিটটেক্সট, বোতাম) যেকোনো সময় ডিফল্ট লেআউট থেকে পুনরায় তৈরি করা যেতে পারে।
মনে রাখবেন যে সিস্টেমটি কিছু ভিউ উপাদানের অবস্থা সংরক্ষণ করবে, যেমন EditText-এর বিষয়বস্তু।
2.2 onCreate() এ অ্যাক্টিভিটি ইনস্ট্যান্স অবস্থা পুনরুদ্ধার করুন
একবার আপনি অ্যাক্টিভিটি ইন্সট্যান্স স্টেট সেভ করে ফেললে, অ্যাক্টিভিটি রিক্রিয়েট করার সময় আপনাকে এটি পুনরুদ্ধার করতে হবে। আপনি onCreate(), অথবা onRestoreInstanceState() কলব্যাক প্রয়োগ করে এটি করতে পারেন, যা কার্যকলাপ তৈরি হওয়ার পরে onStart() বলা হয়।
বেশিরভাগ সময় কার্যকলাপ অবস্থা পুনরুদ্ধার করার জন্য ভাল জায়গা হল onCreate(), নিশ্চিত করার জন্য যে UI, রাজ্য সহ, যত তাড়াতাড়ি সম্ভব উপলব্ধ। সমস্ত প্রারম্ভিকতা সম্পন্ন হওয়ার পরে এটি onRestoreInstanceState()-এ করা কখনও কখনও সুবিধাজনক হয়, অথবা আপনার ডিফল্ট বাস্তবায়ন ব্যবহার করবেন কিনা তা সিদ্ধান্ত নিতে সাবক্লাসগুলিকে অনুমতি দেওয়া হয়।
- 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() এ সঞ্চিত ডেটার সাথে একটি বান্ডেল তৈরি করা হয়েছে।
- সেই চেকের ভিতরে, "reply_visible" কী দিয়ে বান্ডেল থেকে বর্তমান দৃশ্যমানতা (সত্য বা মিথ্যা) পান।
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- isVisible ভেরিয়েবলের জন্য আগের লাইনের নিচে একটি পরীক্ষা যোগ করুন।
if (isVisible) {
}
যদি স্টেট বান্ডেলে একটি রিপ্লাই_ভিসিবল কী থাকে (এবং isVisible তাই সত্য), আপনাকে স্টেট পুনরুদ্ধার করতে হবে।
- isVisible পরীক্ষার ভিতরে, হেডারটি দৃশ্যমান করুন।
mReplyHeadTextView.setVisibility(View.VISIBLE);
- "reply_text" কী সহ বান্ডেল থেকে পাঠ্য উত্তর বার্তা পান এবং সেই স্ট্রিংটি দেখানোর জন্য উত্তর পাঠ্য ভিউ সেট করুন।
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. সারাংশ
- অ্যাক্টিভিটি লাইফসাইকেল হল রাজ্যগুলির একটি সেট একটি অ্যাক্টিভিটি স্থানান্তরিত হয়, যখন এটি প্রথম তৈরি হয় এবং শেষ হয় যখন Android সিস্টেম সেই কার্যকলাপের জন্য সংস্থানগুলি পুনরুদ্ধার করে৷
- ব্যবহারকারী যখন একটি অ্যাক্টিভিটি থেকে অন্য অ্যাক্টিভিটিতে নেভিগেট করে এবং আপনার অ্যাপের ভিতরে ও বাইরে, প্রতিটি অ্যাক্টিভিটি অ্যাক্টিভিটি লাইফসাইকেলের মধ্যে একটি স্টেটের মধ্যে চলে যায়।
- অ্যাক্টিভিটি লাইফসাইকেলের প্রতিটি স্টেটের একটি সংশ্লিষ্ট কলব্যাক পদ্ধতি রয়েছে যা আপনি আপনার অ্যাক্টিভিটি ক্লাসে ওভাররাইড করতে পারেন।
- জীবনচক্র পদ্ধতিগুলি হল onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy()।
- একটি লাইফসাইকেল কলব্যাক পদ্ধতি ওভাররাইড করা আপনাকে এমন আচরণ যোগ করতে দেয় যা ঘটে যখন আপনার কার্যকলাপ সেই অবস্থায় রূপান্তরিত হয়।
- আপনি কোড > ওভাররাইড সহ Android স্টুডিওতে আপনার ক্লাসে কঙ্কাল ওভাররাইড পদ্ধতি যোগ করতে পারেন।
- ডিভাইসের কনফিগারেশন পরিবর্তন যেমন ঘূর্ণনের ফলে অ্যাক্টিভিটি ধ্বংস হয়ে যায় এবং নতুন করে তৈরি হয়।
- EditText উপাদানের বর্তমান মান সহ একটি কনফিগারেশন পরিবর্তনে কার্যকলাপ অবস্থার একটি অংশ সংরক্ষণ করা হয়। অন্যান্য সমস্ত ডেটার জন্য, আপনাকে অবশ্যই সেই ডেটা নিজেই সংরক্ষণ করতে হবে৷
- onSaveInstanceState() পদ্ধতিতে কার্যকলাপ উদাহরণ অবস্থা সংরক্ষণ করুন।
- ইনস্ট্যান্স স্টেট ডেটা একটি বান্ডেলে সাধারণ কী/মান জোড়া হিসাবে সংরক্ষণ করা হয়। বান্ডেলের মধ্যে ডেটা রাখতে এবং বান্ডেল থেকে ডেটা ফেরত পেতে বান্ডেল পদ্ধতি ব্যবহার করুন।
- onCreate(), যা পছন্দের উপায়, অথবা onRestoreInstanceState() এ ইনস্ট্যান্স অবস্থা পুনরুদ্ধার করুন। ফিরে
1. স্বাগতম
এই ব্যবহারিক কোডল্যাবটি ইউনিট 1 এর অংশ: অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টাল (সংস্করণ 2) কোর্সে শুরু করুন। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সবচেয়ে বেশি মূল্য পাবেন:
- কোর্সের কোডল্যাবগুলির সম্পূর্ণ তালিকার জন্য, অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টালস (V2) এর জন্য কোডল্যাবগুলি দেখুন৷
- সমস্ত ধারণা অধ্যায়, অ্যাপস এবং স্লাইডের লিঙ্ক সহ কোর্স সম্পর্কে বিশদ বিবরণের জন্য, Android বিকাশকারীর মৌলিক বিষয়গুলি (সংস্করণ 2) দেখুন৷
ভূমিকা
এই ব্যবহারিক আপনি কার্যকলাপ জীবনচক্র সম্পর্কে আরো জানুন. জীবনচক্র হল এমন রাজ্যগুলির সেট যা একটি কার্যকলাপ তার সমগ্র জীবনকালের মধ্যে থাকতে পারে, যখন এটি তৈরি হয় তখন থেকে এটি ধ্বংস হয়ে যায় এবং সিস্টেমটি তার সংস্থানগুলি পুনরায় দাবি করে। যেহেতু একজন ব্যবহারকারী আপনার অ্যাপের ক্রিয়াকলাপগুলির মধ্যে নেভিগেট করে (সেইসাথে আপনার অ্যাপের মধ্যে এবং বাইরে), তাদের জীবনচক্রে বিভিন্ন রাজ্যের মধ্যে কার্যকলাপের স্থানান্তর।
একটি কার্যকলাপের জীবনচক্রের প্রতিটি পর্যায়ে একটি সংশ্লিষ্ট কলব্যাক পদ্ধতি রয়েছে: onCreate(), onStart(), onPause(), এবং আরও অনেক কিছু। যখন কোনো কার্যকলাপের অবস্থা পরিবর্তন হয়, তখন সংশ্লিষ্ট কলব্যাক পদ্ধতিটি চালু করা হয়। আপনি ইতিমধ্যে এই পদ্ধতিগুলির একটি দেখেছেন: onCreate()। আপনার অ্যাক্টিভিটি ক্লাসে যেকোনও লাইফসাইকেল কলব্যাক পদ্ধতিকে ওভাররাইড করে, আপনি ব্যবহারকারী বা সিস্টেম অ্যাকশনের প্রতিক্রিয়া হিসাবে কার্যকলাপের ডিফল্ট আচরণ পরিবর্তন করতে পারেন।
ডিভাইস-কনফিগারেশন পরিবর্তনের প্রতিক্রিয়াতে কার্যকলাপের অবস্থাও পরিবর্তিত হতে পারে, উদাহরণস্বরূপ যখন ব্যবহারকারী ডিভাইসটিকে প্রতিকৃতি থেকে ল্যান্ডস্কেপে ঘোরান। এই কনফিগারেশন পরিবর্তনগুলি ঘটলে, কার্যকলাপটি ধ্বংস হয়ে যায় এবং তার ডিফল্ট অবস্থায় পুনরায় তৈরি করা হয় এবং ব্যবহারকারীরা কার্যকলাপে প্রবেশ করা তথ্য হারাতে পারে। আপনার ব্যবহারকারীদের বিভ্রান্ত না করার জন্য, অপ্রত্যাশিত ডেটা ক্ষতি রোধ করতে আপনার অ্যাপটি বিকাশ করা গুরুত্বপূর্ণ৷ পরে এই ব্যবহারিকটিতে আপনি কনফিগারেশন পরিবর্তন নিয়ে পরীক্ষা করবেন এবং ডিভাইস কনফিগারেশন পরিবর্তন এবং অন্যান্য কার্যকলাপের জীবনচক্র ইভেন্টগুলির প্রতিক্রিয়া হিসাবে একটি কার্যকলাপের অবস্থা কীভাবে সংরক্ষণ করবেন তা শিখবেন।
এই ব্যবহারিকটিতে আপনি TwoActivities অ্যাপে লগিং স্টেটমেন্ট যোগ করেন এবং অ্যাপ ব্যবহার করার সাথে সাথে কার্যকলাপের জীবনচক্র পরিবর্তনগুলি পর্যবেক্ষণ করেন। তারপরে আপনি এই পরিবর্তনগুলির সাথে কাজ শুরু করুন এবং এই অবস্থার অধীনে ব্যবহারকারীর ইনপুট কীভাবে পরিচালনা করবেন তা অন্বেষণ করুন।
পূর্বশর্ত
আপনি সক্ষম হতে হবে:
- অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যাপ প্রকল্প তৈরি করুন এবং চালান।
- আপনার অ্যাপে লগ স্টেটমেন্ট যোগ করুন এবং লগক্যাট প্যানে সেই লগগুলি দেখুন।
- একটি কার্যকলাপ এবং একটি অভিপ্রায়কে বুঝুন এবং কাজ করুন এবং তাদের সাথে যোগাযোগ করতে স্বাচ্ছন্দ্য বোধ করুন৷
আপনি কি শিখবেন
- কিভাবে কার্যকলাপ জীবনচক্র কাজ করে.
- যখন একটি ক্রিয়াকলাপ শুরু হয়, বিরতি দেয়, থেমে যায় এবং ধ্বংস হয়ে যায়।
- কার্যকলাপ পরিবর্তনের সাথে যুক্ত জীবনচক্র কলব্যাক পদ্ধতি সম্পর্কে।
- অ্যাকশনের প্রভাব (যেমন কনফিগারেশন পরিবর্তন) যার ফলে অ্যাক্টিভিটি লাইফসাইকেল ইভেন্ট হতে পারে।
- কিভাবে জীবনচক্র ইভেন্ট জুড়ে কার্যকলাপ অবস্থা বজায় রাখা.
আপনি কি করবেন
- লগিং স্টেটমেন্ট অন্তর্ভুক্ত করার জন্য বিভিন্ন অ্যাক্টিভিটি লাইফসাইকেল কলব্যাক বাস্তবায়নের জন্য আগের ব্যবহারিক থেকে TwoActivities অ্যাপে কোড যোগ করুন।
- আপনার অ্যাপ্লিকেশান চলাকালীন এবং আপনার অ্যাপের প্রতিটি অ্যাক্টিভিটির সাথে ইন্টারঅ্যাক্ট করার সময় অবস্থার পরিবর্তনগুলি পর্যবেক্ষণ করুন।
- ডিভাইসে ব্যবহারকারীর আচরণ বা কনফিগারেশন পরিবর্তনের প্রতিক্রিয়ায় অপ্রত্যাশিতভাবে পুনরায় তৈরি করা একটি ক্রিয়াকলাপের দৃষ্টান্তের অবস্থা বজায় রাখতে আপনার অ্যাপটি পরিবর্তন করুন।
2. অ্যাপ ওভারভিউ
এই ব্যবহারিক ক্ষেত্রে আপনি TwoActivities অ্যাপে যোগ করুন। অ্যাপটি দেখায় এবং মোটামুটি একই আচরণ করে যেমনটি এটি গত কোডল্যাবে করেছিল। এটিতে দুটি কার্যকলাপ বাস্তবায়ন রয়েছে এবং ব্যবহারকারীকে তাদের মধ্যে পাঠানোর ক্ষমতা দেয়। এই ব্যবহারিক অ্যাপটিতে আপনি যে পরিবর্তনগুলি করবেন তা এর দৃশ্যমান ব্যবহারকারীর আচরণকে প্রভাবিত করবে না।
3. 3. টাস্ক 1: টু অ্যাক্টিভিটি-তে লাইফসাইকেল কলব্যাক যোগ করুন
এই টাস্কে আপনি লগক্যাটে বার্তা প্রিন্ট করার জন্য অ্যাক্টিভিটি লাইফসাইকেল কলব্যাক পদ্ধতিগুলি প্রয়োগ করবেন যখন সেই পদ্ধতিগুলি চালু করা হয়। এই লগ মেসেজগুলি আপনাকে দেখার অনুমতি দেবে যে কখন অ্যাক্টিভিটি লাইফসাইকেল স্টেট পরিবর্তিত হয় এবং কীভাবে সেই লাইফসাইকেল স্টেট পরিবর্তনগুলি আপনার অ্যাপ্লিকেশান চলাকালীন প্রভাবিত করে৷
1.1 (ঐচ্ছিক) TwoActivity প্রজেক্ট কপি করুন
এই ব্যবহারিক কাজের জন্য, আপনি সর্বশেষ ব্যবহারিক সময়ে তৈরি করা বিদ্যমান TwoActivities প্রকল্পটি পরিবর্তন করবেন। আপনি যদি পূর্ববর্তী 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() কপি এবং পেস্ট করেন, তাহলে সুপারক্লাসে সঠিক পদ্ধতিতে কল করতে এবং সঠিক পদ্ধতিতে লগ করতে বিষয়বস্তু আপডেট করতে ভুলবেন না।
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন। আপনি তিনটি লগ বার্তা দেখতে পাবেন যে তিনটি জীবনচক্রের অবস্থা দেখানো হয়েছে যে কার্যকলাপটি শুরু হওয়ার সাথে সাথে স্থানান্তরিত হয়েছে:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 সেকেন্ড অ্যাক্টিভিটিতে লাইফসাইকেল কলব্যাক প্রয়োগ করুন
এখন আপনি মেইনঅ্যাক্টিভিটির জন্য লাইফসাইকেল কলব্যাক পদ্ধতি প্রয়োগ করেছেন, সেকেন্ডঅ্যাক্টিভিটির জন্যও একই কাজ করুন।
- সেকেন্ড অ্যাক্টিভিটি খুলুন।
- ক্লাসের শীর্ষে, LOG_TAG ভেরিয়েবলের জন্য একটি ধ্রুবক যোগ করুন:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- দ্বিতীয় কার্যকলাপে লাইফসাইকেল কলব্যাক এবং লগ স্টেটমেন্ট যোগ করুন। (আপনি মেইনঅ্যাক্টিভিটি থেকে কলব্যাক পদ্ধতিগুলি কপি এবং পেস্ট করতে পারেন।)
- Finish() পদ্ধতির ঠিক আগে returnReply() পদ্ধতিতে একটি লগ স্টেটমেন্ট যোগ করুন:
Log.d(LOG_TAG, "End SecondActivity");
1.4 অ্যাপটি চলার সাথে সাথে লগটি পর্যবেক্ষণ করুন**
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন।
- অনুসন্ধান বাক্সে কার্যকলাপ লিখুন. অ্যান্ড্রয়েড লগক্যাট খুব দীর্ঘ এবং বিশৃঙ্খল হতে পারে। যেহেতু প্রতিটি ক্লাসের LOG_TAG ভেরিয়েবলে হয় MainActivity বা SecondActivity শব্দগুলি থাকে, এই কীওয়ার্ডটি আপনাকে শুধুমাত্র আপনার আগ্রহের জিনিসগুলির জন্য লগ ফিল্টার করতে দেয়৷
আপনার অ্যাপ ব্যবহার করে পরীক্ষা করুন এবং মনে রাখবেন যে জীবনচক্রের ঘটনাগুলি বিভিন্ন কর্মের প্রতিক্রিয়ায় ঘটে। বিশেষ করে, এই জিনিসগুলি চেষ্টা করুন:
- অ্যাপটি সাধারণভাবে ব্যবহার করুন (একটি বার্তা পাঠান, অন্য বার্তার সাথে উত্তর দিন)।
- দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে ব্যাক বোতামটি ব্যবহার করুন।
- দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে অ্যাপ বারে উপরের তীরটি ব্যবহার করুন।
- আপনার অ্যাপে বিভিন্ন সময়ে প্রধান এবং দ্বিতীয় উভয় ক্রিয়াকলাপে ডিভাইসটিকে ঘোরান এবং * লগ এবং স্ক্রিনে কী ঘটছে তা পর্যবেক্ষণ করুন।
- ওভারভিউ বোতাম টিপুন (হোমের ডানদিকে বর্গাকার বোতাম) এবং অ্যাপটি বন্ধ করুন (এক্সে আলতো চাপুন)।
- হোম স্ক্রিনে ফিরে যান এবং আপনার অ্যাপটি পুনরায় চালু করুন।
টিপ: আপনি যদি একটি এমুলেটরে আপনার অ্যাপ চালাচ্ছেন, তাহলে আপনি 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();
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() দিয়ে অ্যাক্টিভিটি ইনস্ট্যান্স স্টেট সেভ করুন
আপনি হয়তো লক্ষ্য করেছেন যে ডিভাইসটি ঘোরানো দ্বিতীয় কার্যকলাপের অবস্থাকে মোটেই প্রভাবিত করে না। এর কারণ হল দ্বিতীয় অ্যাক্টিভিটি লেআউট এবং স্টেট তৈরি করা হয় লেআউট থেকে এবং যে ইন্টেন্ট এটিকে সক্রিয় করেছে। এমনকি যদি অ্যাক্টিভিটি পুনরায় তৈরি করা হয়, তবুও ইন্টেন্টটি সেখানেই থাকে এবং প্রতিবার দ্বিতীয় অ্যাক্টিভিটির onCreate() মেথড কল করার সময় সেই ইন্টেন্টের ডেটা এখনও ব্যবহার করা হয়।
এছাড়াও, আপনি লক্ষ্য করতে পারেন যে প্রতিটি ক্রিয়াকলাপে, আপনি যে কোনও পাঠ্য বার্তায় টাইপ করেছেন বা EditText এলিমেন্টের উত্তর দিয়েছেন এমনকি ডিভাইসটি ঘোরানো থাকলেও তা বজায় থাকে। এর কারণ হল আপনার লেআউটের কিছু ভিউ এলিমেন্টের স্টেট ইনফরমেশন কনফিগারেশন পরিবর্তনের মাধ্যমে স্বয়ংক্রিয়ভাবে সংরক্ষিত হয় এবং একটি EditText এর বর্তমান মান সেই ক্ষেত্রেগুলির মধ্যে একটি।
তাই শুধুমাত্র অ্যাক্টিভিটি স্টেট যেটিতে আপনি আগ্রহী তা হল উত্তর শিরোনামের জন্য টেক্সটভিউ উপাদান এবং মূল অ্যাক্টিভিটির উত্তর পাঠ্য। উভয় TextView উপাদান ডিফল্টরূপে অদৃশ্য; আপনি দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে একটি বার্তা পাঠালেই সেগুলি দেখা যায়।
এই টাস্কে আপনি onSaveInstanceState() ব্যবহার করে এই দুটি TextView উপাদানের ইনস্ট্যান্স অবস্থা সংরক্ষণ করতে কোড যোগ করুন।
- মেইন অ্যাক্টিভিটি খুলুন।
- ক্রিয়াকলাপে onSaveInstanceState() এর এই কঙ্কাল বাস্তবায়ন যোগ করুন, অথবা একটি কঙ্কাল ওভাররাইড সন্নিবেশ করতে কোড > ওভাররাইড পদ্ধতি ব্যবহার করুন।
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- শিরোনামটি বর্তমানে দৃশ্যমান কিনা তা পরীক্ষা করে দেখুন, এবং যদি তাই হয় তাহলে পুটবুলিয়ান() পদ্ধতি এবং "reply_visible" কী দিয়ে স্টেট বান্ডেলে সেই দৃশ্যমান অবস্থাটি রাখুন।
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
মনে রাখবেন যে উত্তরের শিরোনাম এবং পাঠ্যটি অদৃশ্য হিসাবে চিহ্নিত করা হয়েছে যতক্ষণ না দ্বিতীয় কার্যকলাপ থেকে উত্তর আসে। যদি শিরোনামটি দৃশ্যমান হয়, তাহলে উত্তরের ডেটা আছে যা সংরক্ষণ করা প্রয়োজন। মনে রাখবেন যে আমরা শুধুমাত্র সেই দৃশ্যমান অবস্থাতে আগ্রহী — হেডারের প্রকৃত পাঠ্য সংরক্ষণ করার প্রয়োজন নেই, কারণ সেই পাঠ্যটি কখনই পরিবর্তিত হয় না।
- একই চেকের ভিতরে, বান্ডেলে উত্তরের পাঠ্য যোগ করুন।
outState.putString("reply_text",mReplyTextView.getText().toString());
হেডারটি দৃশ্যমান হলে আপনি অনুমান করতে পারেন যে উত্তর বার্তাটিও দৃশ্যমান। আপনাকে উত্তর বার্তাটির বর্তমান দৃশ্যমানতার অবস্থা পরীক্ষা বা সংরক্ষণ করার দরকার নেই। "রিপ্লাই_টেক্সট" কী সহ শুধুমাত্র বার্তাটির প্রকৃত পাঠ্যই স্টেট বান্ডিলে যায়।
আপনি শুধুমাত্র সেই দৃশ্য উপাদানগুলির অবস্থা সংরক্ষণ করেন যা কার্যকলাপ তৈরি হওয়ার পরে পরিবর্তিত হতে পারে। আপনার অ্যাপের অন্যান্য ভিউ উপাদানগুলি (এডিটটেক্সট, বোতাম) যেকোনো সময় ডিফল্ট লেআউট থেকে পুনরায় তৈরি করা যেতে পারে।
মনে রাখবেন যে সিস্টেমটি কিছু ভিউ উপাদানের অবস্থা সংরক্ষণ করবে, যেমন EditText-এর বিষয়বস্তু।
2.2 onCreate() এ অ্যাক্টিভিটি ইনস্ট্যান্স অবস্থা পুনরুদ্ধার করুন
একবার আপনি অ্যাক্টিভিটি ইন্সট্যান্স স্টেট সেভ করে ফেললে, অ্যাক্টিভিটি রিক্রিয়েট করার সময় আপনাকে এটি পুনরুদ্ধার করতে হবে। আপনি onCreate(), অথবা onRestoreInstanceState() কলব্যাক প্রয়োগ করে এটি করতে পারেন, যা কার্যকলাপ তৈরি হওয়ার পরে onStart() বলা হয়।
বেশিরভাগ সময় কার্যকলাপ অবস্থা পুনরুদ্ধার করার জন্য ভাল জায়গা হল onCreate(), নিশ্চিত করার জন্য যে UI, রাজ্য সহ, যত তাড়াতাড়ি সম্ভব উপলব্ধ। সমস্ত প্রারম্ভিকতা সম্পন্ন হওয়ার পরে এটি onRestoreInstanceState()-এ করা কখনও কখনও সুবিধাজনক হয়, অথবা আপনার ডিফল্ট বাস্তবায়ন ব্যবহার করবেন কিনা তা সিদ্ধান্ত নিতে সাবক্লাসগুলিকে অনুমতি দেওয়া হয়।
- 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() এ সঞ্চিত ডেটার সাথে একটি বান্ডেল তৈরি করা হয়েছে।
- সেই চেকের ভিতরে, "reply_visible" কী দিয়ে বান্ডেল থেকে বর্তমান দৃশ্যমানতা (সত্য বা মিথ্যা) পান।
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- isVisible ভেরিয়েবলের জন্য আগের লাইনের নিচে একটি পরীক্ষা যোগ করুন।
if (isVisible) {
}
যদি স্টেট বান্ডেলে একটি রিপ্লাই_ভিসিবল কী থাকে (এবং isVisible তাই সত্য), আপনাকে স্টেট পুনরুদ্ধার করতে হবে।
- isVisible পরীক্ষার ভিতরে, হেডারটি দৃশ্যমান করুন।
mReplyHeadTextView.setVisibility(View.VISIBLE);
- "reply_text" কী সহ বান্ডেল থেকে পাঠ্য উত্তর বার্তা পান এবং সেই স্ট্রিংটি দেখানোর জন্য উত্তর পাঠ্য ভিউ সেট করুন।
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. সারাংশ
- ক্রিয়াকলাপের জীবনচক্রটি এমন একটি সেট যা একটি ক্রিয়াকলাপের মধ্য দিয়ে স্থানান্তরিত হয়, যখন এটি প্রথম তৈরি হয় এবং যখন অ্যান্ড্রয়েড সিস্টেম সেই ক্রিয়াকলাপের জন্য সংস্থানগুলি পুনরায় দাবি করে তখন শেষ হয়।
- ব্যবহারকারী যেমন একটি ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে এবং আপনার অ্যাপ্লিকেশনটির অভ্যন্তরে এবং বাইরে নেভিগেট করে, প্রতিটি ক্রিয়াকলাপ ক্রিয়াকলাপের জীবনচক্রের মধ্যে রাজ্যের মধ্যে চলে আসে।
- ক্রিয়াকলাপের লাইফসাইকেলের প্রতিটি রাজ্যে একটি সম্পর্কিত কলব্যাক পদ্ধতি রয়েছে যা আপনি আপনার ক্রিয়াকলাপের শ্রেণিতে ওভাররাইড করতে পারেন।
- লাইফসাইকেল পদ্ধতিগুলি হ'ল অনক্রিট (), অনস্টার্ট (), অনপজ (), অনারস্টার্ট (), অনেরেসিউম (), অনস্টপ (), অনডেস্ট্রয় ()।
- একটি লাইফসাইকেল কলব্যাক পদ্ধতি ওভাররাইডিং আপনাকে এমন আচরণ যুক্ত করতে দেয় যা ঘটে যখন আপনার ক্রিয়াকলাপটি সেই অবস্থায় রূপান্তরিত হয়।
- আপনি কোড> ওভাররাইড সহ অ্যান্ড্রয়েড স্টুডিওতে আপনার ক্লাসে কঙ্কাল ওভাররাইড পদ্ধতি যুক্ত করতে পারেন।
- ডিভাইস কনফিগারেশন পরিবর্তন যেমন ঘূর্ণনের ফলে ক্রিয়াকলাপটি ধ্বংস হয়ে যায় এবং পুনরায় তৈরি করা হয় যেন এটি নতুন।
- ক্রিয়াকলাপ অবস্থার একটি অংশ এডিটেক্সট উপাদানগুলির বর্তমান মানগুলি সহ একটি কনফিগারেশন পরিবর্তনে সংরক্ষণ করা হয়। অন্যান্য সমস্ত ডেটার জন্য, আপনাকে অবশ্যই স্পষ্টভাবে সেই ডেটা নিজেই সংরক্ষণ করতে হবে।
- অনস্যাভেইনস্ট্যানস্টেটেট () পদ্ধতিতে ক্রিয়াকলাপের উদাহরণ রাজ্য সংরক্ষণ করুন।
- উদাহরণ রাষ্ট্রের ডেটা একটি বান্ডলে সাধারণ কী/মান জোড়া হিসাবে সংরক্ষণ করা হয়। ডেটা রাখতে এবং বান্ডিল থেকে ডেটা ফিরিয়ে আনতে বান্ডিল পদ্ধতিগুলি ব্যবহার করুন।
- অনক্রিট () এ উদাহরণটি পুনরুদ্ধার করুন, যা পছন্দসই উপায়, বা অনারস্টোরইনস্ট্যানস্টেটেট ()। ফিরে
1. স্বাগতম
এই ব্যবহারিক কোডল্যাবটি ইউনিট 1 এর অংশ: অ্যান্ড্রয়েড বিকাশকারী ফান্ডামেন্টালস (সংস্করণ 2) কোর্সে শুরু করুন। আপনি যদি ধারাবাহিকভাবে কোডেল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সটি থেকে সর্বাধিক মূল্য পাবেন:
- কোর্সে কোডল্যাবগুলির সম্পূর্ণ তালিকার জন্য, অ্যান্ড্রয়েড বিকাশকারী ফান্ডামেন্টালস (ভি 2) এর জন্য কোডল্যাবগুলি দেখুন।
- সমস্ত ধারণা অধ্যায়, অ্যাপ্লিকেশন এবং স্লাইডগুলির লিঙ্ক সহ কোর্স সম্পর্কে বিশদগুলির জন্য, অ্যান্ড্রয়েড বিকাশকারী মৌলিক (সংস্করণ 2) দেখুন।
ভূমিকা
এই ব্যবহারিকটিতে আপনি ক্রিয়াকলাপের জীবনচক্র সম্পর্কে আরও শিখেন। লাইফাইসাইকেলটি হ'ল একটি ক্রিয়াকলাপের সেট যা তার পুরো জীবদ্দশায় থাকতে পারে, যখন এটি ধ্বংস হয়ে যায় এবং সিস্টেমটি তার সংস্থানগুলি পুনরুদ্ধার করে তখন থেকে তৈরি হয়। একজন ব্যবহারকারী আপনার অ্যাপের ক্রিয়াকলাপগুলির মধ্যে নেভিগেট হিসাবে (পাশাপাশি আপনার অ্যাপের মধ্যে এবং বাইরেও), ক্রিয়াকলাপগুলি তাদের জীবনচক্রের বিভিন্ন রাজ্যের মধ্যে রূপান্তর করে।
কোনও ক্রিয়াকলাপের লাইফসাইকেলের প্রতিটি পর্যায়ে সম্পর্কিত কলব্যাক পদ্ধতি রয়েছে: অনক্রিট (), অনস্টার্ট (), অনপজ () এবং আরও অনেক কিছু। যখন কোনও ক্রিয়াকলাপটি পরিবর্তিত হয় তখন সম্পর্কিত কলব্যাক পদ্ধতিটি আহ্বান করা হয়। আপনি ইতিমধ্যে এই পদ্ধতিগুলির একটি দেখেছেন: অনক্রিট ()। আপনার ক্রিয়াকলাপের ক্লাসগুলিতে যে কোনও লাইফসাইকেল কলব্যাক পদ্ধতি ওভাররাইড করে আপনি ব্যবহারকারী বা সিস্টেমের ক্রিয়াকলাপের প্রতিক্রিয়া হিসাবে ক্রিয়াকলাপের ডিফল্ট আচরণ পরিবর্তন করতে পারেন।
ক্রিয়াকলাপের অবস্থা ডিভাইস-কনফিগারেশন পরিবর্তনের প্রতিক্রিয়াতেও পরিবর্তিত হতে পারে, উদাহরণস্বরূপ যখন ব্যবহারকারী ডিভাইসটিকে প্রতিকৃতি থেকে ল্যান্ডস্কেপে ঘোরান। যখন এই কনফিগারেশন পরিবর্তনগুলি ঘটে তখন ক্রিয়াকলাপটি তার ডিফল্ট অবস্থায় ধ্বংস হয়ে যায় এবং পুনরায় তৈরি করা হয় এবং ব্যবহারকারীরা ক্রিয়াকলাপে প্রবেশ করেছেন এমন তথ্য হারাতে পারেন। আপনার ব্যবহারকারীদের বিভ্রান্ত করা এড়াতে, আপনি অপ্রত্যাশিত ডেটা ক্ষতি রোধ করতে আপনার অ্যাপ্লিকেশনটি বিকাশ করা গুরুত্বপূর্ণ। পরে এই ব্যবহারিকটিতে আপনি কনফিগারেশন পরিবর্তনগুলি নিয়ে পরীক্ষা করেন এবং ডিভাইস কনফিগারেশন পরিবর্তন এবং অন্যান্য ক্রিয়াকলাপের জীবনচক্রের ইভেন্টগুলির প্রতিক্রিয়া হিসাবে কোনও ক্রিয়াকলাপের অবস্থা কীভাবে সংরক্ষণ করবেন তা শিখুন।
এই ব্যবহারিকটিতে আপনি দুটি অ্যাক্টিভিটিস অ্যাপে লগিং স্টেটমেন্ট যুক্ত করেন এবং অ্যাপটি ব্যবহার করার সাথে সাথে ক্রিয়াকলাপের জীবনচক্রের পরিবর্তনগুলি পর্যবেক্ষণ করেন। তারপরে আপনি এই পরিবর্তনগুলির সাথে কাজ করা এবং এই শর্তগুলির অধীনে কীভাবে ব্যবহারকারী ইনপুট পরিচালনা করবেন তা অন্বেষণ শুরু করুন।
পূর্বশর্ত
আপনি সক্ষম হতে হবে:
- অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যাপ্লিকেশন প্রকল্প তৈরি করুন এবং পরিচালনা করুন।
- আপনার অ্যাপ্লিকেশনটিতে লগ স্টেটমেন্ট যুক্ত করুন এবং লগক্যাট ফলকে সেই লগগুলি দেখুন।
- একটি ক্রিয়াকলাপ এবং একটি অভিপ্রায় দিয়ে বুঝতে এবং কাজ করুন এবং তাদের সাথে ইন্টারঅ্যাক্ট করতে স্বাচ্ছন্দ্য বোধ করুন।
আপনি কি শিখবেন
- ক্রিয়াকলাপ জীবনচক্র কীভাবে কাজ করে।
- যখন কোনও ক্রিয়াকলাপ শুরু হয়, বিরতি দেয়, থামে এবং ধ্বংস হয়ে যায়।
- ক্রিয়াকলাপ পরিবর্তনের সাথে সম্পর্কিত লাইফসাইকেল কলব্যাক পদ্ধতি সম্পর্কে।
- ক্রিয়াকলাপের প্রভাব (যেমন কনফিগারেশন পরিবর্তনগুলি) যার ফলে ক্রিয়াকলাপের জীবনচক্রের ইভেন্টগুলি হতে পারে।
- লাইফসাইকেল ইভেন্টগুলি জুড়ে কীভাবে ক্রিয়াকলাপের অবস্থা ধরে রাখা যায়।
আপনি কি করবেন
- লগিং স্টেটমেন্টগুলি অন্তর্ভুক্ত করতে বিভিন্ন ক্রিয়াকলাপের লাইফসাইকেল কলব্যাকগুলি বাস্তবায়নের জন্য পূর্ববর্তী ব্যবহারিক থেকে দুটি অ্যাক্টিভিটিস অ্যাপে কোড যুক্ত করুন।
- আপনার অ্যাপ্লিকেশনটি চলার সাথে সাথে এবং আপনি যখন আপনার অ্যাপের প্রতিটি ক্রিয়াকলাপের সাথে ইন্টারঅ্যাক্ট করেন তখন রাষ্ট্রের পরিবর্তনগুলি পর্যবেক্ষণ করুন।
- ডিভাইসে ব্যবহারকারীর আচরণ বা কনফিগারেশন পরিবর্তনের প্রতিক্রিয়া হিসাবে অপ্রত্যাশিতভাবে পুনরায় তৈরি করা এমন কোনও ক্রিয়াকলাপের উদাহরণটি ধরে রাখতে আপনার অ্যাপ্লিকেশনটি সংশোধন করুন।
2। অ্যাপ্লিকেশন ওভারভিউ
এই ব্যবহারিকটিতে আপনি দুটি অ্যাক্টিভিটিস অ্যাপটিতে যুক্ত করেছেন। অ্যাপ্লিকেশনটি শেষ কোডেল্যাবের মতো প্রায় একইরকম দেখায় এবং আচরণ করে। এটিতে দুটি ক্রিয়াকলাপ বাস্তবায়ন রয়েছে এবং ব্যবহারকারীকে তাদের মধ্যে প্রেরণের ক্ষমতা দেয়। এই ব্যবহারিকটিতে আপনি অ্যাপটিতে যে পরিবর্তনগুলি করেছেন তা তার দৃশ্যমান ব্যবহারকারীর আচরণকে প্রভাবিত করবে না।
3। 3। টাস্ক 1: দুটি অ্যাক্টিভিটিসে লাইফসাইকেল কলব্যাক যুক্ত করুন
এই কার্যক্রমে আপনি যখন এই পদ্ধতিগুলি আহ্বান করা হয় তখন লগক্যাটে বার্তাগুলি মুদ্রণের জন্য সমস্ত ক্রিয়াকলাপের লাইফসাইকেল কলব্যাক পদ্ধতিগুলি প্রয়োগ করবেন। এই লগ বার্তাগুলি আপনাকে কখন ক্রিয়াকলাপের জীবনচক্রের অবস্থার পরিবর্তন করে এবং সেই জীবনচক্রের অবস্থার পরিবর্তনগুলি কীভাবে আপনার অ্যাপ্লিকেশনটি চালানোর সাথে সাথে প্রভাবিত করে তা দেখার অনুমতি দেবে।
1.1 (al চ্ছিক) দুটি অ্যাক্টিভিটিজ প্রকল্পটি অনুলিপি করুন
এই ব্যবহারিকের কাজের জন্য, আপনি সর্বশেষ ব্যবহারিকটিতে নির্মিত বিদ্যমান দুটি অ্যাক্টিভিটিস প্রকল্পটি সংশোধন করবেন। আপনি যদি পূর্ববর্তী দুটি অ্যাক্টিভিটিস প্রকল্পটি অক্ষত রাখতে পছন্দ করেন তবে প্রকল্পের একটি অনুলিপি তৈরি করার জন্য পরিশিষ্ট: ইউটিলিটিগুলির পদক্ষেপগুলি অনুসরণ করুন।
1.2 কলব্যাকগুলি মূলএকটিভিটিতে প্রয়োগ করুন
- অ্যান্ড্রয়েড স্টুডিওতে দুটি অ্যাক্টিভিটিস প্রকল্পটি খুলুন এবং প্রকল্প> অ্যান্ড্রয়েড ফলকে মূল অ্যাক্টিভিটি খুলুন।
- অনক্রিট () পদ্ধতিতে নিম্নলিখিত লগ বিবৃতি যুক্ত করুন:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- সেই ইভেন্টের জন্য লগকে একটি বিবৃতি সহ অন স্টার্ট () কলব্যাকের জন্য একটি ওভাররাইড যুক্ত করুন:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
একটি শর্টকাটের জন্য, অ্যান্ড্রয়েড স্টুডিওতে কোড> ওভাররাইড পদ্ধতিগুলি নির্বাচন করুন। আপনি আপনার ক্লাসে ওভাররাইড করতে পারেন এমন সম্ভাব্য সমস্ত পদ্ধতির সাথে একটি ডায়ালগ উপস্থিত হয়। তালিকা থেকে এক বা একাধিক কলব্যাক পদ্ধতি নির্বাচন করা সুপারক্লাসে প্রয়োজনীয় কল সহ সেই পদ্ধতিগুলির জন্য একটি সম্পূর্ণ টেম্পলেট সন্নিবেশ করে।
- অনপজ (), অনারস্টার্ট (), অনারসিউম (), অন স্টপ (), এবং অনডেস্ট্রয় () লাইফসাইকেল কলব্যাকগুলি প্রয়োগ করতে টেমপ্লেট হিসাবে অনস্টার্ট () পদ্ধতিটি ব্যবহার করুন
সমস্ত কলব্যাক পদ্ধতির একই স্বাক্ষর রয়েছে (নাম বাদে)। আপনি যদি এই অন্যান্য কলব্যাক পদ্ধতিগুলি তৈরি করতে অনুলিপি করে স্টার্ট () পেস্ট করেন তবে সুপারক্লাসে সঠিক পদ্ধতিটি কল করার জন্য সামগ্রীগুলি আপডেট করতে এবং সঠিক পদ্ধতিটি লগ করতে ভুলবেন না।
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবটি ক্লিক করুন। আপনার তিনটি লগ বার্তা দেখা উচিত তিনটি লাইফসাইকেল দেখায় যে ক্রিয়াকলাপটি শুরু হওয়ার সাথে সাথে স্থানান্তরিত হয়েছে:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 দ্বিতীয় অ্যাক্টিভিটিতে লাইফসাইকেল কলব্যাকগুলি প্রয়োগ করুন
এখন যেহেতু আপনি মূলএকটিভিটির জন্য লাইফসাইকেল কলব্যাক পদ্ধতিগুলি প্রয়োগ করেছেন, দ্বিতীয় অ্যাক্টিভিটির জন্য একই কাজ করুন।
- দ্বিতীয় অ্যাক্টিভিটি খুলুন।
- ক্লাসের শীর্ষে, LOG_TAG ভেরিয়েবলের জন্য একটি ধ্রুবক যুক্ত করুন:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- দ্বিতীয় ক্রিয়াকলাপে লাইফসাইকেল কলব্যাকস এবং লগ স্টেটমেন্ট যুক্ত করুন। (আপনি মূলএকটিভিটি থেকে কলব্যাক পদ্ধতিগুলি অনুলিপি করে পেস্ট করতে পারেন))
- ফিনিস () পদ্ধতির ঠিক আগে রিটার্নপ্লাই () পদ্ধতিতে একটি লগ স্টেটমেন্ট যুক্ত করুন:
Log.d(LOG_TAG, "End SecondActivity");
1.4 অ্যাপটি চালানোর সাথে সাথে লগটি পর্যবেক্ষণ করুন **
- আপনার অ্যাপ চালান।
- লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবটি ক্লিক করুন।
- অনুসন্ধান বাক্সে ক্রিয়াকলাপ প্রবেশ করান। অ্যান্ড্রয়েড লগক্যাটটি খুব দীর্ঘ এবং বিশৃঙ্খলাযুক্ত হতে পারে। যেহেতু প্রতিটি শ্রেণিতে লগ_ট্যাগ ভেরিয়েবলের মধ্যে মূলএকটিভিটি বা দ্বিতীয় অ্যাক্টিভিটি শব্দ রয়েছে, এই কীওয়ার্ডটি আপনাকে কেবল আপনার আগ্রহী জিনিসগুলির জন্য লগ ফিল্টার করতে দেয়।
আপনার অ্যাপ্লিকেশনটি ব্যবহার করে পরীক্ষা করুন এবং নোট করুন যে বিভিন্ন ক্রিয়াকলাপের প্রতিক্রিয়া হিসাবে ঘটে যাওয়া লাইফসাইকেল ইভেন্টগুলি। বিশেষত, এই বিষয়গুলি ব্যবহার করে দেখুন:
- অ্যাপ্লিকেশনটি সাধারণত ব্যবহার করুন (একটি বার্তা প্রেরণ করুন, অন্য বার্তা দিয়ে উত্তর দিন)।
- দ্বিতীয় ক্রিয়াকলাপ থেকে মূল ক্রিয়াকলাপে ফিরে যেতে ব্যাক বোতামটি ব্যবহার করুন।
- দ্বিতীয় ক্রিয়াকলাপ থেকে মূল ক্রিয়াকলাপে ফিরে যেতে অ্যাপ বারে আপ তীরটি ব্যবহার করুন।
- আপনার অ্যাপ্লিকেশনটিতে বিভিন্ন সময়ে মূল এবং দ্বিতীয় ক্রিয়াকলাপ উভয় ক্ষেত্রেই ডিভাইসটি ঘোরান এবং * লগ এবং স্ক্রিনে কী ঘটে তা পর্যবেক্ষণ করুন।
- ওভারভিউ বোতামটি টিপুন (বাড়ির ডানদিকে স্কোয়ার বোতাম) এবং অ্যাপটি বন্ধ করুন (এক্সটি আলতো চাপুন)।
- হোম স্ক্রিনে ফিরে যান এবং আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন।
টিপ: আপনি যদি কোনও এমুলেটরে আপনার অ্যাপটি চালাচ্ছেন তবে আপনি নিয়ন্ত্রণ+এফ 11 বা কন্ট্রোল+ফাংশন+এফ 11 এর সাথে ঘূর্ণন অনুকরণ করতে পারেন।
টাস্ক 1 সমাধান কোড
নিম্নলিখিত কোড স্নিপেটগুলি প্রথম টাস্কের জন্য সমাধান কোডটি দেখায়।
প্রধান কার্যকলাপ
নিম্নলিখিত কোড স্নিপেটগুলি মেইনঅ্যাক্টিভিটিতে যুক্ত কোডটি দেখায়, তবে পুরো শ্রেণি নয়।
অনক্রিট () পদ্ধতি:
@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();
}
অন্যান্য জীবনচক্র পদ্ধতি:
উপরে মূলএকটিভিটি হিসাবে একই।
4। 4। টাস্ক 2: ক্রিয়াকলাপের উদাহরণটি সংরক্ষণ করুন এবং পুনরুদ্ধার করুন
সিস্টেমের সংস্থান এবং ব্যবহারকারীর আচরণের উপর নির্ভর করে, আপনার অ্যাপ্লিকেশনটির প্রতিটি ক্রিয়াকলাপ আপনার ভাবার চেয়ে অনেক বেশি ঘন ঘন ধ্বংস এবং পুনর্গঠন করা যেতে পারে।
আপনি যখন ডিভাইস বা এমুলেটরটি ঘোরান তখন আপনি শেষ বিভাগে এই আচরণটি লক্ষ্য করেছেন। ডিভাইসটি ঘোরানো একটি ডিভাইস কনফিগারেশন পরিবর্তনের একটি উদাহরণ। যদিও ঘূর্ণনটি সর্বাধিক সাধারণ, তবে সমস্ত কনফিগারেশন পরিবর্তনের ফলে বর্তমান ক্রিয়াকলাপটি ধ্বংস হয়ে যায় এবং পুনরায় তৈরি করা হয় যেন এটি নতুন। আপনি যদি আপনার কোডে এই আচরণের জন্য অ্যাকাউন্ট না করেন, যখন কোনও কনফিগারেশন পরিবর্তন ঘটে তখন আপনার ক্রিয়াকলাপের বিন্যাসটি তার ডিফল্ট উপস্থিতি এবং প্রাথমিক মানগুলিতে ফিরে যেতে পারে এবং আপনার ব্যবহারকারীরা তাদের স্থান, তাদের ডেটা বা তাদের অগ্রগতির অবস্থা হারাতে পারে আপনার অ্যাপ্লিকেশন।
প্রতিটি ক্রিয়াকলাপের অবস্থা ক্রিয়াকলাপের উদাহরণ হিসাবে পরিচিত একটি বান্ডিল অবজেক্টে কী/মান জোড়াগুলির একটি সেট হিসাবে সংরক্ষণ করা হয়। সিস্টেমটি ক্রিয়াকলাপ বন্ধ হওয়ার ঠিক আগে রাষ্ট্রের বান্ডিল উদাহরণস্বরূপ ডিফল্ট রাষ্ট্রের তথ্য সংরক্ষণ করে এবং সেই বান্ডিলটি পুনরুদ্ধার করার জন্য নতুন ক্রিয়াকলাপের উদাহরণে পাস করে।
কোনও ক্রিয়াকলাপে ডেটা হারাতে বাধা দেওয়ার জন্য যখন এটি অপ্রত্যাশিতভাবে ধ্বংস হয়ে যায় এবং পুনরায় তৈরি করা হয়, আপনাকে অনস্যাভেইনস্ট্যানস্ট্যান্টেট () পদ্ধতিটি প্রয়োগ করতে হবে। সিস্টেমটি আপনার ক্রিয়াকলাপে (অনপজ () এবং অনস্টপ () এর মধ্যে) এই পদ্ধতিটিকে কল করে যখন ক্রিয়াকলাপটি ধ্বংস এবং পুনরায় তৈরি হওয়ার সম্ভাবনা থাকে।
আপনি উদাহরণস্বরূপ অবস্থানে যে ডেটা সংরক্ষণ করেন তা বর্তমান অ্যাপ্লিকেশন সেশনের সময় এই নির্দিষ্ট ক্রিয়াকলাপের কেবলমাত্র এই উদাহরণের জন্য নির্দিষ্ট। আপনি যখন কোনও নতুন অ্যাপ্লিকেশন সেশনটি থামিয়ে পুনরায় চালু করেন, তখন ক্রিয়াকলাপের উদাহরণটি হারিয়ে যায় এবং ক্রিয়াকলাপটি তার ডিফল্ট উপস্থিতিতে ফিরে আসে। আপনার যদি অ্যাপ্লিকেশন সেশনের মধ্যে ব্যবহারকারীর ডেটা সংরক্ষণ করতে হয় তবে ভাগ করা পছন্দগুলি বা একটি ডাটাবেস ব্যবহার করুন। আপনি এই দুটি সম্পর্কে পরবর্তী ব্যবহারিক ক্ষেত্রে শিখবেন।
2.1 অনস্যাভেইনস্ট্যানস্টেটেট () এর সাথে ক্রিয়াকলাপের উদাহরণটি সংরক্ষণ করুন
আপনি লক্ষ্য করেছেন যে ডিভাইসটি ঘোরানো দ্বিতীয় ক্রিয়াকলাপের অবস্থাকে মোটেই প্রভাবিত করে না। এটি কারণ দ্বিতীয় ক্রিয়াকলাপের বিন্যাস এবং রাষ্ট্রটি লেআউট এবং এটি সক্রিয় করা অভিপ্রায় থেকে উত্পন্ন হয়। এমনকি যদি ক্রিয়াকলাপটি পুনরায় তৈরি করা হয়, তবে উদ্দেশ্যটি এখনও রয়েছে এবং দ্বিতীয় ক্রিয়াকলাপে অনক্রিট () পদ্ধতিটি বলা হয় তখন সেই অভিপ্রায়টির ডেটা এখনও ব্যবহৃত হয়।
তদতিরিক্ত, আপনি লক্ষ্য করতে পারেন যে প্রতিটি ক্রিয়াকলাপে, আপনি যে কোনও পাঠ্য বার্তায় টাইপ করেছেন বা এডিটটেক্সট উপাদানগুলির উত্তর দিন তা ডিভাইসটি ঘোরানো হলেও ধরে রাখা হয়েছে। এটি কারণ আপনার লেআউটে কিছু ভিউ উপাদানগুলির রাষ্ট্রীয় তথ্য স্বয়ংক্রিয়ভাবে কনফিগারেশন পরিবর্তনগুলি জুড়ে সংরক্ষণ করা হয় এবং একটি এডিটেক্সট এর বর্তমান মান সেই ক্ষেত্রে একটি।
সুতরাং আপনি যে কেবলমাত্র ক্রিয়াকলাপের মধ্যে আগ্রহী তা হ'ল উত্তর শিরোনাম এবং মূল ক্রিয়াকলাপের উত্তর পাঠ্যটির পাঠ্যভিউ উপাদান। উভয় পাঠ্যভিউ উপাদান ডিফল্টরূপে অদৃশ্য; আপনি দ্বিতীয় ক্রিয়াকলাপ থেকে মূল ক্রিয়াকলাপে কোনও বার্তা ফেরত পাঠানোর পরে এগুলি কেবল উপস্থিত হয়।
এই টাস্কে আপনি অনস্যাভেইনস্ট্যানস্টেটেট () ব্যবহার করে এই দুটি টেক্সটভিউ উপাদানগুলির উদাহরণ অবস্থার সংরক্ষণের জন্য কোড যুক্ত করুন।
- মেইন্যাকটিভিটি খুলুন।
- ক্রিয়াকলাপে অনস্যাভেইনস্ট্যানস্টেটেট () এর এই কঙ্কাল বাস্তবায়ন যুক্ত করুন, বা কঙ্কালের ওভাররাইড সন্নিবেশ করতে কোড> ওভাররাইড পদ্ধতিগুলি ব্যবহার করুন।
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- শিরোনামটি বর্তমানে দৃশ্যমান কিনা তা পরীক্ষা করে দেখুন এবং যদি তাই হয় তবে সেই দৃশ্যমানতাটিকে পুটবুলিয়ান () পদ্ধতি এবং মূল "উত্তর_ভিত্তিক" দিয়ে রাষ্ট্রের বান্ডলে রেখে দিন।
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
মনে রাখবেন যে দ্বিতীয় ক্রিয়াকলাপ থেকে কোনও উত্তর না পাওয়া পর্যন্ত উত্তর শিরোনাম এবং পাঠ্যটি অদৃশ্য হিসাবে চিহ্নিত করা হয়েছে। যদি শিরোনামটি দৃশ্যমান হয়, তবে সেখানে উত্তর ডেটা রয়েছে যা সংরক্ষণ করা দরকার। নোট করুন যে আমরা কেবল সেই দৃশ্যমানতার অবস্থার প্রতি আগ্রহী - শিরোনামের আসল পাঠ্যটি সংরক্ষণ করার দরকার নেই, কারণ সেই পাঠ্যটি কখনই পরিবর্তিত হয় না।
- একই চেকের ভিতরে, বান্ডলে উত্তর পাঠ্য যুক্ত করুন।
outState.putString("reply_text",mReplyTextView.getText().toString());
যদি শিরোনামটি দৃশ্যমান হয় তবে আপনি ধরে নিতে পারেন যে উত্তর বার্তাটি নিজেই দৃশ্যমান। আপনার উত্তর বার্তার বর্তমান দৃশ্যমানতা অবস্থার জন্য পরীক্ষা বা সংরক্ষণ করার দরকার নেই। কেবলমাত্র বার্তার আসল পাঠ্যটি কী "উত্তর_টেক্সট" দিয়ে রাজ্য বান্ডলে যায়।
আপনি কেবল সেই সমস্ত ভিউ উপাদানগুলির অবস্থা সংরক্ষণ করুন যা ক্রিয়াকলাপ তৈরি হওয়ার পরে পরিবর্তিত হতে পারে। আপনার অ্যাপের অন্যান্য ভিউ উপাদানগুলি (এডিটেক্সট, বোতাম) যে কোনও সময় ডিফল্ট বিন্যাস থেকে পুনরায় তৈরি করা যেতে পারে।
নোট করুন যে সিস্টেমটি কিছু ভিউ উপাদানগুলির অবস্থা যেমন সম্পাদনাটির বিষয়বস্তু সংরক্ষণ করবে।
২.২ অনক্রিয়েট () এ ক্রিয়াকলাপের উদাহরণটি পুনরুদ্ধার করুন
একবার আপনি ক্রিয়াকলাপের উদাহরণটি সংরক্ষণ করার পরে, ক্রিয়াকলাপটি পুনরায় তৈরি করার সময় আপনাকে এটি পুনরুদ্ধার করতে হবে। আপনি এটি অনক্রিয়েট () এ করতে পারেন, বা অনারস্টোরইনস্ট্যানেস্টেটেট () কলব্যাকটি প্রয়োগ করে, যা ক্রিয়াকলাপ তৈরি হওয়ার পরে অন স্টার্ট () এর পরে ডাকা হয়।
বেশিরভাগ সময় ক্রিয়াকলাপের অবস্থা পুনরুদ্ধার করার আরও ভাল জায়গাটি অনক্রিট () এ থাকে, যাতে রাষ্ট্র সহ ইউআই যত তাড়াতাড়ি সম্ভব উপলব্ধ থাকে তা নিশ্চিত করার জন্য। সমস্ত সূচনা করার পরেও এটি অন্রেস্টোরইনস্ট্যানস্টেটেট () এ করা কখনও কখনও সুবিধাজনক হয় বা সাবক্লাসগুলি আপনার ডিফল্ট বাস্তবায়নটি ব্যবহার করবেন কিনা তা সিদ্ধান্ত নেওয়ার অনুমতি দেওয়ার জন্য।
- অনক্রিট () পদ্ধতিতে, ভিউ ভেরিয়েবলগুলি ফাইন্ডভিউবিআইডি () দিয়ে শুরু করার পরে, সেভডিনস্ট্যানস্টেটটি নাল নয় তা নিশ্চিত করার জন্য একটি পরীক্ষা যুক্ত করুন।
// 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) {
}
যখন আপনার ক্রিয়াকলাপ তৈরি করা হয়, সিস্টেমটি তার একমাত্র যুক্তি হিসাবে রাজ্য বান্ডিলটি অনক্রিট () এ পাস করে। প্রথমবার অনক্রিট () বলা হয় এবং আপনার অ্যাপ্লিকেশনটি শুরু হয়, বান্ডিলটি নাল - আপনার অ্যাপ্লিকেশনটি প্রথমবার শুরু হওয়ার পরে কোনও বিদ্যমান রাষ্ট্র নেই। অনক্রিয়েট () এর পরবর্তী কলগুলিতে আপনি অনস্যাভেইনস্ট্যানস্টেটেট () এ সঞ্চিত ডেটা সহ একটি বান্ডিল জনবহুল রয়েছে।
- এই চেকের ভিতরে, "উত্তর_ভিত্তিক" কী দিয়ে বান্ডিল থেকে বর্তমান দৃশ্যমানতা (সত্য বা মিথ্যা) পান।
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- আইসভিজিবল ভেরিয়েবলের জন্য পূর্ববর্তী লাইনের নীচে একটি পরীক্ষা যুক্ত করুন।
if (isVisible) {
}
যদি রাষ্ট্রের বান্ডলে কোনও উত্তর_ভিত্তিক কী থাকে (এবং আইভিসিবল তাই সত্য), আপনাকে রাজ্যটি পুনরুদ্ধার করতে হবে।
- আইসভিবল পরীক্ষার অভ্যন্তরে, শিরোনামটি দৃশ্যমান করুন।
mReplyHeadTextView.setVisibility(View.VISIBLE);
- "উত্তর_টেক্সট" কী দিয়ে বান্ডিল থেকে পাঠ্য উত্তর বার্তাটি পান এবং সেই স্ট্রিংটি দেখানোর জন্য উত্তর পাঠ্যভিউটি সেট করুন।
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- উত্তর টেক্সটভিউটি দৃশ্যমান করুন:
mReplyTextView.setVisibility(View.VISIBLE);
- অ্যাপটি চালান। ক্রিয়াকলাপটি পুনরায় তৈরি হওয়ার পরে স্ক্রিনে উত্তর বার্তাটি (যদি সেখানে থাকে) থাকে তা নিশ্চিত করার জন্য ডিভাইস বা এমুলেটরটি ঘোরানোর চেষ্টা করুন।
টাস্ক 2 সমাধান কোড
নিম্নলিখিত কোড স্নিপেটগুলি এই কাজের জন্য সমাধান কোডটি দেখায়।
প্রধান কার্যকলাপ
নিম্নলিখিত কোড স্নিপেটগুলি মেইনঅ্যাক্টিভিটিতে যুক্ত কোডটি দেখায়, তবে পুরো শ্রেণি নয়।
অনস্যাভেইনস্ট্যানস্টেটেট () পদ্ধতি:
@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());
}
}
অনক্রিট () পদ্ধতি:
@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. সারাংশ
- ক্রিয়াকলাপের জীবনচক্রটি এমন একটি সেট যা একটি ক্রিয়াকলাপের মধ্য দিয়ে স্থানান্তরিত হয়, যখন এটি প্রথম তৈরি হয় এবং যখন অ্যান্ড্রয়েড সিস্টেম সেই ক্রিয়াকলাপের জন্য সংস্থানগুলি পুনরায় দাবি করে তখন শেষ হয়।
- ব্যবহারকারী যেমন একটি ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে এবং আপনার অ্যাপ্লিকেশনটির অভ্যন্তরে এবং বাইরে নেভিগেট করে, প্রতিটি ক্রিয়াকলাপ ক্রিয়াকলাপের জীবনচক্রের মধ্যে রাজ্যের মধ্যে চলে আসে।
- ক্রিয়াকলাপের লাইফসাইকেলের প্রতিটি রাজ্যে একটি সম্পর্কিত কলব্যাক পদ্ধতি রয়েছে যা আপনি আপনার ক্রিয়াকলাপের শ্রেণিতে ওভাররাইড করতে পারেন।
- লাইফসাইকেল পদ্ধতিগুলি হ'ল অনক্রিট (), অনস্টার্ট (), অনপজ (), অনারস্টার্ট (), অনেরেসিউম (), অনস্টপ (), অনডেস্ট্রয় ()।
- একটি লাইফসাইকেল কলব্যাক পদ্ধতি ওভাররাইডিং আপনাকে এমন আচরণ যুক্ত করতে দেয় যা ঘটে যখন আপনার ক্রিয়াকলাপটি সেই অবস্থায় রূপান্তরিত হয়।
- আপনি কোড> ওভাররাইড সহ অ্যান্ড্রয়েড স্টুডিওতে আপনার ক্লাসে কঙ্কাল ওভাররাইড পদ্ধতি যুক্ত করতে পারেন।
- ডিভাইস কনফিগারেশন পরিবর্তন যেমন ঘূর্ণনের ফলে ক্রিয়াকলাপটি ধ্বংস হয়ে যায় এবং পুনরায় তৈরি করা হয় যেন এটি নতুন।
- ক্রিয়াকলাপ অবস্থার একটি অংশ এডিটেক্সট উপাদানগুলির বর্তমান মানগুলি সহ একটি কনফিগারেশন পরিবর্তনে সংরক্ষণ করা হয়। অন্যান্য সমস্ত ডেটার জন্য, আপনাকে অবশ্যই স্পষ্টভাবে সেই ডেটা নিজেই সংরক্ষণ করতে হবে।
- অনস্যাভেইনস্ট্যানস্টেটেট () পদ্ধতিতে ক্রিয়াকলাপের উদাহরণ রাজ্য সংরক্ষণ করুন।
- উদাহরণ রাষ্ট্রের ডেটা একটি বান্ডলে সাধারণ কী/মান জোড়া হিসাবে সংরক্ষণ করা হয়। ডেটা রাখতে এবং বান্ডিল থেকে ডেটা ফিরিয়ে আনতে বান্ডিল পদ্ধতিগুলি ব্যবহার করুন।
- অনক্রিট () এ উদাহরণটি পুনরুদ্ধার করুন, যা পছন্দসই উপায়, বা অনারস্টোরইনস্ট্যানস্টেটেট ()। ফিরে