অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 04.1: জীবনচক্র এবং লগিং

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

ভূমিকা

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

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

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

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

  • একটি কার্যকলাপ কি এবং কিভাবে আপনার অ্যাপে একটি তৈরি করতে হয়।
  • কার্যকলাপের onCreate() পদ্ধতি কি করে এবং সেই পদ্ধতিতে সঞ্চালিত ক্রিয়াকলাপগুলির ধরন।
  • কিভাবে আপনার কার্যকলাপের জন্য XML লেআউট তৈরি করবেন এবং রানটাইমে একটি লেআউট কিভাবে আপডেট করবেন।

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

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

আপনি কি করবেন

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

এই কোডল্যাবে, আপনি DessertClicker নামে একটি স্টার্টার অ্যাপের সাথে কাজ করেন। এই অ্যাপটিতে, ব্যবহারকারী যতবার স্ক্রিনে একটি ডেজার্ট ট্যাপ করে, অ্যাপটি ব্যবহারকারীর জন্য ডেজার্টটি "ক্রয় করে"। অ্যাপটি ক্রয় করা ডেজার্টের সংখ্যা এবং ব্যবহারকারীর খরচ করা মোট পরিমাণের জন্য লেআউটে মান আপডেট করে।

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

প্রতিটি ক্রিয়াকলাপ এবং প্রতিটি খণ্ডের রয়েছে যা একটি জীবনচক্র হিসাবে পরিচিত। এটি প্রাণীর জীবনচক্রের প্রতি ইঙ্গিত, যেমন এই প্রজাপতির জীবনচক্র—প্রজাপতির বিভিন্ন অবস্থা জন্ম থেকে পূর্ণাঙ্গ পরিণত বয়স থেকে মৃত্যু পর্যন্ত এর বৃদ্ধি দেখায়।

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

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

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

এই কলব্যাকগুলি কখন আহ্বান করা হয় এবং প্রতিটি কলব্যাক পদ্ধতিতে কী করতে হবে তা জানা গুরুত্বপূর্ণ৷ কিন্তু এই দুটি চিত্রই জটিল এবং বিভ্রান্তিকর হতে পারে। এই কোডল্যাবে, প্রতিটি স্টেট এবং কলব্যাকের অর্থ কী তা পড়ার পরিবর্তে, আপনি কিছু গোয়েন্দা কাজ করতে যাচ্ছেন এবং কী ঘটছে সে সম্পর্কে আপনার বোঝাপড়া তৈরি করতে যাচ্ছেন।

ধাপ 1: onCreate() পদ্ধতি পরীক্ষা করুন এবং লগিং যোগ করুন

অ্যান্ড্রয়েড লাইফসাইকেল নিয়ে কী ঘটছে তা বের করতে, বিভিন্ন জীবনচক্র পদ্ধতি কখন বলা হয় তা জানা সহায়ক৷ এটি আপনাকে DessertClicker-এ কোথায় ভুল হচ্ছে তা খুঁজে বের করতে সাহায্য করবে।

এটি করার একটি সহজ উপায় হল Android লগিং API ব্যবহার করা। লগিং আপনাকে অ্যাপটি চলাকালীন একটি কনসোলে ছোট বার্তা লিখতে সক্ষম করে এবং বিভিন্ন কলব্যাক ট্রিগার হলে আপনি এটিকে আপনাকে দেখানোর জন্য ব্যবহার করতে পারেন।

  1. DessertClicker স্টার্টার অ্যাপটি ডাউনলোড করুন এবং এটি অ্যান্ড্রয়েড স্টুডিওতে খুলুন।
  2. অ্যাপটি কম্পাইল করুন এবং রান করুন এবং ডেজার্টের ছবিতে বেশ কয়েকবার আলতো চাপুন। নোট করুন কিভাবে ডেজার্ট বিক্রির মূল্য এবং মোট ডলারের পরিমাণ পরিবর্তিত হয়।
  3. MainActivity.kt খুলুন এবং এই কার্যকলাপের জন্য onCreate() পদ্ধতি পরীক্ষা করুন
override fun onCreate(savedInstanceState: Bundle?) {
...
}

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

onCreate() লাইফসাইকেল পদ্ধতিটি একবার বলা হয়, কার্যকলাপ শুরু হওয়ার ঠিক পরে (যখন মেমরিতে নতুন Activity অবজেক্ট তৈরি করা হয়)। onCreate() এক্সিকিউট করার পর, অ্যাক্টিভিটি তৈরি বলে মনে করা হয়।

  1. onCreate() super.onCreate() কল করার ঠিক পরে, নিম্নলিখিত লাইনটি যোগ করুন। প্রয়োজনে Log ক্লাস আমদানি করুন। (একটি ম্যাকে Alt+Enter বা Option+Enter এবং আমদানি নির্বাচন করুন।)
Log.i("MainActivity", "onCreate Called")

Log ক্লাস লগক্যাটে বার্তা লেখে। এই কমান্ডের তিনটি অংশ রয়েছে:

  • লগ বার্তার তীব্রতা , অর্থাৎ বার্তাটি কতটা গুরুত্বপূর্ণ। এই ক্ষেত্রে, Log.i() পদ্ধতি একটি তথ্যমূলক বার্তা লেখে। Log ক্লাসের অন্যান্য পদ্ধতির মধ্যে রয়েছে ত্রুটির জন্য Log.e() Log.w()
  • লগ ট্যাগ , এই ক্ষেত্রে "MainActivity" । ট্যাগ হল একটি স্ট্রিং যা আপনাকে Logcat-এ আপনার লগ বার্তাগুলিকে আরও সহজে খুঁজে পেতে দেয়৷ ট্যাগটি সাধারণত ক্লাসের নাম।
  • প্রকৃত লগ বার্তা , একটি ছোট স্ট্রিং, যা এই ক্ষেত্রে "onCreate called"
  1. DessertClicker অ্যাপ কম্পাইল করুন এবং রান করুন। আপনি যখন ডেজার্টে ট্যাপ করেন তখন আপনি অ্যাপে কোনো আচরণের পার্থক্য দেখতে পান না। অ্যান্ড্রয়েড স্টুডিওতে, স্ক্রিনের নীচে, লগক্যাট ট্যাবে ক্লিক করুন।



    লগক্যাট হল মেসেজ লগ করার কনসোল। আপনার অ্যাপ্লিকেশান সম্পর্কে Android থেকে বার্তাগুলি এখানে উপস্থিত হয়, যার মধ্যে আপনি যে বার্তাগুলিকে Log.i() পদ্ধতি বা অন্যান্য Log ক্লাস পদ্ধতিতে স্পষ্টভাবে পাঠান সেগুলি সহ৷
  2. Logcat প্যানে, সার্চ ফিল্ডে I/MainActivity টাইপ করুন।


    Logcat অনেক বার্তা ধারণ করতে পারে, যার অধিকাংশ আপনার জন্য দরকারী নয়। আপনি অনেক উপায়ে Logcat এন্ট্রি ফিল্টার করতে পারেন, কিন্তু অনুসন্ধান করা সবচেয়ে সহজ। যেহেতু আপনি আপনার কোডে লগ ট্যাগ হিসাবে MainActivity ব্যবহার করেছেন, আপনি লগ ফিল্টার করতে সেই ট্যাগটি ব্যবহার করতে পারেন। শুরুতে I/ যোগ করার অর্থ হল এটি একটি তথ্যমূলক বার্তা, যা Log.i() দ্বারা তৈরি করা হয়েছে।

    আপনার লগ মেসেজে তারিখ এবং সময়, প্যাকেজের নাম ( com.example.android.dessertclicker ), আপনার লগ ট্যাগ (শুরুতে I/ সহ), এবং প্রকৃত বার্তা অন্তর্ভুক্ত রয়েছে। এই বার্তাটি লগে উপস্থিত হওয়ার কারণে, আপনি জানেন যে onCreate() কার্যকর করা হয়েছে।

ধাপ 2: onStart() পদ্ধতি প্রয়োগ করুন

onStart() জীবনচক্র পদ্ধতিটিকে onCreate() এর ঠিক পরে বলা হয়। onStart() রান করার পরে, আপনার কার্যকলাপ স্ক্রিনে দৃশ্যমান হয়। onCreate() এর বিপরীতে, যা আপনার কার্যকলাপ শুরু করার জন্য শুধুমাত্র একবার কল করা হয়, onStart() কে আপনার কার্যকলাপের জীবনচক্রে অনেকবার কল করা যেতে পারে।

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

  1. অ্যান্ড্রয়েড স্টুডিওতে, MainActivity.kt খোলার সাথে, কোড > ওভাররাইড পদ্ধতি নির্বাচন করুন বা Control+o টিপুন। আপনি এই ক্লাসে ওভাররাইড করতে পারেন এমন সমস্ত পদ্ধতির বিশাল তালিকা সহ একটি ডায়ালগ উপস্থিত হয়।
  2. সঠিক পদ্ধতি অনুসন্ধান করতে onStart প্রবেশ করা শুরু করুন। পরবর্তী মিলে যাওয়া আইটেমে স্ক্রোল করতে, নিচের তীরটি ব্যবহার করুন। তালিকা থেকে onStart() চয়ন করুন এবং বয়লারপ্লেট ওভাররাইড কোড সন্নিবেশ করতে ওকে ক্লিক করুন। কোড এই মত দেখায়:
override fun onStart() {
   super.onStart()
}
  1. onStart() পদ্ধতির ভিতরে, একটি লগ বার্তা যোগ করুন:
override fun onStart() {
   super.onStart()

   Log.i("MainActivity", "onStart Called")
}
  1. DessertClicker অ্যাপ কম্পাইল করুন এবং চালান এবং Logcat প্যান খুলুন। লগ ফিল্টার করতে সার্চ ফিল্ডে I/MainActivity টাইপ করুন। লক্ষ্য করুন যে onCreate() এবং onStart() উভয় পদ্ধতিই একের পর এক কল করা হয়েছে এবং আপনার কার্যকলাপ স্ক্রিনে দৃশ্যমান।
  2. ডিভাইসে হোম বোতাম টিপুন, এবং তারপর কার্যকলাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। লক্ষ্য করুন যে ক্রিয়াকলাপটি যেখানে ছেড়েছিল সেখানে আবার শুরু হয়, একই মান সহ, এবং যে onStart() Logcat এ দ্বিতীয়বার লগ করা হয়েছে। এছাড়াও লক্ষ্য করুন যে onCreate() পদ্ধতিটি সাধারণত আবার বলা হয় না।

