Fragment Lifecycle कॉलबैक विधियों का एक कड़ाई से परिभाषित अनुक्रम है जिसे Android Fragment के जीवन भर कॉल करता है: निर्माण (onAttach) से पूर्ण हटाने (onDetach) तक। Fragment का जीवनचक्र Activity से अधिक जटिल है — इसमें 11 अवस्थाएँ और 7 मुख्य कॉलबैक शामिल हैं। Fragment Lifecycle FragmentManager के माध्यम से प्रबंधित होता है और इसकी मेज़बान Activity के जीवनचक्र से निकटता से जुड़ा होता है। Google के अनुसार, Fragment का उपयोग API Level 21+ पर चलने वाले 74% Android अनुप्रयोगों में होता है, जिससे पेशेवर Android विकास के लिए Fragment Lifecycle को समझना अनिवार्य हो जाता है। Fragment Lifecycle पर Android दस्तावेज़ीकरण सभी अवस्थाओं और कॉल गारंटियों का वर्णन करता है।
मुख्य बातें
Fragment Lifecycle परस्पर जुड़ी अवस्थाओं और विधियों का एक समूह है जिससे प्रत्येक Fragment इंस्टेंस निर्माण से विनाश तक गुज़रता है। Activity के विपरीत, Fragment का जीवनचक्र दो संदर्भों से जुड़ा होता है: स्वयं Fragment (onAttach से onDetach तक जीवित रहता है) और इसका View (onCreateView से onDestroyView तक जीवित रहता है)। यह पृथक्करण Fragment की एक प्रमुख विशेषता है, जो इसे Fragment को नष्ट किए बिना स्क्रीन घुमाने पर View के विनाश से बचने की अनुमति देता है।
Fragment कॉलबैक का पूरा अनुक्रम:
Google के अनुसार, एक आधुनिक अनुप्रयोग में औसत फ़्रैगमेंट प्रति उपयोगकर्ता सत्र 3–5 बार पूर्ण चक्र से गुज़रता है (स्क्रीन घुमाव और नेविगेशन के कारण)। सभी चरणों का सही संचालन UI स्थिरता का आधार है।
FragmentManager Fragment को पाँच मुख्य अवस्थाओं के माध्यम से प्रबंधित करता है, जो Fragment.State वर्ग में परिभाषित हैं। प्रत्येक अवस्था कॉलबैक के एक विशिष्ट सेट से मेल खाती है जिन्हें निष्पादित किया गया है।
| अवस्था | अर्थ | निष्पादित कॉलबैक |
|---|---|---|
| INITIALIZED | Fragment बनाया गया, लेकिन View अभी उपलब्ध नहीं है | onAttach, onCreate |
| CREATED | View बनाया गया, लेकिन Fragment दृश्यमान नहीं है | + onCreateView, onViewCreated |
| STARTED | Fragment दृश्यमान है, लेकिन सक्रिय नहीं है | + onStart |
| RESUMED | Fragment सक्रिय है, उपयोगकर्ता के साथ इंटरैक्ट करता है | + onResume |
| DESTROYED | Fragment नष्ट हो गया है | + onDestroyView, onDestroy, onDetach |
FragmentManager उपयोगकर्ता क्रियाओं और सिस्टम घटनाओं के आधार पर Fragment को अवस्थाओं के बीच ले जाता है। कंटेनर में Fragment जोड़ने पर, यह क्रमिक रूप से INITIALIZED → CREATED → STARTED → RESUMED से गुज़रता है। हटाने पर — RESUMED → STARTED → CREATED → DESTROYED।
CREATED अवस्था विशेष है: View नष्ट हो सकता है (onDestroyView के बाद), लेकिन Fragment स्वयं CREATED अवस्था में रहता है (onDestroyView के बाद, onDestroy से पहले)। यह FragmentManager को Fragment को बिना View के मेमोरी में रखने की अनुमति देता है, जो स्क्रीन घुमाव से बचने के लिए आवश्यक है।
Fragment Lifecycle और Activity Lifecycle निकटता से संबंधित हैं लेकिन इनमें मूलभूत अंतर हैं। Fragment हमेशा Activity के अंदर रहता है, और इसका जीवनचक्र मेज़बान Activity पर निर्भर करता है, लेकिन इसके समान नहीं है।
| पहलू | Activity | Fragment |
|---|---|---|
| कॉलबैक की संख्या | 7 (onCreate … onDestroy) | 11 (onAttach … onDetach) |
| View के लिए अलग Lifecycle | नहीं | हाँ (viewLifecycleOwner) |
| घुमाव से बचता है | नहीं (नष्ट हो जाता है) | हाँ (ViewModel + Fragment बच जाते हैं) |
| मेज़बान पर निर्भरता | नहीं | Activity Lifecycle पर निर्भर करता है |
| स्थिति सहेजना | onSaveInstanceState | onSaveInstanceState (Fragment स्तर) |
| प्रबंधन | सिस्टम | FragmentManager |
मुख्य व्यावहारिक अंतर: स्क्रीन घुमाने पर, Activity पूरी तरह नष्ट (onDestroy) और पुनः निर्मित (onCreate) होती है। Fragment घुमाव के दौरान onDestroyView (View नष्ट) → onCreateView (View पुनः निर्मित) से गुज़रता है, लेकिन Fragment स्वयं और उसका ViewModel जीवित रहते हैं। यह Fragment को UI लॉजिक के लिए एक आदर्श कंटेनर बनाता है जिसे कॉन्फ़िगरेशन परिवर्तनों से बचना चाहिए।
स्क्रीन घुमाव के दौरान कॉल क्रम: Activity.onPause → Fragment.onPause → Activity.onStop → Fragment.onStop → Activity.onDestroy → Fragment.onDestroyView → (Activity नष्ट) → Activity.onCreate → Fragment.onAttach → Fragment.onCreate → Fragment.onCreateView → Fragment.onViewCreated → Activity.onStart → Fragment.onStart → Activity.onResume → Fragment.onResume।
FragmentManager केंद्रीय वर्ग है जो fragments को जोड़ने, हटाने, बदलने और उनकी अवस्थाओं का प्रबंधन करने के लिए ज़िम्मेदार है। FragmentManager BackStack बनाए रखता है और लेनदेन के दौरान कॉलबैक का सही क्रम सुनिश्चित करता है। प्रत्येक Activity और प्रत्येक नेस्टेड Fragment का अपना FragmentManager होता है।
FragmentManager के मुख्य संचालन:
BackStack FragmentManager का लेनदेन स्टैक है। सिस्टम Back बटन दबाने पर, BackStack में अंतिम लेनदेन वापस रोल किया जाता है (popBackStack())। popBackStack के माध्यम से हटाया गया Fragment पुनर्स्थापित होता है। यदि BackStack खाली है, तो Back दबाने से Activity समाप्त हो जाती है।
Google के अनुसार, 78% Fragment समस्याएँ (डुप्लिकेशन, खाली स्क्रीन, IllegalStateException) FragmentManager के गलत उपयोग से संबंधित हैं। मुख्य नियम: संदर्भ के अनुसार commit() (एसिंक्रोनस) या commitNow() (सिंक्रोनस) के माध्यम से लेनदेन निष्पादित करें। commit() एकाधिक लेनदेन के तहत सही क्रम सुनिश्चित करता है।
Fragment onSaveInstanceState के माध्यम से अपनी स्वयं की स्थिति सहेजने की सुविधा का समर्थन करता है, जो Activity से स्वतंत्र रूप से काम करता है। Fragment स्थिति को Bundle में सहेजता है जो पुनर्स्थापना के दौरान onCreate और onCreateView को भेजा जाता है।
Fragment कब स्थिति सहेजता है:
आधुनिक दृष्टिकोण: Fragment स्थिति सहेजने के लिए ViewModel में SavedStateHandle का उपयोग करें। SavedStateHandle स्वचालित रूप से स्क्रीन घुमाव और प्रक्रिया मृत्यु पर डेटा सहेजता और पुनर्स्थापित करता है, बिना मैन्युअल onSaveInstanceState की आवश्यकता के। Google Fragment में UI स्थिति सहेजने के लिए SavedStateHandle को पसंदीदा तरीके के रूप में सुझाता है।
setRetainInstance (Fragment 1.3 से अप्रचलित): पहले Fragment स्क्रीन घुमाव पर setRetainInstance(true) के माध्यम से संरक्षित रह सकता था। इस दृष्टिकोण को ViewModel + SavedStateHandle द्वारा बदल दिया गया है, जो अधिक विश्वसनीय रूप से काम करते हैं और किसी विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं होती है।
viewLifecycleOwner Fragment View से जुड़ा Lifecycle है (onCreateView से onDestroyView तक)। यह एक मौलिक रूप से महत्वपूर्ण अवधारणा है: viewLifecycleOwner के माध्यम से LiveData/Flow पर की गई सब्सक्रिप्शन View नष्ट होने (onDestroyView) पर स्वचालित रूप से रद्द हो जाती हैं, लेकिन स्वयं Fragment को प्रभावित नहीं करती हैं।
viewLifecycleOwner और Fragment lifecycle के बीच अंतर:
यह क्यों महत्वपूर्ण है: यदि आप Fragment lifecycle (this) के माध्यम से LiveData पर सब्सक्राइब करते हैं, तो onDestroyView के बाद सब्सक्रिप्शन सक्रिय रहती है और LiveData शून्य View को अपडेट करने का प्रयास करेगा, जिससे NPE होगा। viewLifecycleOwner के माध्यम से सब्सक्राइब करना गारंटी देता है कि onDestroyView के बाद कोई UI अपडेट नहीं होगा।
नियम: Fragment में, LiveData, Flow और UI-संबंधित कोरूटीन की सब्सक्रिप्शन के लिए हमेशा viewLifecycleOwner का उपयोग करें। ViewModel कोरूटीन के लिए viewModelScope का उपयोग करें — यह Fragment के बजाय ViewModel से बंधा है।
सही UI आरंभीकरण और viewLifecycleOwner के माध्यम से LiveData सब्सक्रिप्शन दर्शाता है।
class UserListFragment : Fragment() {
private val viewModel: UserListViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment_user_list, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val button: Button = view.findViewById(R.id.load_button)
button.setOnClickListener { viewModel.loadUsers() }
viewModel.users.observe(viewLifecycleOwner) { users ->
Log.d("UserListFragment", "सूची अपडेट हो रही है: ${users.size} उपयोगकर्ता")
}
}
override fun onDestroyView() {
super.onDestroyView()
Log.d("UserListFragment", "onDestroyView: View नष्ट हो गया")
}
}
Fragment onCreateView में लेआउट इन्फ्लेट करता है, UI कॉन्फ़िगर करता है और onViewCreated में LiveData पर सब्सक्राइब करता है। viewLifecycleOwner के माध्यम से सब्सक्रिप्शन लीक को रोकने के लिए एक अनिवार्य आवश्यकता है। onDestroyView View विनाश को लॉग करता है — पुष्टि कि Fragment स्क्रीन घुमाव से बचता है।
Activity में FragmentManager के माध्यम से Fragment जोड़ना, BackStack के साथ बदलना और पुनर्स्थापना दर्शाता है।
class HostActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_host)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, HomeFragment())
.addToBackStack(null)
.commit()
}
}
fun openDetail(userId: String) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, DetailFragment.newInstance(userId))
.addToBackStack(null)
.commit()
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStack()
} else {
super.onBackPressed()
}
}
}
class DetailFragment : Fragment() {
companion object {
fun newInstance(userId: String): DetailFragment {
return DetailFragment().apply {
arguments = Bundle().apply { putString("user_id", userId) }
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val userId = arguments?.getString("user_id")
Log.d("DetailFragment", "उपयोगकर्ता विवरण लोड हो रहे हैं: $userId")
}
}
Activity fragments प्रबंधित करने के लिए supportFragmentManager का उपयोग करती है। BackStack के साथ add() लेनदेन सुनिश्चित करता है कि Back दबाने पर HomeFragment पुनर्स्थापित हो। openDetail() वर्तमान Fragment को DetailFragment से तर्कों के साथ बदलता है। savedInstanceState == null की जाँच स्क्रीन घुमाव पर फ़्रैगमेंट डुप्लिकेशन को रोकती है।
रिएक्टिव UI अपडेट के लिए viewLifecycleOwner के साथ Fragment में Flow और StateFlow का उपयोग।
class SearchFragment : Fragment() {
private val viewModel: SearchViewModel by viewModels()
private var binding: FragmentSearchBinding? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentSearchBinding.inflate(inflater, container, false)
return binding!!.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding?.searchButton?.setOnClickListener {
viewModel.search(binding?.queryInput?.text.toString())
}
viewLifecycleOwner.lifecycleScope.launch {
viewModel.searchResults.collectLatest { results ->
Log.d("SearchFragment", "खोज परिणाम: ${results.size}")
}
}
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}
Fragment View तक पहुँचने के लिए View Binding का उपयोग करता है। viewLifecycleOwner.lifecycleScope.launch कोरूटीन View नष्ट होने पर स्वचालित रूप से रद्द हो जाती है। लीक रोकने के लिए onDestroyView में binding शून्य किया जाता है। StateFlow View पुनः निर्मित होने पर डेटा की ताज़गी सुनिश्चित करता है।
अक्सर पूछे जाने वाले प्रश्न
onCreateView Fragment का मूल View बनाता और लौटाता है। onViewCreated View बनने के तुरंत बाद कॉल किया जाता है, यह गारंटी देता है कि View पूरी तरह से आरंभीकृत और कॉन्फ़िगरेशन (findViewById, सब्सक्रिप्शन) के लिए तैयार है। Google अनुशंसा करता है कि onCreateView में केवल लेआउट इन्फ्लेट करें, और सभी UI कॉन्फ़िगरेशन onViewCreated में करें।
onDestroy — Fragment एक ऑब्जेक्ट के रूप में नष्ट होता है (ViewModel साफ़ होता है, कोरूटीन रद्द होते हैं)। onDetach अंतिम कॉलबैक है, जिसके बाद Fragment Activity से अलग हो जाता है। व्यावहारिक रूप से सभी संसाधन onDestroyView (View) और onDestroy (Fragment) में मुक्त किए जाने चाहिए। onDetach Activity के संदर्भ साफ़ करने के लिए है।
Fragment गायब हो जाता है यदि इसे BackStack में संरक्षण के साथ लेनदेन के माध्यम से FragmentManager में नहीं जोड़ा गया या यदि Activity onCreate में FragmentManager को पुनर्स्थापित नहीं करती है। समाधान: onCreate में savedInstanceState == null की जाँच के साथ supportFragmentManager.beginTransaction().add() के माध्यम से प्रोग्रामेटिक रूप से Fragment जोड़ें।
नहीं। Fragment हमेशा FragmentManager के माध्यम से Activity से जुड़ा होता है। स्क्रीन घुमाने पर भी, Activity पुनः निर्मित होती है और Fragment नई Activity से पुनः जुड़ जाता है। Activity के बाहर Fragment बनाना असंभव है — Fragment कंस्ट्रक्टर को सिस्टम पुनर्स्थापना के लिए खाली कंस्ट्रक्टर की आवश्यकता होती है।
नेस्टेड fragments दूसरे Fragment के अंदर Fragments हैं। इनका उपयोग जटिल स्क्रीन बनाने के लिए किया जाता है: टैब पैनल, टैब वाले पैनल, मास्टर-डिटेल। नेस्टेड fragments चाइल्ड FragmentManager (childFragmentManager) द्वारा प्रबंधित किए जाते हैं। Google प्रदर्शन समस्याओं से बचने के लिए 2 स्तरों से अधिक नेस्टिंग न करने की अनुशंसा करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें