খণ্ড জীবনচক্র

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

লাইফসাইকেল পরিচালনা করতে, Fragment LifecycleOwner প্রয়োগ করে, একটি Lifecycle অবজেক্টকে প্রকাশ করে যা আপনি getLifecycle() পদ্ধতির মাধ্যমে অ্যাক্সেস করতে পারেন।

প্রতিটি সম্ভাব্য Lifecycle স্টেটকে Lifecycle.State enum-এ উপস্থাপন করা হয়।

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

একটি LifecycleObserver ব্যবহার করার বিকল্প হিসেবে, Fragment ক্লাসে কলব্যাক পদ্ধতি রয়েছে যা একটি খণ্ডের জীবনচক্রের প্রতিটি পরিবর্তনের সাথে সঙ্গতিপূর্ণ। এর মধ্যে রয়েছে onCreate() , onStart() , onResume() , onPause() , onStop() , এবং onDestroy()

একটি খণ্ডের দৃষ্টিভঙ্গির একটি পৃথক Lifecycle থাকে যা খণ্ডটির Lifecycle থেকে স্বাধীনভাবে পরিচালিত হয়। ফ্র্যাগমেন্ট তাদের দেখার জন্য একটি LifecycleOwner বজায় রাখে, যা getViewLifecycleOwner() বা getViewLifecycleOwnerLiveData() ব্যবহার করে অ্যাক্সেস করা যেতে পারে। ভিউয়ের Lifecycle অ্যাক্সেস থাকা এমন পরিস্থিতিতে উপযোগী যেখানে একটি লাইফসাইকেল-সচেতন উপাদান কেবলমাত্র একটি খণ্ডের দৃশ্য বিদ্যমান থাকাকালীন কাজ করা উচিত, যেমন LiveData পর্যবেক্ষণ করা যা শুধুমাত্র স্ক্রিনে দেখানোর জন্য।

এই বিষয়টি Fragment লাইফসাইকেল সম্পর্কে বিস্তারিত আলোচনা করে, কিছু নিয়ম ব্যাখ্যা করে যা একটি খণ্ডের লাইফসাইকেল স্টেট নির্ধারণ করে এবং Lifecycle স্টেট এবং ফ্র্যাগমেন্ট লাইফসাইকেল কলব্যাকের মধ্যে সম্পর্ক দেখায়।

টুকরো এবং টুকরো ম্যানেজার

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

ফ্র্যাগমেন্ট লাইফসাইকেলের বাইরে, FragmentManager তাদের হোস্ট অ্যাক্টিভিটির সাথে টুকরো সংযুক্ত করার জন্য এবং যখন খণ্ডটি আর ব্যবহার করা হয় না তখন তাদের বিচ্ছিন্ন করার জন্যও দায়ী। Fragment ক্লাসে দুটি কলব্যাক পদ্ধতি রয়েছে, onAttach() এবং onDetach() , যেটি আপনি যখন এই ঘটনাগুলির মধ্যে একটি ঘটবে তখন কাজ সম্পাদন করতে ওভাররাইড করতে পারেন।

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

যেকোনো লাইফসাইকেল স্টেট পরিবর্তনের আগে onAttach() সবসময় কল করা হয়।

onDetach() কলব্যাকটি চালু করা হয় যখন একটি FragmentManager থেকে খণ্ডটি সরানো হয় এবং এর হোস্ট কার্যকলাপ থেকে বিচ্ছিন্ন করা হয়। খণ্ডটি আর সক্রিয় নেই এবং findFragmentById() ব্যবহার করে আর পুনরুদ্ধার করা যাবে না।

যেকোনো লাইফসাইকেল অবস্থার পরিবর্তনের পরে onDetach() সর্বদা কল করা হয়।

মনে রাখবেন যে এই কলব্যাকগুলি FragmentTransaction পদ্ধতির সাথে সম্পর্কযুক্ত নয় attach() এবং detach() । এই পদ্ধতিগুলি সম্পর্কে আরও তথ্যের জন্য, ফ্র্যাগমেন্ট লেনদেন দেখুন।

ফ্র্যাগমেন্ট লাইফসাইকেল স্টেট এবং কলব্যাক

একটি খণ্ডের জীবনচক্র অবস্থা নির্ধারণ করার সময়, FragmentManager নিম্নলিখিতগুলি বিবেচনা করে:

  • একটি খণ্ডের সর্বোচ্চ অবস্থা তার FragmentManager দ্বারা নির্ধারিত হয়। একটি খণ্ডটি তার FragmentManager অবস্থার বাইরে অগ্রসর হতে পারে না।
  • একটি FragmentTransaction অংশ হিসাবে, আপনি setMaxLifecycle() ব্যবহার করে একটি খণ্ডের উপর একটি সর্বোচ্চ জীবনচক্র অবস্থা সেট করতে পারেন।
  • একটি খণ্ডের জীবনচক্র অবস্থা তার পিতামাতার চেয়ে বড় হতে পারে না। উদাহরণস্বরূপ, একটি অভিভাবক খণ্ড বা কার্যকলাপ তার সন্তানের টুকরা আগে শুরু করা আবশ্যক. একইভাবে, শিশুর খণ্ডগুলিকে অবশ্যই তাদের পিতামাতার খণ্ড বা কার্যকলাপের আগে বন্ধ করতে হবে।
খণ্ডের জীবনচক্রের অবস্থা এবং তাদের সম্পর্ক খণ্ডের জীবনচক্র কলব্যাক এবং খণ্ডের দৃষ্টিভঙ্গি জীবনচক্র উভয়ই
চিত্র 1. ফ্র্যাগমেন্ট Lifecycle স্টেটস এবং ফ্র্যাগমেন্টের লাইফসাইকেল কলব্যাক এবং ফ্র্যাগমেন্টের ভিউ Lifecycle উভয়ের সাথে তাদের সম্পর্ক।

চিত্র 1 খণ্ডের Lifecycle স্টেটগুলির প্রতিটি দেখায় এবং কীভাবে তারা টুকরোটির লাইফসাইকেল কলব্যাক এবং টুকরোটির Lifecycle উভয়ের সাথে সম্পর্কিত।

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

ঊর্ধ্বমুখী রাষ্ট্র পরিবর্তন

লাইফসাইকেল স্টেটের মধ্য দিয়ে ঊর্ধ্বগামী হওয়ার সময়, একটি খণ্ড প্রথমে তার নতুন অবস্থার জন্য সংশ্লিষ্ট লাইফসাইকেল কলব্যাককে কল করে। একবার এই কলব্যাকটি শেষ হয়ে গেলে, প্রাসঙ্গিক Lifecycle.Event ইভেন্টটি পর্যবেক্ষকদের কাছে ফ্র্যাগমেন্টের Lifecycle দ্বারা নির্গত হয়, তারপরে ফ্র্যাগমেন্টের ভিউ Lifecycle দ্বারা অনুসৃত হয়, যদি এটি ইনস্ট্যান্ট করা হয়।

খণ্ড তৈরি করা হয়েছে৷

আপনার খণ্ডটি CREATED অবস্থায় পৌঁছে গেলে, এটি একটি FragmentManager যোগ করা হয়েছে এবং onAttach() পদ্ধতিটি ইতিমধ্যেই কল করা হয়েছে।

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

এই রূপান্তরটি onCreate() কলব্যাকের আহ্বান জানায়। কলব্যাকটি একটি savedInstanceState Bundle আর্গুমেন্টও পায় যাতে পূর্বে onSaveInstanceState() দ্বারা সংরক্ষিত যেকোনো অবস্থা থাকে। মনে রাখবেন যে প্রথমবার খণ্ডটি তৈরি করার সময় savedInstanceState একটি null মান রয়েছে, কিন্তু পরবর্তী বিনোদনের জন্য এটি সর্বদা নন-নাল থাকে, এমনকি যদি আপনি onSaveInstanceState() ওভাররাইড না করেন। আরও বিশদ বিবরণের জন্য খণ্ড সহ রাজ্য সংরক্ষণ দেখুন।

খণ্ড তৈরি করা হয়েছে এবং দেখুন শুরু হয়েছে৷

ফ্র্যাগমেন্টের ভিউ Lifecycle তখনই তৈরি হয় যখন আপনার Fragment একটি বৈধ View ইন্সট্যান্স প্রদান করে। বেশিরভাগ ক্ষেত্রে, আপনি @LayoutId গ্রহনকারী ফ্র্যাগমেন্ট কনস্ট্রাক্টর ব্যবহার করতে পারেন, যা যথাযথ সময়ে দৃশ্যটিকে স্বয়ংক্রিয়ভাবে স্ফীত করে। আপনি প্রোগ্রাম্যাটিকভাবে স্ফীত করতে বা আপনার খণ্ডের দৃশ্য তৈরি করতে onCreateView() ওভাররাইড করতে পারেন।

যদি এবং শুধুমাত্র যদি আপনার খণ্ডের দৃশ্য একটি নন-নাল View দিয়ে ইনস্ট্যান্ট করা হয়, সেই View ফ্র্যাগমেন্টে সেট করা থাকে এবং getView() ব্যবহার করে পুনরুদ্ধার করা যেতে পারে। getViewLifecycleOwnerLiveData() তারপর নতুন INITIALIZED LifecycleOwner সাথে আপডেট করা হয় যা টুকরোটির দৃশ্যের সাথে সম্পর্কিত। onViewCreated() লাইফসাইকেল কলব্যাকও এই সময়ে বলা হয়।

এটি আপনার দৃশ্যের প্রাথমিক অবস্থা সেট আপ করার জন্য, LiveData দৃষ্টান্তগুলি পর্যবেক্ষণ করা শুরু করার জন্য যার কলব্যাকগুলি ফ্র্যাগমেন্টের ভিউ আপডেট করে এবং আপনার খণ্ডের দৃশ্যে যেকোনো RecyclerView বা ViewPager2 দৃষ্টান্তগুলিতে অ্যাডাপ্টার সেট আপ করার জন্য উপযুক্ত জায়গা৷

খণ্ড এবং দেখুন তৈরি

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