এই টাস্কে, আপনি Timber নামে একটি জনপ্রিয় লগিং লাইব্রেরি ব্যবহার করতে আপনার অ্যাপটি পরিবর্তন করেন। বিল্ট-ইন অ্যান্ড্রয়েড Log ক্লাসের Timber বেশ কিছু সুবিধা রয়েছে। বিশেষ করে, Timber লাইব্রেরি:

  • ক্লাসের নামের উপর ভিত্তি করে আপনার জন্য লগ ট্যাগ তৈরি করে।
  • আপনার অ্যান্ড্রয়েড অ্যাপের রিলিজ সংস্করণে লগ দেখানো এড়াতে সাহায্য করে।
  • ক্র্যাশ-রিপোর্টিং লাইব্রেরির সাথে একীকরণের অনুমতি দেয়।

আপনি অবিলম্বে প্রথম সুবিধা দেখতে পাবেন; অন্যদের আপনি প্রশংসা করবেন যখন আপনি বড় অ্যাপ তৈরি করবেন এবং পাঠাবেন।

ধাপ 1: গ্রেডলে কাঠ যুক্ত করুন

  1. গিটহাবের টিম্বার প্রকল্পের এই লিঙ্কটিতে যান এবং ডাউনলোড শিরোনামের অধীনে কোডের লাইনটি অনুলিপি করুন যা implementation শব্দ দিয়ে শুরু হয়। কোডের লাইনটি এরকম কিছু দেখাবে, যদিও সংস্করণ নম্বর ভিন্ন হতে পারে।
implementation 'com.jakewharton.timber:timber:4.7.1'
  1. অ্যান্ড্রয়েড স্টুডিওতে, প্রজেক্টে: অ্যান্ড্রয়েড ভিউ, গ্রেডল স্ক্রিপ্ট প্রসারিত করুন এবং build.gradle (মডিউল: অ্যাপ) ফাইলটি খুলুন।
  2. নির্ভরতা বিভাগের ভিতরে, আপনি কপি করা কোডের লাইনটি পেস্ট করুন।
dependencies {
   ...
   implementation 'com.jakewharton.timber:timber:4.7.1'
}
  1. Gradle পুনর্নির্মাণ করতে Android স্টুডিওর উপরের ডানদিকে Sync Now লিঙ্কটিতে ক্লিক করুন। বিল্ডটি ত্রুটি ছাড়াই কার্যকর করা উচিত।

ধাপ 2: একটি অ্যাপ্লিকেশন ক্লাস তৈরি করুন এবং টিম্বার শুরু করুন

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

Timber Application ক্লাস ব্যবহার করে কারণ পুরো অ্যাপটি এই লগিং লাইব্রেরিটি ব্যবহার করবে, এবং অন্য সবকিছু সেট আপ করার আগে লাইব্রেরিটিকে একবার শুরু করতে হবে। এই ধরনের ক্ষেত্রে, আপনি Application ক্লাসটি সাবক্লাস করতে পারেন এবং আপনার নিজস্ব কাস্টম বাস্তবায়নের মাধ্যমে ডিফল্টগুলিকে ওভাররাইড করতে পারেন।

আপনি আপনার Application ক্লাস তৈরি করার পরে, আপনাকে অ্যান্ড্রয়েড ম্যানিফেস্টে ক্লাসটি নির্দিষ্ট করতে হবে।

  1. dessertclicker প্যাকেজে, ClickerApplication নামে একটি নতুন কোটলিন ক্লাস তৈরি করুন। এটি করার জন্য, অ্যাপ > java প্রসারিত করুন এবং com.example.android.dessertclicker- এ ডান-ক্লিক করুন। নতুন > কোটলিন ফাইল/ক্লাস নির্বাচন করুন।
  2. ক্লাসের নাম ClickerApplication এবং Kind কে ক্লাসে সেট করুন। ওকে ক্লিক করুন।

অ্যান্ড্রয়েড স্টুডিও একটি নতুন ClickerApplication ক্লাস তৈরি করে এবং এটি কোড এডিটরে খোলে। কোড এই মত দেখায়:

package com.example.android.dessertclicker

class ClickerApplication {
}
  1. শ্রেণী সংজ্ঞা পরিবর্তন করুন Application একটি উপশ্রেণী হতে এবং প্রয়োজনে Application ক্লাস আমদানি করুন।
class ClickerApplication : Application() {
  1. onCreate() পদ্ধতি ওভাররাইড করতে, কোড > ওভাররাইড পদ্ধতি নির্বাচন করুন বা Control+o টিপুন।
class ClickerApplication : Application() {
   override fun onCreate() {
       super.onCreate()
   }
}
  1. সেই onCreate() পদ্ধতির ভিতরে, Timber লাইব্রেরি শুরু করুন:
override fun onCreate() {
    super.onCreate()

    Timber.plant(Timber.DebugTree())
}

কোডের এই লাইনটি আপনার অ্যাপের জন্য Timber লাইব্রেরি শুরু করে যাতে আপনি আপনার কার্যকলাপে লাইব্রেরি ব্যবহার করতে পারেন।

