অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 04.2: জটিল জীবনচক্র পরিস্থিতি

এই কোডল্যাবটি Android Kotlin Fundamentals কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

শেষ কোডল্যাবে, আপনি Activity এবং Fragment লাইফসাইকেল সম্পর্কে শিখেছেন এবং আপনি সেই পদ্ধতিগুলি অন্বেষণ করেছেন যেগুলিকে বলা হয় যখন লাইফ সাইকেল স্টেট ক্রিয়াকলাপ এবং টুকরোগুলিতে পরিবর্তিত হয়৷ এই কোডল্যাবে, আপনি আরও বিস্তারিতভাবে কার্যকলাপ জীবনচক্র অন্বেষণ করুন. এছাড়াও আপনি অ্যান্ড্রয়েড জেটপ্যাকের লাইফসাইকেল লাইব্রেরি সম্পর্কেও জানুন, যা আপনাকে লাইফসাইকেল ইভেন্টগুলিকে কোডের মাধ্যমে পরিচালনা করতে সাহায্য করতে পারে যা আরও ভাল সংগঠিত এবং বজায় রাখা সহজ৷

আপনি ইতিমধ্যে কি জানা উচিত

  • একটি কার্যকলাপ কি এবং কিভাবে আপনার অ্যাপে একটি তৈরি করতে হয়।
  • Activity এবং Fragment লাইফসাইকেলের বুনিয়াদি, এবং যখন কোনও অ্যাক্টিভিটি রাজ্যের মধ্যে চলে যায় তখন কলব্যাকগুলি আহ্বান করা হয়।
  • কিভাবে onCreate() এবং onStop() লাইফসাইকেল কলব্যাক পদ্ধতিগুলিকে ওভাররাইড করা যায় বিভিন্ন সময়ে ক্রিয়াকলাপ বা ফ্র্যাগমেন্ট লাইফসাইকেলে অপারেশন করার জন্য।

আপনি কি শিখবেন

  • লাইফসাইকেল কলব্যাকগুলিতে আপনার অ্যাপের অংশগুলি কীভাবে সেট আপ করবেন, শুরু করবেন এবং বন্ধ করবেন।
  • একটি লাইফসাইকেল পর্যবেক্ষক তৈরি করতে অ্যান্ড্রয়েড লাইফসাইকেল লাইব্রেরি কীভাবে ব্যবহার করবেন এবং কার্যকলাপ এবং খণ্ড জীবনচক্র পরিচালনা করা সহজ করে তুলবেন৷
  • অ্যান্ড্রয়েড প্রসেস শাটডাউন কীভাবে আপনার অ্যাপের ডেটাকে প্রভাবিত করে এবং অ্যান্ড্রয়েড আপনার অ্যাপ বন্ধ করে দিলে কীভাবে সেই ডেটা স্বয়ংক্রিয়ভাবে সংরক্ষণ ও পুনরুদ্ধার করা যায়।
  • কীভাবে ডিভাইসের ঘূর্ণন এবং অন্যান্য কনফিগারেশন পরিবর্তনগুলি জীবনচক্রের অবস্থার পরিবর্তনগুলি তৈরি করে এবং আপনার অ্যাপের অবস্থাকে প্রভাবিত করে৷

আপনি কি করবেন

  • একটি টাইমার ফাংশন অন্তর্ভুক্ত করতে DessertClicker অ্যাপটি পরিবর্তন করুন এবং কার্যকলাপের জীবনচক্রের বিভিন্ন সময়ে সেই টাইমারটি শুরু করুন এবং বন্ধ করুন৷
  • অ্যান্ড্রয়েড লাইফসাইকেল লাইব্রেরি ব্যবহার করতে অ্যাপটি পরিবর্তন করুন এবং DessertTimer ক্লাসকে লাইফসাইকেল পর্যবেক্ষকে রূপান্তর করুন।
  • আপনার অ্যাপের প্রসেস শাটডাউন এবং তারপরে ঘটে যাওয়া লাইফসাইকেল কলব্যাকগুলি অনুকরণ করতে Android ডিবাগ ব্রিজ ( adb ) সেট আপ করুন এবং ব্যবহার করুন৷
  • অ্যাপটি অপ্রত্যাশিতভাবে বন্ধ হয়ে গেলে হারিয়ে যেতে পারে এমন অ্যাপ ডেটা ধরে রাখতে onSaveInstanceState() পদ্ধতি প্রয়োগ করুন। অ্যাপটি আবার শুরু হলে সেই ডেটা পুনরুদ্ধার করতে কোড যোগ করুন।

এই কোডল্যাবে, আপনি আগের কোডল্যাব থেকে DessertClicker অ্যাপে প্রসারিত করুন। আপনি একটি ব্যাকগ্রাউন্ড টাইমার যোগ করুন, তারপর Android লাইফসাইকেল লাইব্রেরি ব্যবহার করতে অ্যাপটিকে রূপান্তর করুন।

পূর্ববর্তী কোডল্যাবে, আপনি শিখেছেন কিভাবে বিভিন্ন লাইফসাইকেল কলব্যাকগুলিকে ওভাররাইড করে এবং সিস্টেম যখন সেই কলব্যাকগুলিকে আহ্বান করে তখন লগিং করে কার্যকলাপ এবং খণ্ডিত জীবনচক্রগুলি পর্যবেক্ষণ করতে হয়৷ এই টাস্কে, আপনি DessertClicker অ্যাপে লাইফসাইকেল টাস্ক পরিচালনার আরও জটিল উদাহরণ অন্বেষণ করেন। আপনি একটি টাইমার ব্যবহার করেন যা প্রতি সেকেন্ডে একটি লগ স্টেটমেন্ট প্রিন্ট করে, যত সেকেন্ড চলছে তার সংখ্যার সাথে।

ধাপ 1: ডেজার্ট টাইমার সেট আপ করুন

  1. শেষ কোডল্যাব থেকে DessertClicker অ্যাপটি খুলুন। (যদি আপনার কাছে অ্যাপটি না থাকে তবে আপনি এখানে DessertClickerLogs ডাউনলোড করতে পারেন।)
  2. প্রজেক্ট ভিউতে, j ava > com.example.android.dessertclicker প্রসারিত করুন এবং DessertTimer.kt খুলুন। লক্ষ্য করুন যে এখনই সমস্ত কোড মন্তব্য করা হয়েছে, তাই এটি অ্যাপের অংশ হিসাবে চালানো হয় না।
  3. সম্পাদক উইন্ডোতে সমস্ত কোড নির্বাচন করুন। কোড > লাইন মন্তব্য সহ মন্তব্য নির্বাচন করুন, অথবা Control+/ ( একটি ম্যাকে Command+/ ) টিপুন। এই কমান্ড ফাইলের সমস্ত কোড uncomments. (আপনি অ্যাপটি পুনর্নির্মাণ না করা পর্যন্ত অ্যান্ড্রয়েড স্টুডিও অমীমাংসিত রেফারেন্স ত্রুটিগুলি দেখাতে পারে।)
  4. লক্ষ্য করুন যে DessertTimer ক্লাসে startTimer() এবং stopTimer() রয়েছে, যা টাইমার শুরু এবং বন্ধ করে। যখন startTimer() চলছে, টাইমারটি প্রতি সেকেন্ডে একটি লগ বার্তা প্রিন্ট করে, সময়টি চলমান সেকেন্ডের মোট গণনা সহ। stopTimer() পদ্ধতি, ঘুরে, টাইমার এবং লগ স্টেটমেন্ট বন্ধ করে দেয়।
  1. MainActivity.kt খুলুন। ক্লাসের শীর্ষে, dessertsSold ভেরিয়েবলের ঠিক নীচে, টাইমারের জন্য একটি ভেরিয়েবল যোগ করুন:
private lateinit var dessertTimer : DessertTimer;
  1. নিচে স্ক্রোল করুন onCreate() এবং একটি নতুন DessertTimer অবজেক্ট তৈরি করুন, setOnClickListener() এ কল করার ঠিক পরে :
dessertTimer = DessertTimer()


এখন আপনার কাছে একটি ডেজার্ট টাইমার অবজেক্ট আছে, আপনার টাইমারটি কোথায় শুরু করা উচিত তা বিবেচনা করুন এবং টাইমারটি যখন অন-স্ক্রীনে থাকে তখনই এটি চালানোর জন্য বন্ধ করুন। আপনি পরবর্তী ধাপে কয়েকটি বিকল্প দেখুন।

ধাপ 2: টাইমার শুরু করুন এবং বন্ধ করুন

কার্যকলাপ দৃশ্যমান হওয়ার ঠিক আগে onStart() পদ্ধতিটিকে কল করা হয়। ক্রিয়াকলাপ দৃশ্যমান হওয়া বন্ধ করার পরে onStop() পদ্ধতিটি কল করা হয়। এই কলব্যাকগুলি কখন টাইমার শুরু এবং বন্ধ করতে হবে তার জন্য ভাল প্রার্থী বলে মনে হচ্ছে।

  1. MainActivity ক্লাসে, onStart() কলব্যাকে টাইমার শুরু করুন:
override fun onStart() {
   super.onStart()
   dessertTimer.startTimer()

   Timber.i("onStart called")
}
  1. onStop() এ টাইমার বন্ধ করুন:
override fun onStop() {
   super.onStop()
   dessertTimer.stopTimer()

   Timber.i("onStop Called")
}
  1. অ্যাপটি কম্পাইল করে রান করুন। অ্যান্ড্রয়েড স্টুডিওতে, লগক্যাট প্যানে ক্লিক করুন। Logcat অনুসন্ধান বাক্সে, dessertclicker লিখুন, যা MainActivity এবং DessertTimer উভয় ক্লাস দ্বারা ফিল্টার করবে। লক্ষ্য করুন যে একবার অ্যাপটি শুরু হলে, টাইমারটিও অবিলম্বে চলতে শুরু করে।
  2. ব্যাক বোতামে ক্লিক করুন এবং লক্ষ্য করুন যে টাইমার আবার বন্ধ হয়ে গেছে। টাইমার বন্ধ হয়ে যায় কারণ কার্যকলাপ এবং টাইমার উভয়ই ধ্বংস হয়ে গেছে।
  3. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। Logcat-এ লক্ষ্য করুন যে টাইমার 0 থেকে পুনরায় চালু হয়।
  4. শেয়ার বোতামে ক্লিক করুন। Logcat এ লক্ষ্য করুন যে টাইমার এখনও চলছে।

  5. হোম বোতামে ক্লিক করুন। Logcat এ লক্ষ্য করুন যে টাইমার চলমান বন্ধ করে দেয়।
  6. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। Logcat এ লক্ষ্য করুন যে টাইমারটি যেখান থেকে ছেড়েছিল সেখান থেকে আবার শুরু হয়।
  7. MainActivity , onStop( onStop() পদ্ধতিতে, stopTimer() এ কলটি মন্তব্য করুন। stopTimer() মন্তব্য করা সেই ক্ষেত্রে দেখায় যেখানে আপনি onStart() এ একটি অপারেশন শুরু করেন, কিন্তু onStop( onStop() এ আবার এটি বন্ধ করতে ভুলে যান।
  8. অ্যাপটি কম্পাইল করুন এবং চালান এবং টাইমার শুরু হওয়ার পরে হোম বোতামে ক্লিক করুন। অ্যাপটি ব্যাকগ্রাউন্ডে থাকলেও, টাইমার চলছে এবং ক্রমাগত সিস্টেম রিসোর্স ব্যবহার করছে। টাইমার চালিয়ে যাওয়া আপনার অ্যাপের জন্য একটি মেমরি লিক, এবং সম্ভবত আপনি যে আচরণ চান তা নয়।

    সাধারণ প্যাটার্ন হল যে আপনি যখন একটি কলব্যাকে কিছু সেট আপ করেন বা শুরু করেন, আপনি সেই জিনিসটিকে সংশ্লিষ্ট কলব্যাকে থামান বা সরিয়ে দেন। এইভাবে, আপনি যেকোন কিছু চালু থাকা এড়াতে পারবেন যখন এটির আর প্রয়োজন নেই।
  1. onStop() যেখানে আপনি টাইমার থামান সেখানে লাইনটি আনকমেন্ট করুন।
  2. onStart() থেকে onCreate() এ startTimer() onCreate() কেটে পেস্ট করুন। এই পরিবর্তনটি সেই ক্ষেত্রে দেখায় যেখানে আপনি উভয়েই onCreate() onCreate() এটিকে আরম্ভ করার জন্য এবং onStart() ব্যবহার করার পরিবর্তে।
  3. অ্যাপটি কম্পাইল করে রান করুন। লক্ষ্য করুন যে টাইমারটি চলতে শুরু করে, যেমনটি আপনি আশা করেন।
  4. অ্যাপ বন্ধ করতে হোম ক্লিক করুন। টাইমারটি চলা বন্ধ হয়ে যায়, যেমনটি আপনি আশা করেন।
  5. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। লক্ষ্য করুন যে এই ক্ষেত্রে টাইমার আবার শুরু হয় না , কারণ onCreate() শুধুমাত্র তখনই কল করা হয় যখন অ্যাপটি শুরু হয় - যখন একটি অ্যাপ ফোরগ্রাউন্ডে ফিরে আসে তখন এটি বলা হয় না।

মনে রাখার মূল পয়েন্ট:

  • আপনি যখন একটি লাইফসাইকেল কলব্যাকে একটি সংস্থান সেট আপ করেন, তখন সংস্থানটি ছিঁড়ে ফেলুন।
  • সংশ্লিষ্ট পদ্ধতিতে সেটআপ এবং টিয়ারডাউন করুন।
  • আপনি যদি onStart() এ কিছু সেট আপ করেন, তাহলে onStop() এ আবার থামান বা ছিঁড়ে ফেলুন।

DessertClicker অ্যাপে, এটা দেখা মোটামুটি সহজ যে আপনি যদি onStart() এ টাইমার শুরু করেন, তাহলে আপনাকে onStop() এ টাইমার থামাতে হবে। শুধুমাত্র একটি টাইমার আছে, তাই টাইমার বন্ধ করা মনে রাখা কঠিন নয়।

একটি আরও জটিল অ্যান্ড্রয়েড অ্যাপে, আপনি onStart() বা onCreate()-এ অনেক কিছু সেট আপ করতে পারেন, তারপর onStop( onStop() বা onCreate() onDestroy() এ সেগুলি ছিঁড়ে ফেলতে পারেন৷ উদাহরণস্বরূপ, আপনার কাছে অ্যানিমেশন, সঙ্গীত, সেন্সর বা টাইমার থাকতে পারে যেগুলি সেট আপ এবং বিচ্ছিন্ন করতে এবং শুরু এবং থামাতে আপনার প্রয়োজন। আপনি যদি একটি ভুলে যান, এটি বাগ এবং মাথাব্যথার দিকে পরিচালিত করে।

লাইফসাইকেল লাইব্রেরি , যা অ্যান্ড্রয়েড জেটপ্যাকের অংশ, এই কাজটিকে সহজ করে। লাইব্রেরিটি বিশেষত সেই ক্ষেত্রে উপযোগী যেখানে আপনাকে অনেকগুলি চলমান অংশগুলিকে ট্র্যাক করতে হবে, যার মধ্যে কয়েকটি বিভিন্ন জীবনচক্র অবস্থায় রয়েছে। লাইব্রেরি যেভাবে লাইফসাইকেল কাজ করে তার চারপাশে ঘুরপাক খায়: সাধারণত অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট একটি উপাদানকে বলে (যেমন DessertTimer ) যখন একটি লাইফসাইকেল কলব্যাক ঘটে তখন কী করতে হবে। কিন্তু আপনি যখন লাইফসাইকেল লাইব্রেরি ব্যবহার করেন, তখন কম্পোনেন্ট নিজেই লাইফসাইকেল পরিবর্তনগুলি দেখে, তারপর সেই পরিবর্তনগুলি ঘটলে যা প্রয়োজন তা করে৷

জীবনচক্র গ্রন্থাগারের তিনটি প্রধান অংশ রয়েছে:

  • লাইফসাইকেল মালিকরা , যা এমন উপাদান যেগুলির (এবং এইভাবে "নিজের") একটি জীবনচক্র রয়েছে৷ Activity এবং Fragment হল জীবনচক্রের মালিক। লাইফসাইকেল মালিকরা LifecycleOwner ইন্টারফেস বাস্তবায়ন করে।
  • Lifecycle ক্লাস, যা একজন লাইফসাইকেলের মালিকের প্রকৃত অবস্থা ধারণ করে এবং লাইফসাইকেল পরিবর্তন ঘটলে ঘটনাগুলিকে ট্রিগার করে।
  • লাইফসাইকেল পর্যবেক্ষক , যারা জীবনচক্রের অবস্থা পর্যবেক্ষণ করে এবং যখন জীবনচক্র পরিবর্তন হয় তখন কার্য সম্পাদন করে। লাইফসাইকেল অবজারভার LifecycleObserver ইন্টারফেস বাস্তবায়ন করে।

এই টাস্কে, আপনি Android লাইফসাইকেল লাইব্রেরি ব্যবহার করতে DessertClicker অ্যাপটিকে রূপান্তর করুন এবং লাইব্রেরি কীভাবে Android কার্যকলাপের সাথে কাজ করে এবং লাইফসাইকেলগুলিকে পরিচালনা করা সহজ করে তা শিখুন।

ধাপ 1: ডেসার্টটাইমারকে লাইফসাইকেল অবজারভারে পরিণত করুন

জীবনচক্র লাইব্রেরির একটি মূল অংশ হল জীবনচক্র পর্যবেক্ষণের ধারণা। পর্যবেক্ষণ ক্লাসগুলিকে সক্রিয় করে (যেমন DessertTimer ) কার্যকলাপ বা খণ্ডিত জীবনচক্র সম্পর্কে জানতে এবং সেই জীবনচক্র অবস্থার পরিবর্তনের প্রতিক্রিয়া হিসাবে নিজেকে শুরু করতে এবং বন্ধ করে দেয়। লাইফসাইকেল পর্যবেক্ষকের সাহায্যে, আপনি কার্যকলাপ এবং টুকরো পদ্ধতিগুলি থেকে বস্তুগুলি শুরু এবং বন্ধ করার দায়িত্ব সরাতে পারেন।

  1. DesertTimer.kt ক্লাস খুলুন।
  2. DessertTimer ক্লাসের ক্লাসের স্বাক্ষর পরিবর্তন করুন এইরকম দেখতে:
class DessertTimer(lifecycle: Lifecycle) : LifecycleObserver {

এই নতুন শ্রেণীর সংজ্ঞা দুটি জিনিস করে:

  • কনস্ট্রাক্টর একটি Lifecycle অবজেক্ট নেয়, যেটি লাইফ সাইকেল যা টাইমার পর্যবেক্ষণ করছে।
  • ক্লাস সংজ্ঞা LifecycleObserver ইন্টারফেস প্রয়োগ করে।
  1. runnable ভেরিয়েবলের নিচে, ক্লাস ডেফিনিশনে একটি init ব্লক যোগ করুন। init ব্লকে, মালিকের (ক্রিয়াকলাপ) থেকে এই শ্রেণির (পর্যবেক্ষক) সাথে লাইফসাইকেল অবজেক্টকে সংযুক্ত করতে addObserver() পদ্ধতি ব্যবহার করুন।
 init {
   lifecycle.addObserver(this)
}
  1. @OnLifecycleEvent annotation সহ startTimer() টীকা করুন এবং ON_START জীবনচক্র ইভেন্ট ব্যবহার করুন। আপনার লাইফসাইকেল পর্যবেক্ষক যে সমস্ত লাইফসাইকেল ইভেন্টগুলি পর্যবেক্ষণ করতে পারে সেগুলি Lifecycle.Event ক্লাসে রয়েছে৷
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun startTimer() {
  1. ON_STOP ইভেন্ট ব্যবহার করে stopTimer() একই জিনিস করুন:
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stopTimer()

ধাপ 2: MainActivity পরিবর্তন করুন

আপনার MainActivity ক্লাস ইতিমধ্যেই উত্তরাধিকারের মাধ্যমে একজন জীবনচক্রের মালিক, কারণ FragmentActivity সুপারক্লাস LifecycleOwner প্রয়োগ করে। অতএব, আপনার কার্যকলাপ জীবনচক্র-সচেতন করার জন্য আপনাকে কিছু করার দরকার নেই। আপনাকে যা করতে হবে তা হল DessertTimer কনস্ট্রাক্টরে কার্যকলাপের লাইফসাইকেল অবজেক্টটি পাস করা।

  1. MainActivity খুলুন। onCreate() পদ্ধতিতে, DessertTimer অন্তর্ভুক্ত করতে this.lifecycle এর সূচনা পরিবর্তন করুন:
dessertTimer = DessertTimer(this.lifecycle)

কার্যকলাপের lifecycle বৈশিষ্ট্য এই কার্যকলাপের মালিকানাধীন Lifecycle বস্তু ধারণ করে।

  1. onCreate() এ startTimer() এর কলটি এবং onStop( stopTimer()startTimer() onCreate() onStop() সরান। আপনাকে DessertTimer আর কার্যকলাপে কী করতে হবে তা বলার দরকার নেই, কারণ DessertTimer এখন নিজের জীবনচক্র পর্যবেক্ষণ করছে এবং যখন জীবনচক্রের অবস্থা পরিবর্তন হয় তখন স্বয়ংক্রিয়ভাবে অবহিত হয়। এই কলব্যাকগুলিতে আপনি যা করেন তা হল একটি বার্তা লগ করুন৷
  2. কম্পাইল করুন এবং অ্যাপ চালান, এবং Logcat খুলুন। লক্ষ্য করুন যে টাইমারটি প্রত্যাশিত হিসাবে চলতে শুরু করেছে।
  3. অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখতে হোম বোতামে ক্লিক করুন। লক্ষ্য করুন যে টাইমারটি প্রত্যাশিত হিসাবে চলা বন্ধ হয়ে গেছে।

আপনার অ্যাপ এবং এর ডেটার কী হবে যদি অ্যান্ড্রয়েড সেই অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় বন্ধ করে দেয়? এই চতুর প্রান্ত কেস বুঝতে গুরুত্বপূর্ণ.

যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে চলে যায়, তখন এটি ধ্বংস হয় না, এটি শুধুমাত্র বন্ধ থাকে এবং ব্যবহারকারীর এটিতে ফিরে আসার জন্য অপেক্ষা করা হয়। কিন্তু অ্যান্ড্রয়েড ওএস-এর প্রধান উদ্বেগের মধ্যে একটি হল অগ্রভাগে থাকা ক্রিয়াকলাপগুলিকে মসৃণভাবে চালানো। উদাহরণস্বরূপ, যদি আপনার ব্যবহারকারী একটি বাস ধরতে সাহায্য করার জন্য একটি GPS অ্যাপ ব্যবহার করে, তাহলে সেই GPS অ্যাপটিকে দ্রুত রেন্ডার করা এবং দিকনির্দেশ দেখানো চালিয়ে যাওয়া গুরুত্বপূর্ণ৷ DessertClicker অ্যাপটি রাখা কম গুরুত্বপূর্ণ, যা ব্যবহারকারী হয়তো কয়েকদিন ধরে দেখেনি, ব্যাকগ্রাউন্ডে মসৃণভাবে চলছে।

অ্যান্ড্রয়েড ব্যাকগ্রাউন্ড অ্যাপগুলিকে নিয়ন্ত্রণ করে যাতে অগ্রভাগের অ্যাপটি সমস্যা ছাড়াই চলতে পারে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড প্রক্রিয়াকরণের পরিমাণ সীমিত করে যা ব্যাকগ্রাউন্ডে চলমান অ্যাপগুলি করতে পারে।

কখনও কখনও Android এমনকি একটি সম্পূর্ণ অ্যাপ প্রক্রিয়া বন্ধ করে দেয়, যার মধ্যে অ্যাপের সাথে সম্পর্কিত প্রতিটি কার্যকলাপ অন্তর্ভুক্ত থাকে। অ্যান্ড্রয়েড এই ধরনের শাটডাউন করে যখন সিস্টেমে চাপ থাকে এবং দৃশ্যত পিছিয়ে যাওয়ার ঝুঁকি থাকে, তাই এই সময়ে কোনও অতিরিক্ত কলব্যাক বা কোড চালানো হয় না। আপনার অ্যাপের প্রক্রিয়াটি ব্যাকগ্রাউন্ডে নীরবে বন্ধ হয়ে গেছে। কিন্তু ব্যবহারকারীর কাছে, অ্যাপটি বন্ধ হয়ে গেছে বলে মনে হচ্ছে না। ব্যবহারকারী যখন Android OS বন্ধ করে দেওয়া অ্যাপে ফিরে যান, তখন Android সেই অ্যাপটি পুনরায় চালু করে।

এই টাস্কে, আপনি একটি অ্যান্ড্রয়েড প্রসেস শাটডাউন অনুকরণ করেন এবং এটি আবার শুরু হলে আপনার অ্যাপের কী হবে তা পরীক্ষা করুন।

ধাপ 1: একটি প্রসেস শাটডাউন অনুকরণ করতে adb ব্যবহার করুন

অ্যান্ড্রয়েড ডিবাগ ব্রিজ ( adb ) একটি কমান্ড-লাইন টুল যা আপনাকে আপনার কম্পিউটারের সাথে সংযুক্ত এমুলেটর এবং ডিভাইসগুলিতে নির্দেশাবলী পাঠাতে দেয়। এই ধাপে, আপনি আপনার অ্যাপের প্রক্রিয়া বন্ধ করতে adb ব্যবহার করেন এবং Android আপনার অ্যাপ বন্ধ করে দিলে কী হয় তা দেখুন।

  1. কম্পাইল এবং আপনার অ্যাপ্লিকেশন চালান. কাপকেক কয়েকবার ক্লিক করুন।
  2. আপনার অ্যাপটিকে পটভূমিতে রাখতে হোম বোতাম টিপুন। আপনার অ্যাপ্লিকেশানটি এখন বন্ধ করা হয়েছে, এবং যদি Android অ্যাপটি ব্যবহার করছে এমন সংস্থানগুলির প্রয়োজন হয় তাহলে অ্যাপটি বন্ধ হয়ে যেতে পারে৷
  3. অ্যান্ড্রয়েড স্টুডিওতে, কমান্ড-লাইন টার্মিনাল খুলতে টার্মিনাল ট্যাবে ক্লিক করুন।
  4. adb টাইপ করুন এবং রিটার্ন টিপুন।

    আপনি যদি প্রচুর আউটপুট দেখতে পান যা Android Debug Bridge version X.XX.X দিয়ে শুরু হয় এবং tags to be used by logcat (see logcat —h ), সবকিছু ঠিক আছে। পরিবর্তে আপনি যদি adb: command not found , তাহলে নিশ্চিত করুন যে adb কমান্ডটি আপনার সম্পাদনের পথে উপলব্ধ রয়েছে। নির্দেশাবলীর জন্য, ইউটিলিটি অধ্যায়ে "আপনার সম্পাদনের পথে adb যোগ করুন" দেখুন।
  5. কমান্ড লাইনে এই মন্তব্যটি অনুলিপি করুন এবং পেস্ট করুন এবং রিটার্ন টিপুন:
adb shell am kill com.example.android.dessertclicker

এই কমান্ডটি যেকোন সংযুক্ত ডিভাইস বা dessertclicker প্যাকেজ নামের সাথে প্রক্রিয়াটি বন্ধ করতে বলে, কিন্তু শুধুমাত্র যদি অ্যাপটি ব্যাকগ্রাউন্ডে থাকে। যেহেতু আপনার অ্যাপটি ব্যাকগ্রাউন্ডে ছিল, তাই ডিভাইস বা এমুলেটর স্ক্রিনে কিছুই দেখায় না যে আপনার প্রক্রিয়া বন্ধ হয়ে গেছে। অ্যান্ড্রয়েড স্টুডিওতে, "অ্যাপ্লিকেশন শেষ হয়েছে" বলে একটি বার্তা দেখতে রান ট্যাবে ক্লিক করুন। onDestroy onDestroy() কলব্যাক কখনই চালানো হয়নি তা দেখতে Logcat ট্যাবে ক্লিক করুন—আপনার কার্যকলাপ সহজভাবে শেষ হয়েছে।

  1. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। আপনার অ্যাপ্লিকেশানটি সাম্প্রতিক সময়ে প্রদর্শিত হবে তা ব্যাকগ্রাউন্ডে রাখা হয়েছে বা সম্পূর্ণভাবে বন্ধ করা হয়েছে। আপনি যখন অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করেন, তখন কার্যকলাপ আবার শুরু হয়। onCreate() সহ স্টার্টআপ লাইফসাইকেল কলব্যাকের পুরো সেটের মধ্য দিয়ে কার্যকলাপটি চলে।
  2. লক্ষ্য করুন যে অ্যাপটি পুনরায় চালু হলে, এটি আপনার "স্কোর" (বিক্রীত ডেজার্টের সংখ্যা এবং মোট ডলার উভয়ই) ডিফল্ট মানগুলিতে (0) পুনরায় সেট করে। যদি অ্যান্ড্রয়েড আপনার অ্যাপটি বন্ধ করে দেয় তবে কেন এটি আপনার রাজ্যকে বাঁচাতে পারেনি?

    যখন OS আপনার জন্য আপনার অ্যাপ রিস্টার্ট করে, তখন Android আপনার অ্যাপটিকে আগের অবস্থায় রিসেট করার যথাসাধ্য চেষ্টা করে। অ্যান্ড্রয়েড আপনার কিছু দৃশ্যের অবস্থা নেয় এবং যখনই আপনি কার্যকলাপ থেকে দূরে যান তখন এটি একটি বান্ডিলে সংরক্ষণ করে৷ স্বয়ংক্রিয়ভাবে সংরক্ষিত ডেটার কিছু উদাহরণ হল EditText-এর টেক্সট (যতক্ষণ তাদের লেআউটে একটি আইডি সেট করা থাকে), এবং আপনার কার্যকলাপের পিছনের স্ট্যাক।

    যাইহোক, কখনও কখনও Android OS আপনার সমস্ত ডেটা সম্পর্কে জানে না। উদাহরণ স্বরূপ, আপনার যদি DessertClicker অ্যাপে revenue মতো একটি কাস্টম ভেরিয়েবল থাকে, তাহলে Android OS এই ডেটা বা আপনার কার্যকলাপের গুরুত্ব সম্পর্কে জানে না। আপনাকে এই ডেটা বান্ডিলে যোগ করতে হবে।

ধাপ 2: বান্ডেল ডেটা সংরক্ষণ করতে onSaveInstanceState() ব্যবহার করুন

onSaveInstanceState() পদ্ধতি হল যে কলব্যাক আপনি যেকোন ডেটা সংরক্ষণ করতে ব্যবহার করেন যা আপনার প্রয়োজন হতে পারে যদি Android OS আপনার অ্যাপ নষ্ট করে দেয়। লাইফসাইকেল কলব্যাক ডায়াগ্রামে, কার্যকলাপ বন্ধ হওয়ার পরে onSaveInstanceState() করা হয়। যখনই আপনার অ্যাপটি ব্যাকগ্রাউন্ডে যায় তখন একে বলা হয়।

নিরাপত্তা ব্যবস্থা হিসেবে onSaveInstanceState() কলের কথা ভাবুন; এটি আপনাকে একটি বান্ডিলে অল্প পরিমাণ তথ্য সংরক্ষণ করার সুযোগ দেয় কারণ আপনার কার্যকলাপ অগ্রভাগ থেকে বেরিয়ে যায়। সিস্টেমটি এখন এই ডেটা সংরক্ষণ করে কারণ এটি আপনার অ্যাপটি বন্ধ না করা পর্যন্ত অপেক্ষা করলে, OS সম্পদের চাপে থাকতে পারে। প্রতিবার ডেটা সংরক্ষণ করা নিশ্চিত করে যে বান্ডেলের আপডেট ডেটা প্রয়োজন হলে পুনরুদ্ধার করার জন্য উপলব্ধ।

  1. MainActivity এ, onSaveInstanceState() কলব্যাক ওভাররাইড করুন এবং একটি Timber লগ স্টেটমেন্ট যোগ করুন।
override fun onSaveInstanceState(outState: Bundle) {
   super.onSaveInstanceState(outState)

   Timber.i("onSaveInstanceState Called")
}
  1. অ্যাপটি কম্পাইল করুন এবং চালান এবং এটিকে ব্যাকগ্রাউন্ডে রাখতে হোম বোতামে ক্লিক করুন। লক্ষ্য করুন যে onSaveInstanceState() onPause() এবং onStop() () এর ঠিক পরে ঘটে :
  2. ফাইলের শীর্ষে, ক্লাস সংজ্ঞার ঠিক আগে, এই ধ্রুবক যোগ করুন:
const val KEY_REVENUE = "revenue_key"
const val KEY_DESSERT_SOLD = "dessert_sold_key"
const val KEY_TIMER_SECONDS = "timer_seconds_key"

আপনি ইনস্ট্যান্স স্টেট বান্ডেল থেকে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করার জন্য এই কীগুলি ব্যবহার করবেন।

  1. নিচে স্ক্রোল করুন onSaveInstanceState() , এবং outState প্যারামিটারটি লক্ষ্য করুন, যা Bundle টাইপের।

    একটি বান্ডিল হল কী-মানের জোড়ার একটি সংগ্রহ, যেখানে কীগুলি সর্বদা স্ট্রিং থাকে। আপনি বান্ডেলে আদিম মান, যেমন int এবং boolean মান রাখতে পারেন।
    যেহেতু সিস্টেমটি এই বান্ডেলটিকে RAM এ রাখে, তাই বান্ডেলের ডেটা ছোট রাখা একটি সর্বোত্তম অভ্যাস। এই বান্ডেলের আকারও সীমিত, যদিও আকার ডিভাইস থেকে ডিভাইসে পরিবর্তিত হয়। সাধারণত আপনার 100k এর চেয়ে কম সঞ্চয় করা উচিত, অন্যথায় আপনি TransactionTooLargeException ত্রুটির সাথে আপনার অ্যাপ ক্র্যাশ হওয়ার ঝুঁকিতে থাকবেন।
  2. onSaveInstanceState() এ, putInt() পদ্ধতির সাথে বান্ডেলে revenue মান (একটি পূর্ণসংখ্যা) রাখুন:
outState.putInt(KEY_REVENUE, revenue)

putInt() পদ্ধতি (এবং Bundle ক্লাস থেকে অনুরূপ পদ্ধতি যেমন putFloat() এবং putString() দুটি আর্গুমেন্ট নেয়: কী-এর জন্য একটি স্ট্রিং ( KEY_REVENUE ধ্রুবক) এবং সংরক্ষণ করার প্রকৃত মান।

  1. বিক্রি হওয়া ডেজার্টের সংখ্যা এবং টাইমারের অবস্থার সাথে একই প্রক্রিয়াটি পুনরাবৃত্তি করুন:
outState.putInt(KEY_DESSERT_SOLD, dessertsSold)
outState.putInt(KEY_TIMER_SECONDS, dessertTimer.secondsCount)

ধাপ 3: বান্ডেল ডেটা পুনরুদ্ধার করতে onCreate() ব্যবহার করুন

  1. onCreate() পর্যন্ত স্ক্রোল করুন, এবং পদ্ধতি স্বাক্ষর পরীক্ষা করুন:
override fun onCreate(savedInstanceState: Bundle) {

লক্ষ্য করুন যে প্রতিবার কল করা হলে onCreate() একটি Bundle পায়। একটি প্রক্রিয়া শাট-ডাউনের কারণে যখন আপনার কার্যকলাপ পুনরায় আরম্ভ করা হয়, তখন আপনি যে বান্ডিলটি সংরক্ষণ করেছেন তা onCreate() এ পাস করা হয়। যদি আপনার কার্যকলাপ নতুনভাবে শুরু হয়, তাহলে onCreate() -এ এই বান্ডিলটি null । তাই যদি বান্ডিলটি null না হয়, আপনি জানেন যে আপনি পূর্বের পরিচিত বিন্দু থেকে কার্যকলাপটিকে "পুনরায় তৈরি" করছেন৷

  1. DessertTimer সেটআপের পরে, onCreate onCreate() এ এই কোডটি যুক্ত করুন:
if (savedInstanceState != null) {
   revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
}

null পরীক্ষাটি নির্ধারণ করে যে বান্ডেলে ডেটা আছে কিনা বা বান্ডেলটি null কিনা, যা আপনাকে বলে যে অ্যাপটি নতুনভাবে শুরু হয়েছে বা শাটডাউনের পরে পুনরায় তৈরি করা হয়েছে কিনা। এই পরীক্ষাটি বান্ডেল থেকে ডেটা পুনরুদ্ধারের জন্য একটি সাধারণ প্যাটার্ন।

লক্ষ্য করুন যে আপনি এখানে ( KEY_REVENUE ) যে কীটি ব্যবহার করেছেন সেটি একই কী আপনি putInt() জন্য ব্যবহার করেছেন। আপনি প্রতিবার একই কী ব্যবহার করেন তা নিশ্চিত করতে, এই কীগুলিকে ধ্রুবক হিসাবে সংজ্ঞায়িত করা একটি সর্বোত্তম অনুশীলন। আপনি বান্ডেল থেকে ডেটা বের করতে getInt() ব্যবহার করেন, ঠিক যেমন আপনি বান্ডেলে ডেটা রাখার জন্য putInt() ব্যবহার করেন। getInt() পদ্ধতি দুটি আর্গুমেন্ট নেয়:

  • একটি স্ট্রিং যা কী হিসাবে কাজ করে, যেমন রাজস্ব মূল্যের জন্য "key_revenue"
  • বান্ডেলে সেই কীটির জন্য কোনো মান না থাকলে একটি ডিফল্ট মান।

বান্ডেল থেকে আপনি যে পূর্ণসংখ্যা পাবেন তা revenue ভেরিয়েবলে বরাদ্দ করা হয় এবং UI সেই মানটি ব্যবহার করবে।

  1. বিক্রি হওয়া ডেজার্টের সংখ্যা এবং টাইমারের মান পুনরুদ্ধার করতে getInt() পদ্ধতি যোগ করুন:
if (savedInstanceState != null) {
   revenue = savedInstanceState.getInt(KEY_REVENUE, 0)dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
   dessertTimer.secondsCount =
       savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
}
  1. অ্যাপটি কম্পাইল করে রান করুন। কাপকেকটি অন্তত পাঁচবার টিপুন যতক্ষণ না এটি একটি ডোনাটে স্যুইচ করে। অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখতে হোমে ক্লিক করুন।
  2. অ্যান্ড্রয়েড স্টুডিও টার্মিনাল ট্যাবে, অ্যাপের প্রক্রিয়া বন্ধ করতে adb চালান।
adb shell am kill com.example.android.dessertclicker
  1. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। লক্ষ্য করুন যে এইবার অ্যাপটি সঠিক আয়ের সাথে ফেরত দেয় এবং বান্ডেল থেকে ডেজার্ট বিক্রি করা মান। কিন্তু এটাও লক্ষ্য করুন যে ডেজার্টটি কাপকেকে ফিরে এসেছে। শাটডাউন থেকে অ্যাপটি ঠিক যেভাবে রেখে দেওয়া হয়েছিল তা নিশ্চিত করার জন্য আরও একটি জিনিস বাকি আছে।
  2. MainActivityshowCurrentDessert() পদ্ধতি পরীক্ষা করুন। লক্ষ্য করুন যে এই পদ্ধতিটি নির্ধারণ করে যে কোন ডেজার্ট ইমেজটি ক্রিয়াকলাপে প্রদর্শিত হবে তা বিক্রি হওয়া ডেজার্টের বর্তমান সংখ্যা এবং সমস্ত ডেজার্ট ভেরিয়েবলে থাকা allDesserts তালিকার উপর ভিত্তি করে।
for (dessert in allDesserts) {
   if (dessertsSold >= dessert.startProductionAmount) {
       newDessert = dessert
   }
    else break
}

এই পদ্ধতিটি সঠিক চিত্র চয়ন করতে বিক্রি হওয়া ডেজার্টের সংখ্যার উপর নির্ভর করে। অতএব, onSaveInstanceState() এ বান্ডিলে চিত্রটির একটি রেফারেন্স সংরক্ষণ করার জন্য আপনাকে কিছু করতে হবে না। সেই বান্ডিলে, আপনি ইতিমধ্যেই বিক্রি হওয়া ডেজার্টের সংখ্যা সংরক্ষণ করছেন।

  1. onCreate() তে, যে ব্লকটি বান্ডেল থেকে রাজ্যটিকে পুনরুদ্ধার করে, showCurrentDessert() কল করুন :
 if (savedInstanceState != null) {
   revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
   dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
   dessertTimer.secondsCount = 
      savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
   showCurrentDessert()                   
}
  1. অ্যাপটি কম্পাইল করে রান করুন এবং ব্যাকগ্রাউন্ডে রাখুন। প্রক্রিয়া বন্ধ করতে adb ব্যবহার করুন. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। এখন নোট করুন যে ডেজার্টের জন্য বলা মান, মোট আয় এবং ডেজার্টের ছবি সঠিকভাবে পুনরুদ্ধার করা হয়েছে।

অ্যাক্টিভিটি এবং ফ্র্যাগমেন্ট লাইফসাইকেল পরিচালনার ক্ষেত্রে একটি শেষ বিশেষ কেস রয়েছে যা বোঝা গুরুত্বপূর্ণ: কনফিগারেশন পরিবর্তনগুলি কীভাবে আপনার ক্রিয়াকলাপ এবং টুকরোগুলির জীবনচক্রকে প্রভাবিত করে।

একটি কনফিগারেশন পরিবর্তন ঘটে যখন ডিভাইসের অবস্থা এত আমূল পরিবর্তন হয় যে পরিবর্তনটি সমাধান করার জন্য সিস্টেমের জন্য সবচেয়ে সহজ উপায় হল সম্পূর্ণরূপে বন্ধ করা এবং কার্যকলাপটি পুনর্নির্মাণ করা। উদাহরণস্বরূপ, যদি ব্যবহারকারী ডিভাইসের ভাষা পরিবর্তন করে, তাহলে বিভিন্ন পাঠ্যের দিকনির্দেশ মিটমাট করার জন্য পুরো বিন্যাস পরিবর্তন করতে হতে পারে। ব্যবহারকারী যদি ডিভাইসটিকে একটি ডকে প্লাগ করে বা একটি ফিজিক্যাল কীবোর্ড যোগ করে, তাহলে অ্যাপ লেআউটের জন্য আলাদা ডিসপ্লে সাইজ বা লেআউটের সুবিধা নিতে হতে পারে। এবং যদি ডিভাইসের অভিযোজন পরিবর্তিত হয়-যদি ডিভাইসটি প্রতিকৃতি থেকে ল্যান্ডস্কেপে ঘোরানো হয় বা অন্যভাবে ফিরে যায়-নতুন অভিযোজনে মানানসই করার জন্য বিন্যাস পরিবর্তন করতে হতে পারে।

ধাপ 1: ডিভাইসের ঘূর্ণন এবং লাইফসাইকেল কলব্যাকগুলি অন্বেষণ করুন৷

  1. কম্পাইল করুন এবং আপনার অ্যাপ চালান, এবং Logcat খুলুন।
  2. ল্যান্ডস্কেপ মোডে ডিভাইস বা এমুলেটর ঘোরান। আপনি ঘূর্ণন বোতামের সাহায্যে এমুলেটরটিকে বাম বা ডানে ঘোরাতে পারেন, অথবা Control এবং তীর কী ( ম্যাকের Command এবং তীর কী) দিয়ে।
  3. Logcat এ আউটপুট পরীক্ষা করুন। MainActivity এ আউটপুট ফিল্টার করুন।
    লক্ষ্য করুন যে যখন ডিভাইস বা এমুলেটরটি স্ক্রীনটি ঘোরায়, তখন সিস্টেমটি কার্যকলাপ বন্ধ করতে সমস্ত লাইফসাইকেল কলব্যাক কল করে। তারপরে, কার্যকলাপটি পুনরায় তৈরি হওয়ার সাথে সাথে, সিস্টেমটি কার্যকলাপ শুরু করার জন্য সমস্ত লাইফসাইকেল কলব্যাককে কল করে।
  4. MainActivity এ, সম্পূর্ণ onSaveInstanceState() পদ্ধতিতে মন্তব্য করুন।
  5. কম্পাইল করুন এবং আপনার অ্যাপ আবার চালান। কাপকেকটিতে কয়েকবার ক্লিক করুন এবং ডিভাইস বা এমুলেটরটি ঘোরান। এই সময়, যখন ডিভাইসটি ঘোরানো হয় এবং কার্যকলাপটি বন্ধ করা হয় এবং পুনরায় তৈরি করা হয়, তখন কার্যকলাপটি ডিফল্ট মানগুলির সাথে শুরু হয়।

    যখন একটি কনফিগারেশন পরিবর্তন ঘটে, তখন Android সেই একই ইনস্ট্যান্স স্টেট বান্ডেল ব্যবহার করে যা আপনি আগের টাস্কে অ্যাপ্লিকেশানের অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করতে শিখেছিলেন। প্রসেস শাটডাউনের মতো, আপনার অ্যাপের ডেটা বান্ডেলে রাখতে onSaveInstanceState() ব্যবহার করুন। তারপরে onCreate() এ ডেটা পুনরুদ্ধার করুন, ডিভাইসটি ঘোরানো হলে কার্যকলাপের অবস্থার ডেটা হারানো এড়াতে।
  6. MainActivity এ, onSaveInstanceState() ক্লিক করুন এবং অ্যাপ বা ডিভাইসটি ঘোরান। লক্ষ্য করুন এই সময় ডেজার্ট ডেটা অ্যাক্টিভিটি রোটেশন জুড়ে ধরে রাখা হয়।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: ডেসার্টক্লিকারফাইনাল

জীবনচক্র টিপস

  • আপনি যদি লাইফসাইকেল কলব্যাকে কিছু সেট আপ করেন বা শুরু করেন, তাহলে সংশ্লিষ্ট কলব্যাকে সেই জিনিসটি বন্ধ করুন বা সরিয়ে দিন। জিনিসটি বন্ধ করে, আপনি নিশ্চিত হন যে এটি আর প্রয়োজন না থাকলে এটি চলতে না থাকে। উদাহরণস্বরূপ, আপনি যদি onStart() এ একটি টাইমার সেট আপ করেন, তাহলে আপনাকে onStop( onStop() এ টাইমারটি বিরতি বা থামাতে হবে।
  • onCreate() ব্যবহার করুন শুধুমাত্র আপনার অ্যাপের অংশগুলিকে আরম্ভ করতে যা একবার চলে, যখন অ্যাপটি প্রথম শুরু হয়। আপনার অ্যাপের অংশগুলি শুরু করতে onStart() ব্যবহার করুন যা অ্যাপ শুরু হওয়ার সময় এবং প্রতিবার অ্যাপটি অগ্রভাগে ফিরে আসার সময় উভয়ই চলে।

লাইফসাইকেল লাইব্রেরি

  • অ্যানড্রয়েড লাইফসাইকেল লাইব্রেরি ব্যবহার করুন লাইফসাইকেল নিয়ন্ত্রণ অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট থেকে প্রকৃত উপাদানে স্থানান্তর করতে যা জীবনচক্র-সচেতন হতে হবে।
  • লাইফসাইকেলের মালিকরা হল এমন উপাদান যেগুলির (এবং এইভাবে "নিজস্ব") জীবনচক্র রয়েছে, যার মধ্যে রয়েছে Activity এবং Fragment । লাইফসাইকেল মালিকরা LifecycleOwner ইন্টারফেস বাস্তবায়ন করে।
  • লাইফসাইকেল পর্যবেক্ষকরা বর্তমান জীবনচক্রের অবস্থার দিকে মনোযোগ দেয় এবং জীবনচক্র পরিবর্তন হলে কাজগুলি সম্পাদন করে। লাইফসাইকেল অবজারভার LifecycleObserver ইন্টারফেস বাস্তবায়ন করে।
  • Lifecycle অবজেক্টে প্রকৃত জীবনচক্রের অবস্থা থাকে এবং জীবনচক্র পরিবর্তন হলে এগুলি ইভেন্টগুলিকে ট্রিগার করে।

একটি জীবনচক্র-সচেতন শ্রেণী তৈরি করতে:

  • জীবনচক্র-সচেতন হওয়া প্রয়োজন এমন ক্লাসে LifecycleObserver ইন্টারফেস প্রয়োগ করুন।
  • কার্যকলাপ বা খণ্ড থেকে জীবনচক্র বস্তুর সাথে একটি জীবনচক্র পর্যবেক্ষক ক্লাস শুরু করুন।
  • লাইফসাইকেল পর্যবেক্ষক শ্রেণীতে, জীবনচক্র-সচেতন পদ্ধতিগুলিকে লাইফসাইকেল স্টেট পরিবর্তনের সাথে টীকা করুন যা তারা আগ্রহী।

    উদাহরণস্বরূপ, @OnLifecycleEvent(Lifecycle.Event.ON_START) টীকা নির্দেশ করে যে পদ্ধতিটি onStart লাইফসাইকেল ইভেন্টটি দেখছে।

প্রক্রিয়া শাটডাউন এবং সংরক্ষণ কার্যকলাপ অবস্থা

  • অ্যান্ড্রয়েড ব্যাকগ্রাউন্ডে চলমান অ্যাপগুলিকে নিয়ন্ত্রণ করে যাতে অগ্রভাগের অ্যাপটি সমস্যা ছাড়াই চলতে পারে। এই প্রবিধানে ব্যাকগ্রাউন্ডে থাকা অ্যাপগুলি যে পরিমাণ প্রক্রিয়াকরণ করতে পারে তা সীমিত করা এবং কখনও কখনও আপনার সম্পূর্ণ অ্যাপ প্রক্রিয়া বন্ধ করে দেওয়া অন্তর্ভুক্ত।
  • সিস্টেম ব্যাকগ্রাউন্ডে একটি অ্যাপ বন্ধ করেছে কিনা তা ব্যবহারকারী বলতে পারবেন না। অ্যাপটি এখনও সাম্প্রতিক স্ক্রিনে প্রদর্শিত হয় এবং ব্যবহারকারী যে অবস্থায় এটিকে রেখেছিলেন সেই অবস্থায় পুনরায় চালু করা উচিত।
  • অ্যান্ড্রয়েড ডিবাগ ব্রিজ ( adb ) একটি কমান্ড-লাইন টুল যা আপনাকে আপনার কম্পিউটারের সাথে সংযুক্ত এমুলেটর এবং ডিভাইসগুলিতে নির্দেশাবলী পাঠাতে দেয়। আপনি আপনার অ্যাপে একটি প্রক্রিয়া শাটডাউন অনুকরণ করতে adb ব্যবহার করতে পারেন।
  • যখন অ্যান্ড্রয়েড আপনার অ্যাপ প্রক্রিয়া বন্ধ করে দেয়, তখন onDestroy() লাইফসাইকেল পদ্ধতি বলা হয় না। অ্যাপ শুধু থেমে যায়।

কার্যকলাপ এবং খণ্ড অবস্থা সংরক্ষণ

  • যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে যায়, onStop() করার ঠিক পরে, অ্যাপ ডেটা একটি বান্ডেলে সংরক্ষণ করা হয়। কিছু অ্যাপ ডেটা, যেমন একটি EditText এর বিষয়বস্তু আপনার জন্য স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়।
  • বান্ডেল হল Bundle এর একটি উদাহরণ, যা কী এবং মানগুলির একটি সংগ্রহ। কী সবসময় স্ট্রিং হয়.
  • অ্যাপটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে গেলেও আপনি যে বান্ডেলে রাখতে চান তাতে অন্যান্য ডেটা সংরক্ষণ করতে onSaveInstanceState() কলব্যাক ব্যবহার করুন। বান্ডেলে ডেটা রাখতে, put দিয়ে শুরু হওয়া বান্ডেল পদ্ধতিগুলি ব্যবহার করুন, যেমন putInt()
  • আপনি onRestoreInstanceState() পদ্ধতিতে বান্ডেল থেকে ডাটা ফেরত পেতে পারেন, অথবা আরও বেশি করে onCreate() এ। onCreate() পদ্ধতিতে একটি savedInstanceState প্যারামিটার রয়েছে যা বান্ডিলটি ধারণ করে।
  • যদি savedInstanceState ভেরিয়েবল null ধারণ করে, কার্যকলাপটি স্টেট বান্ডেল ছাড়াই শুরু হয়েছিল এবং পুনরুদ্ধার করার জন্য কোনও স্টেট ডেটা নেই।
  • একটি কী দিয়ে বান্ডেল থেকে ডেটা পুনরুদ্ধার করতে, get দিয়ে শুরু হওয়া Bundle পদ্ধতিগুলি ব্যবহার করুন, যেমন getInt()

কনফিগারেশন পরিবর্তন

  • একটি কনফিগারেশন পরিবর্তন ঘটে যখন ডিভাইসের অবস্থা এত আমূল পরিবর্তন হয় যে পরিবর্তনটি সমাধান করার জন্য সিস্টেমের জন্য সবচেয়ে সহজ উপায় হল কার্যকলাপটি বন্ধ করা এবং পুনর্নির্মাণ করা।
  • কনফিগারেশন পরিবর্তনের সবচেয়ে সাধারণ উদাহরণ হল যখন ব্যবহারকারী ডিভাইসটিকে পোর্ট্রেট থেকে ল্যান্ডস্কেপ মোডে বা ল্যান্ডস্কেপ থেকে পোর্ট্রেট মোডে ঘোরান। একটি কনফিগারেশন পরিবর্তনও ঘটতে পারে যখন ডিভাইসের ভাষা পরিবর্তন হয় বা একটি হার্ডওয়্যার কীবোর্ড প্লাগ ইন করা হয়।
  • যখন একটি কনফিগারেশন পরিবর্তন ঘটে, তখন Android সমস্ত অ্যাক্টিভিটি লাইফসাইকেলের শাটডাউন কলব্যাক আহ্বান করে। তারপর অ্যান্ড্রয়েড স্ক্র্যাচ থেকে কার্যকলাপ পুনরায় আরম্ভ করে, সমস্ত জীবনচক্র স্টার্টআপ কলব্যাক চালায়।
  • কনফিগারেশন পরিবর্তনের কারণে অ্যান্ড্রয়েড যখন কোনো অ্যাপ বন্ধ করে দেয়, তখন এটি onCreate() এ উপলব্ধ স্টেট বান্ডেলের সাহায্যে কার্যকলাপটি পুনরায় চালু করে।
  • প্রসেস শাটডাউনের মতো, onSaveInstanceState() এ বান্ডেলে আপনার অ্যাপের অবস্থা সংরক্ষণ করুন।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

অন্যান্য:

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।

একটি অ্যাপ পরিবর্তন করুন

পাঠ 1 থেকে DiceRoller অ্যাপটি খুলুন। (যদি আপনার কাছে এটি না থাকে তবে আপনি এখানে অ্যাপটি ডাউনলোড করতে পারেন।) অ্যাপটি কম্পাইল করুন এবং চালান এবং মনে রাখবেন যে আপনি যদি ডিভাইসটি ঘোরান তবে ডাইসের বর্তমান মান হারিয়ে যাবে। বান্ডেলে সেই মানটি ধরে রাখতে onSaveInstanceState() onCreate() সেই মানটি পুনরুদ্ধার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

আপনার অ্যাপে একটি পদার্থবিদ্যা সিমুলেশন রয়েছে যা প্রদর্শনের জন্য ভারী গণনার প্রয়োজন। তারপর ব্যবহারকারী একটি ফোন কল পায়। যা দেখছি সত্য?

  • ফোন কল চলাকালীন, আপনাকে পদার্থবিজ্ঞানের সিমুলেশনে বস্তুর অবস্থান গণনা চালিয়ে যেতে হবে।
  • ফোন কলের সময়, আপনার পদার্থবিদ্যা সিমুলেশনে বস্তুর অবস্থান গণনা করা বন্ধ করা উচিত।

প্রশ্ন 2

অ্যাপটি স্ক্রিনে না থাকলে সিমুলেশনটি পজ করার জন্য কোন জীবনচক্র পদ্ধতিটি আপনার ওভাররাইড করা উচিত?

  • onDestroy()
  • onStop()
  • onPause()
  • onSaveInstanceState()

প্রশ্ন 3

অ্যান্ড্রয়েড লাইফসাইকেল লাইব্রেরির মাধ্যমে ক্লাস লাইফসাইকেল-সচেতন করতে, ক্লাসের কোন ইন্টারফেসটি প্রয়োগ করা উচিত?

  • Lifecycle
  • LifecycleOwner
  • Lifecycle.Event
  • LifecycleObserver

প্রশ্ন 4

কোন পরিস্থিতিতে আপনার কার্যকলাপে onCreate() পদ্ধতিটি ডেটা সহ একটি Bundle পায় (অর্থাৎ, Bundle null নয়)? একাধিক উত্তর প্রযোজ্য হতে পারে।

  • ডিভাইসটি ঘোরানোর পরে কার্যকলাপটি পুনরায় চালু হয়।
  • কার্যক্রম গোড়া থেকে শুরু হয়।
  • ব্যাকগ্রাউন্ড থেকে ফিরে আসার পর কার্যক্রম আবার শুরু হয়।
  • ডিভাইসটি রিবুট করা হয়েছে।

পরবর্তী পাঠ শুরু করুন: 5.1: ViewModel এবং ViewModelFactory

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।