এই রূপান্তরটি onViewStateRestored() কলব্যাকেরও আহ্বান করে।

খণ্ড এবং দেখুন শুরু

লাইফসাইকেল-সচেতন উপাদানগুলিকে একটি খণ্ডের STARTED অবস্থার সাথে বেঁধে রাখার জন্য দৃঢ়ভাবে সুপারিশ করা হয়, কারণ এই অবস্থাটি গ্যারান্টি দেয় যে খণ্ডটির দৃশ্য উপলব্ধ, যদি একটি তৈরি করা হয়, এবং এটি টুকরোটির শিশু FragmentManager একটি FragmentTransaction করা নিরাপদ। . যদি খণ্ডের ভিউ অ-নাল হয়, খণ্ডের Lifecycle STARTED এ সরানোর পরপরই খণ্ডের ভিউ Lifecycle STARTED এ সরানো হয়।

যখন খণ্ডটি STARTED হয়ে যায়, onStart() কলব্যাক আহ্বান করা হয়।

ফ্র্যাগমেন্ট এবং দেখুন পুনরায় শুরু

যখন খণ্ডটি দৃশ্যমান হয়, সমস্ত Animator এবং Transition প্রভাব শেষ হয়ে যায় এবং খণ্ডটি ব্যবহারকারীর মিথস্ক্রিয়া জন্য প্রস্তুত। ফ্র্যাগমেন্টের Lifecycle RESUMED অবস্থায় চলে যায় এবং onResume() কলব্যাক আহ্বান করা হয়।

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

নিম্নগামী অবস্থার রূপান্তর

যখন একটি খণ্ডটি নিম্নতর জীবনচক্র অবস্থায় নিচের দিকে চলে যায়, তখন প্রাসঙ্গিক Lifecycle.Event পর্যবেক্ষকদের কাছে ফ্র্যাগমেন্টের দৃষ্টিভঙ্গি Lifecycle দ্বারা নির্গত হয়, যদি তাৎক্ষণিকভাবে করা হয়, তাহলে খণ্ডটির Lifecycle অনুসরণ করে। একটি খণ্ডের জীবনচক্র ইভেন্ট নির্গত হওয়ার পরে, খণ্ডটি সংশ্লিষ্ট জীবনচক্র কলব্যাককে কল করে।

খণ্ড এবং দেখুন শুরু

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

খণ্ড এবং দেখুন তৈরি

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

চিত্র 2-এ দেখানো হিসাবে, onStop() কলব্যাকের ক্রম এবং onSaveInstanceState() এর সাথে রাজ্যের সংরক্ষণ API স্তরের উপর ভিত্তি করে আলাদা। API 28 এর পূর্বের সমস্ত API স্তরের জন্য, onStop() এর আগে onSaveInstanceState() () চালু করা হয়। API স্তর 28 এবং উচ্চতর জন্য, কলিং অর্ডার বিপরীত হয়।

onStop() এবং onSaveInstanceState() এর জন্য কলিং অর্ডার পার্থক্য
চিত্র 2. onStop() এবং onSaveInstanceState() এর জন্য কলিং অর্ডারের পার্থক্য।

খণ্ড তৈরি এবং ধ্বংস দেখুন

সমস্ত প্রস্থান অ্যানিমেশন এবং ট্রানজিশন সম্পূর্ণ হওয়ার পরে, এবং ফ্র্যাগমেন্টের ভিউ উইন্ডো থেকে বিচ্ছিন্ন হয়ে যাওয়ার পরে, ফ্র্যাগমেন্টের ভিউ Lifecycle DESTROYED হওয়া অবস্থায় সরানো হয় এবং ON_DESTROY ইভেন্টটি তার পর্যবেক্ষকদের কাছে প্রকাশ করে। খণ্ডটি তারপর তার onDestroyView() কলব্যাক আহ্বান করে। এই মুহুর্তে, ফ্র্যাগমেন্টের দৃষ্টিভঙ্গি তার জীবনচক্রের শেষ পর্যায়ে পৌঁছেছে এবং getViewLifecycleOwnerLiveData() একটি null মান প্রদান করে।

এই মুহুর্তে, টুকরোটির দৃশ্যের সমস্ত রেফারেন্স মুছে ফেলা উচিত, টুকরোটির দৃশ্যটিকে আবর্জনা সংগ্রহ করার অনুমতি দেয়।

খণ্ডটি ধ্বংস করা হয়েছে

যদি খণ্ডটি সরানো হয়, অথবা যদি FragmentManager ধ্বংস হয়ে যায়, তবে খণ্ডটির Lifecycle DESTROYED অবস্থায় সরানো হয় এবং ON_DESTROY ইভেন্টটি তার পর্যবেক্ষকদের কাছে পাঠায়। খণ্ডটি তারপর তার onDestroy() কলব্যাক আহ্বান করে। এই মুহুর্তে, খণ্ডটি তার জীবনচক্রের শেষ পর্যায়ে পৌঁছেছে।

অতিরিক্ত সম্পদ

খণ্ড জীবনচক্র সম্পর্কিত আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন।

গাইড

ব্লগ