  1. AndroidManifest.xml খুলুন।
  2. <application> উপাদানের শীর্ষে, ClickerApplication ক্লাসের জন্য একটি নতুন বৈশিষ্ট্য যোগ করুন, যাতে Android ডিফল্টটির পরিবর্তে আপনার Application ক্লাস ব্যবহার করতে জানে।
<application
   android:name=".ClickerApplication"
...

ধাপ 3: টিম্বার লগ স্টেটমেন্ট যোগ করুন

এই ধাপে, আপনি আপনার Log.i() কলগুলি Timber ব্যবহার করতে পরিবর্তন করেন, তারপর আপনি অন্যান্য সমস্ত জীবনচক্র পদ্ধতির জন্য লগিং প্রয়োগ করেন।

  1. MainActivity খুলুন এবং onCreate() এ স্ক্রোল করুন। Log.i() কে Timber.i() Log.i() দিয়ে প্রতিস্থাপন করুন এবং লগ ট্যাগটি সরান।
Timber.i("onCreate called")

Log ক্লাসের মতো, Timber তথ্যমূলক বার্তাগুলির জন্য i() পদ্ধতি ব্যবহার করে। লক্ষ্য করুন যে Timber সাথে আপনাকে লগ ট্যাগ যোগ করার দরকার নেই; Timber স্বয়ংক্রিয়ভাবে লগ ট্যাগ হিসাবে ক্লাসের নাম ব্যবহার করে।

  1. একইভাবে, Log কল পরিবর্তন করুন onStart() :
override fun onStart() {
   super.onStart()

   Timber.i("onStart Called")
}
  1. DessertClicker অ্যাপ কম্পাইল করুন এবং চালান এবং Logcat খুলুন। লক্ষ্য করুন যে আপনি এখনও onCreate() এবং onStart() এর জন্য একই লগ বার্তাগুলি দেখতে পাচ্ছেন, শুধুমাত্র এখন Timber সেই বার্তাগুলি তৈরি করছে, Log ক্লাস নয়৷
  2. আপনার MainActivity এ বাকি জীবনচক্র পদ্ধতিগুলিকে ওভাররাইড করুন এবং প্রতিটির জন্য Timber লগ স্টেটমেন্ট যোগ করুন। এখানে কোড আছে:
override fun onResume() {
   super.onResume()
   Timber.i("onResume Called")
}

override fun onPause() {
   super.onPause()
   Timber.i("onPause Called")
}

override fun onStop() {
   super.onStop()
   Timber.i("onStop Called")
}

override fun onDestroy() {
   super.onDestroy()
   Timber.i("onDestroy Called")
}

override fun onRestart() {
   super.onRestart()
   Timber.i("onRestart Called")
}
  1. DessertClicker আবার কম্পাইল করুন এবং চালান এবং Logcat পরীক্ষা করুন। এইবার লক্ষ্য করুন যে onCreate() এবং onStart() ছাড়াও, onResume() লাইফসাইকেল কলব্যাকের জন্য একটি লগ বার্তা রয়েছে৷

যখন একটি ক্রিয়াকলাপ স্ক্র্যাচ থেকে শুরু হয়, তখন আপনি এই তিনটি লাইফসাইকেল কলব্যাককে ক্রমানুসারে ডাকতে দেখেন:

  • onCreate() অ্যাপ তৈরি করতে।
  • onStart() এটি শুরু করতে এবং এটি স্ক্রিনে দৃশ্যমান করতে।
  • onResume() ফোকাস দিতে এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করার জন্য এটি প্রস্তুত করে।

নাম থাকা সত্ত্বেও, onResume() পদ্ধতিটি স্টার্টআপে বলা হয়, এমনকি যদি পুনরায় শুরু করার কিছু না থাকে।

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

কেস 1 ব্যবহার করুন: কার্যকলাপ খোলা এবং বন্ধ করা

আপনি সবচেয়ে মৌলিক ব্যবহারের ক্ষেত্রে শুরু করেন, যেটি হল আপনার অ্যাপটি প্রথমবার শুরু করা, তারপর অ্যাপটিকে সম্পূর্ণভাবে বন্ধ করে দিন।

  1. DessertClicker অ্যাপটি কম্পাইল করুন এবং চালান, যদি এটি ইতিমধ্যে চালু না হয়। আপনি যেমন দেখেছেন, প্রথমবার কার্যকলাপ শুরু হলে onCreate() , onStart() , এবং onResume() কলব্যাকগুলিকে কল করা হয়৷
  2. কাপকেক কয়েকবার আলতো চাপুন।
  3. ডিভাইসের পিছনের বোতামটি আলতো চাপুন। Logcat-এ লক্ষ্য করুন যে onPause() , onStop onStop() , এবং onDestroy() কে সেই ক্রমে বলা হয়েছে।

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

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


    আগের ধাপে অ্যাক্টিভিটি নষ্ট হয়ে গেছে, তাই আপনি যখন অ্যাপে ফিরে যান, তখন Android একটি নতুন অ্যাক্টিভিটি শুরু করে এবং onCreate() , onStart() এবং onResume() পদ্ধতিতে কল করে। লক্ষ্য করুন যে পূর্ববর্তী কার্যকলাপ থেকে DessertClicker পরিসংখ্যানগুলির একটিও রাখা হয়নি।

    এখানে মূল বিষয় হল যে onCreate() এবং onDestroy() শুধুমাত্র একটি একক ক্রিয়াকলাপের উদাহরণের জীবদ্দশায় একবার কল করা হয়: onCreate() অ্যাপটিকে প্রথমবারের মতো আরম্ভ করার জন্য, এবং onDestroy() দ্বারা ব্যবহৃত সংস্থানগুলি পরিষ্কার করার জন্য আপনার অ্যাপ।

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

কেস 2 ব্যবহার করুন: কার্যকলাপ থেকে দূরে এবং পিছনে নেভিগেট করা

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

ব্যবহারকারী যখনই সেই কার্যকলাপ থেকে দূরে নেভিগেট করে তখনই আপনার কার্যকলাপ সম্পূর্ণরূপে বন্ধ হয়ে যায় না:

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

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

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

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

এই ধাপে, আপনি অ্যাক্টিভিটি লাইফসাইকেল দেখেন যখন অ্যাপটি ব্যাকগ্রাউন্ডে যায় এবং আবার ফোরগ্রাউন্ডে ফিরে আসে।

  1. DessertClicker অ্যাপটি চলমান থাকায়, কাপকেকে কয়েকবার ক্লিক করুন।
  2. আপনার ডিভাইসে হোম বোতাম টিপুন এবং অ্যান্ড্রয়েড স্টুডিওতে লগক্যাটটি পর্যবেক্ষণ করুন। হোম স্ক্রিনে ফিরে আসা আপনার অ্যাপটিকে সম্পূর্ণরূপে বন্ধ করার পরিবর্তে ব্যাকগ্রাউন্ডে রাখে। লক্ষ্য করুন যে onPause() মেথড এবং onStop() মেথড বলা হয়, কিন্তু onDestroy() নয়।


    যখন onPause() করা হয়, তখন অ্যাপটির আর ফোকাস থাকে না। onStop() এর পরে, অ্যাপটি আর পর্দায় দৃশ্যমান হয় না। যদিও কার্যকলাপ বন্ধ করা হয়েছে, Activity অবজেক্ট এখনও মেমরি, ব্যাকগ্রাউন্ডে আছে. কার্যকলাপ ধ্বংস করা হয় নি. ব্যবহারকারী অ্যাপে ফিরে আসতে পারে, তাই অ্যান্ড্রয়েড আপনার কার্যকলাপের সংস্থানগুলিকে ঘিরে রাখে।
  3. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। Logcat-এ লক্ষ্য করুন যে কার্যকলাপটি onRestart onRestart() এবং onStart() দিয়ে পুনরায় আরম্ভ করা হয়েছে, তারপর onResume() দিয়ে পুনরায় শুরু করা হয়েছে।


    যখন কার্যকলাপটি অগ্রভাগে ফিরে আসে, তখন onCreate() পদ্ধতিটি আবার কল করা হয় না। কার্যকলাপ অবজেক্ট ধ্বংস করা হয়নি, তাই এটি আবার তৈরি করার প্রয়োজন নেই। onCreate() এর পরিবর্তে, onCreate() onRestart() পদ্ধতি বলা হয়। লক্ষ্য করুন যে এই সময় যখন কার্যকলাপটি ফোরগ্রাউন্ডে ফিরে আসে, তখন ডেজার্ট বিক্রির নম্বরটি ধরে রাখা হয়।
  4. DessertClicker ছাড়া অন্তত একটি অ্যাপ শুরু করুন যাতে ডিভাইসটির সাম্প্রতিক স্ক্রিনে কয়েকটি অ্যাপ থাকে।
  5. সাম্প্রতিক স্ক্রীন আনুন এবং আরেকটি সাম্প্রতিক কার্যকলাপ খুলুন। তারপরে সাম্প্রতিক অ্যাপগুলিতে ফিরে যান এবং ডেসার্টক্লিকারকে ফোরগ্রাউন্ডে ফিরিয়ে আনুন।

    লক্ষ্য করুন যে আপনি যখন হোম বোতাম টিপুন তখন আপনি লগক্যাটে একই কলব্যাকগুলি দেখতে পাচ্ছেন। যখন অ্যাপটি ব্যাকগ্রাউন্ডে যায় তখন onPause() এবং onStop() করা হয় এবং তারপরে onRestart() , onStart() , এবং onResume() যখন এটি ফিরে আসে।

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

    তাহলে onRestart() সম্পর্কে কি? onRestart() পদ্ধতি অনেকটা onCreate() এর মত। কার্যকলাপ দৃশ্যমান হওয়ার আগে হয় onCreate() বা onRestart() কল করা হয়। onCreate() পদ্ধতিটি শুধুমাত্র প্রথমবার কল করা হয়, এবং তার পরে onRestart() বলা হয়। onRestart() পদ্ধতি হল কোড রাখার একটি জায়গা যা আপনি শুধুমাত্র কল করতে চান যদি আপনার কার্যকলাপ প্রথমবার শুরু না হয়।

কেস 3 ব্যবহার করুন: আংশিকভাবে কার্যকলাপ লুকান

আপনি শিখেছেন যে যখন একটি অ্যাপ চালু হয় এবং onStart() করা হয়, অ্যাপটি স্ক্রিনে দৃশ্যমান হয়। যখন অ্যাপটি পুনরায় চালু করা হয় এবং onResume() বলা হয়, অ্যাপটি ব্যবহারকারীর ফোকাস লাভ করে। জীবনচক্রের যে অংশে অ্যাপটি সম্পূর্ণ অন-স্ক্রীন এবং ব্যবহারকারীর ফোকাস রয়েছে তাকে ইন্টারেক্টিভ লাইফসাইকেল বলা হয়।

অ্যাপটি ব্যাকগ্রাউন্ডে চলে গেলে, onPause() এর পরে ফোকাস হারিয়ে যায় এবং onStop( onStop() এর পরে অ্যাপটি আর দৃশ্যমান হয় না।

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

  1. DessertClicker অ্যাপটি চলমান অবস্থায়, স্ক্রিনের উপরের ডানদিকে শেয়ার বোতামে ক্লিক করুন।




    শেয়ারিং অ্যাক্টিভিটি স্ক্রিনের নিচের অর্ধেকে দেখা যায়, কিন্তু অ্যাক্টিভিটি এখনও উপরের অর্ধেকে দেখা যায়।
  2. Logcat পরীক্ষা করুন এবং নোট করুন যে শুধুমাত্র onPause() বলা হয়েছিল।


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

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

    onPause() এ যেকোড চলে না কেন তা প্রদর্শন করা থেকে অন্য জিনিসগুলিকে ব্লক করে, তাই কোডটি onPause() তে হালকা রাখুন। উদাহরণস্বরূপ, যদি একটি ফোন কল আসে, তাহলে onPause() এর কোড ইনকামিং-কল বিজ্ঞপ্তি বিলম্বিত করতে পারে।
  3. অ্যাপে ফিরে যেতে শেয়ার ডায়ালগের বাইরে ক্লিক করুন, এবং লক্ষ্য করুন যে onResume() বলা হয়েছে।

    onResume() এবং onPause() উভয়ই ফোকাসের সাথে করতে হবে। onResume() পদ্ধতি বলা হয় যখন কার্যকলাপে ফোকাস থাকে, এবং onPause() বলা হয় যখন কার্যকলাপটি ফোকাস হারায়।

অ্যান্ড্রয়েড ফ্র্যাগমেন্ট লাইফসাইকেল অ্যাক্টিভিটি লাইফসাইকেলের অনুরূপ, এছাড়াও বেশ কিছু ফ্র্যাগমেন্ট-নির্দিষ্ট পদ্ধতি।

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

অ্যান্ড্রয়েডট্রিভিয়া অ্যাপের প্রতিটি স্ক্রিন একটি Fragment

জিনিসগুলি সহজ রাখতে, আপনি টিম্বার লাইব্রেরির পরিবর্তে এই টাস্কে Android লগিং API ব্যবহার করুন৷

  1. শেষ কোডল্যাব থেকে AndroidTrivia অ্যাপটি খুলুন, অথবা GitHub থেকে AndroidTrivia সমাধান কোড ডাউনলোড করুন।
  2. TitleFragment.kt ফাইলটি খুলুন। মনে রাখবেন যে আপনি অ্যাপটি পুনর্নির্মাণ না করা পর্যন্ত Android স্টুডিও বাধ্যতামূলক ত্রুটি এবং অমীমাংসিত-রেফারেন্স ত্রুটিগুলি দেখাতে পারে।
  3. onCreateView() পদ্ধতিতে নিচে স্ক্রোল করুন। লক্ষ্য করুন যে এখানে খণ্ডটির বিন্যাস স্ফীত হয় এবং ডেটা বাইন্ডিং ঘটে।
  4. onCreateView() পদ্ধতিতে একটি লগিং বিবৃতি যোগ করুন, setHasOptionsMenu() এর লাইন এবং ফিরতে চূড়ান্ত কলের মধ্যে:
setHasOptionsMenu(true)

Log.i("TitleFragment", "onCreateView called")

return binding.root
  1. onCreateView() পদ্ধতির ঠিক নীচে, প্রতিটি অবশিষ্ট খণ্ড জীবনচক্র পদ্ধতির জন্য লগিং বিবৃতি যোগ করুন। এখানে কোড আছে:
override fun onAttach(context: Context?) {
   super.onAttach(context)
   Log.i("TitleFragment", "onAttach called")
}
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   Log.i("TitleFragment", "onCreate called")
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
   super.onActivityCreated(savedInstanceState)
   Log.i("TitleFragment", "onActivityCreated called")
}
override fun onStart() {
   super.onStart()
   Log.i("TitleFragment", "onStart called")
}
override fun onResume() {
   super.onResume()
   Log.i("TitleFragment", "onResume called")
}
override fun onPause() {
   super.onPause()
   Log.i("TitleFragment", "onPause called")
}
override fun onStop() {
   super.onStop()
   Log.i("TitleFragment", "onStop called")
}
override fun onDestroyView() {
   super.onDestroyView()
   Log.i("TitleFragment", "onDestroyView called")
}
override fun onDetach() {
   super.onDetach()
   Log.i("TitleFragment", "onDetach called")
}
  1. অ্যাপটি কম্পাইল করুন এবং চালান এবং Logcat খুলুন।
  2. লগ ফিল্টার করতে সার্চ ফিল্ডে I/TitleFragment টাইপ করুন। অ্যাপটি শুরু হলে, Logcat নিম্নলিখিত স্ক্রিনশটের মতো দেখতে পাবে:

এখানে আপনি এই কলব্যাকগুলি সহ টুকরোটির পুরো স্টার্টআপ জীবনচক্র দেখতে পাবেন:

  • onAttach() : যখন খণ্ডটি তার মালিকের কার্যকলাপের সাথে যুক্ত থাকে তখন বলা হয়।
  • onCreate() : একইভাবে ক্রিয়াকলাপের জন্য onCreate() onCreate() , ফ্র্যাগমেন্টের জন্য onCreate() কে প্রাথমিক খণ্ড তৈরি করতে বলা হয় (লেআউট ছাড়া)।
  • onCreateView() : খণ্ডের বিন্যাস স্ফীত করার জন্য বলা হয়।
  • onActivityCreated() : মালিকের কার্যকলাপের onCreate( onCreate() সম্পূর্ণ হলে কল করা হয়। এই পদ্ধতিটি কল না করা পর্যন্ত আপনার খণ্ডটি কার্যকলাপ অ্যাক্সেস করতে সক্ষম হবে না।
  • onStart() : যখন খণ্ডটি দৃশ্যমান হয় তখন বলা হয়; কার্যকলাপের সমান্তরাল onStart()
  • onResume() : যখন খণ্ডটি ব্যবহারকারীর ফোকাস অর্জন করে তখন বলা হয়; কার্যকলাপের সমান্তরাল onResume()
  1. ট্রিভিয়া গেমে এগিয়ে যেতে প্লে বোতামে আলতো চাপুন এবং এখনই Logcat লক্ষ্য করুন।

পরবর্তী খণ্ডটি খোলার ফলে শিরোনাম খণ্ডটি বন্ধ হয়ে যায় এবং এই জীবনচক্র পদ্ধতিগুলিকে বলা হবে:

  • onPause() : যখন খণ্ডটি ব্যবহারকারীর ফোকাস হারায় তখন বলা হয়; কার্যকলাপের সমান্তরাল onPause()
  • onStop() : যখন খণ্ডটি স্ক্রিনে আর দৃশ্যমান হয় না তখন কল করা হয়; কার্যকলাপের onStop() এর সমান্তরাল।
  • onDestroyView() : সেই দৃশ্যের সাথে সম্পর্কিত সংস্থানগুলি পরিষ্কার করার জন্য যখন খণ্ডটির দৃশ্যের আর প্রয়োজন হয় না তখন বলা হয়।
  1. অ্যাপে, শিরোনাম খণ্ডে ফিরে যেতে আপ বোতামে (স্ক্রীনের উপরের-বাম কোণে তীরটি) আলতো চাপুন।


    এবার, onAttach() এবং onCreate onCreate() কে সম্ভবত ফ্র্যাগমেন্ট শুরু করতে বলা হয়নি। টুকরো বস্তুটি এখনও বিদ্যমান এবং এখনও তার মালিকের কার্যকলাপের সাথে সংযুক্ত রয়েছে, তাই জীবনচক্রটি onCreateView() দিয়ে আবার শুরু হয়।
  2. ডিভাইসের হোম বোতাম টিপুন। Logcat এ লক্ষ্য করুন যে শুধুমাত্র onPause() এবং onStop() কল করা হয়েছে। এটি কার্যকলাপের মতো একই আচরণ: বাড়িতে ফিরে কার্যকলাপ এবং খণ্ডটিকে পটভূমিতে রাখে।
  3. অ্যাপে ফিরে যেতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। ঠিক যেমনটি ক্রিয়াকলাপের ক্ষেত্রে ঘটেছে, onStart() এবং onResume() পদ্ধতিগুলিকে ফ্র্যাগমেন্টটিকে অগ্রভাগে ফিরিয়ে আনার জন্য বলা হয়।

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

কার্যকলাপ জীবনচক্র

  • কার্যকলাপ জীবনচক্র হল রাজ্যের একটি সেট যার মাধ্যমে একটি কার্যকলাপ স্থানান্তরিত হয়। কার্যকলাপ জীবনচক্র শুরু হয় যখন কার্যকলাপ প্রথম তৈরি হয় এবং শেষ হয় যখন কার্যকলাপ ধ্বংস হয়।
  • ব্যবহারকারী আপনার অ্যাপের ভিতরে এবং বাইরের কার্যকলাপের মধ্যে নেভিগেট করার সাথে সাথে প্রতিটি কার্যকলাপ কার্যকলাপের জীবনচক্রের রাজ্যগুলির মধ্যে চলে যায়।
  • কার্যকলাপ জীবনচক্রের প্রতিটি রাজ্যের একটি সংশ্লিষ্ট কলব্যাক পদ্ধতি রয়েছে যা আপনি আপনার Activity ক্লাসে ওভাররাইড করতে পারেন। সাতটি জীবনচক্র পদ্ধতি রয়েছে:
    onCreate()
    onStart()
    onPause()
    onRestart()
    onResume()
    onStop()
    onDestroy()
  • আপনার কার্যকলাপ যখন একটি জীবনচক্র অবস্থায় রূপান্তরিত হয় তখন ঘটে এমন আচরণ যোগ করতে, রাজ্যের কলব্যাক পদ্ধতিকে ওভাররাইড করুন।
  • অ্যান্ড্রয়েড স্টুডিওতে আপনার ক্লাসে কঙ্কাল ওভাররাইড পদ্ধতি যোগ করতে, কোড > ওভাররাইড পদ্ধতি নির্বাচন করুন বা Control+o টিপুন।

লগ দিয়ে লগিং করা

  • অ্যান্ড্রয়েড লগিং এপিআই, এবং বিশেষ করে Log ক্লাস, আপনাকে ছোট বার্তা লিখতে সক্ষম করে যা Android স্টুডিওর মধ্যে Logcat-এ প্রদর্শিত হয়।
  • একটি তথ্যমূলক বার্তা লিখতে Log.i() ব্যবহার করুন। এই পদ্ধতিতে দুটি আর্গুমেন্ট লাগে: লগ ট্যাগ , সাধারণত ক্লাসের নাম এবং লগ মেসেজ , একটি ছোট স্ট্রিং।
  • আপনার লেখা বার্তাগুলি সহ সিস্টেম লগগুলি দেখতে Android স্টুডিওতে Logcat ফলকটি ব্যবহার করুন৷

কাঠ দিয়ে লগিং

Timber হ'ল একটি লগিং লাইব্রেরি যা অ্যান্ড্রয়েড লগিং এপিআই-এর উপর বিভিন্ন সুবিধা সহ। বিশেষ করে, Timber লাইব্রেরি:

  • ক্লাসের নামের উপর ভিত্তি করে আপনার জন্য লগ ট্যাগ তৈরি করে।
  • আপনার Android অ্যাপের রিলিজ সংস্করণে লগ দেখানো এড়াতে সাহায্য করে।
  • ক্র্যাশ রিপোর্টিং লাইব্রেরির সাথে একীকরণের অনুমতি দেয়।

Timber ব্যবহার করতে, আপনার গ্রেডল ফাইলে এর নির্ভরতা যোগ করুন এবং এটি শুরু করতে Application ক্লাস প্রসারিত করুন:

  • Application হল একটি বেস ক্লাস যা আপনার সমগ্র অ্যাপের জন্য বিশ্বব্যাপী অ্যাপ্লিকেশন অবস্থা ধারণ করে। একটি ডিফল্ট Application ক্লাস আছে যা Android দ্বারা ব্যবহৃত হয় যদি আপনি একটি নির্দিষ্ট না করেন। Timber -এর মতো অ্যাপ-ওয়াইড লাইব্রেরি আরম্ভ করতে আপনি আপনার নিজস্ব Application সাবক্লাস তৈরি করতে পারেন।
  • Android ম্যানিফেস্টে <application> এলিমেন্টে android:name অ্যাট্রিবিউট যোগ করে আপনার অ্যাপে আপনার কাস্টম Application ক্লাস যোগ করুন। এই কাজ করতে ভুলবেন না!
  • Timber দিয়ে লগ বার্তা লিখতে Timber.i() ব্যবহার করুন। এই পদ্ধতিতে শুধুমাত্র একটি যুক্তি লাগে: লেখার বার্তা। লগ ট্যাগ (শ্রেণীর নাম) স্বয়ংক্রিয়ভাবে আপনার জন্য যোগ করা হয়.

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

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

অন্যান্য:

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

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

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

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

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

পাঠ 1 থেকে DiceRoller অ্যাপটি খুলুন। (আপনার কাছে অ্যাপটি না থাকলে আপনি এখানে DiceRoller অ্যাপটি ডাউনলোড করতে পারেন।) সেই অ্যাপটিতে টিম্বার সমর্থন যোগ করুন, একই প্রক্রিয়া ব্যবহার করে আপনি ডেসার্টক্লিকার অ্যাপের জন্য করেছিলেন। সমস্ত লাইফসাইকেল কলব্যাকগুলিকে ওভাররাইড করুন এবং প্রতিটি কলব্যাকের জন্য লগিং বার্তা যুক্ত করুন৷

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

প্রশ্ন 1

নিচের কোনটি একটি কার্যকলাপ জীবনচক্র অবস্থা নয়?

  • শুরু হয়েছে
  • অপেক্ষা করছে
  • তৈরি হয়েছে
  • ধ্বংস হয়েছে

প্রশ্ন 2

একটি কার্যকলাপ দৃশ্যমান করার জন্য কোন জীবনচক্র পদ্ধতিকে বলা হয়?

  • onPause()
  • onVisible()
  • onStart()
  • onDestroy()

প্রশ্ন 3

ক্রিয়াকলাপকে ফোকাস দেওয়ার জন্য কোন জীবনচক্র পদ্ধতিকে বলা হয়?

  • onResume()
  • onVisible()
  • onStart()
  • onFocus()

প্রশ্ন 4

কখন onCreate() একটি কার্যকলাপে ডাকা হয়?

  • প্রতিটি সময় কার্যকলাপ ব্যবহারকারীর কাছে দৃশ্যমান হয়.
  • প্রতিবার ব্যাকগ্রাউন্ড থেকে কার্যকলাপ ফিরে আসে।
  • শুধুমাত্র একবার, যখন কার্যকলাপ তৈরি করা হয়।
  • শুধুমাত্র একবার, যখন কার্যকলাপ আবার শুরু হয়।

গ্রেডিংয়ের জন্য আপনার অ্যাপটি জমা দিন

অ্যাপটিতে নিম্নলিখিতগুলি রয়েছে তা নিশ্চিত করতে পরীক্ষা করুন:

  • অ্যাপের জন্য build.gradle ফাইলে Timber উপর নির্ভরতা।
  • A custom subclass of Application that initializes Timber in onCreate() .
  • An attribute for that custom subclass in the Android manifest.
  • Method overrides in MainActivity for all the lifecycle callback methods, with calls to Timber.i() for logging.

Start the next lesson: 4.2: Complex lifecycle situations

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