Activity Lifecycle: এটি কী, Android-এ onCreate onStart onResume

লেখক: IT Sectr প্রকাশিত: 2026-03-03 পড়ার সময়: 12 মিনিট

Activity Lifecycle হল কলব্যাক পদ্ধতির একটি সেট যা Android Activity-র বিভিন্ন অবস্থার মধ্যে পরিবর্তনের সময় কল করে: সৃষ্টি, দৃশ্যমানতা, ইনপুট ফোকাস, আংশিক দৃশ্যমানতা হ্রাস, সম্পূর্ণ আড়াল এবং ধ্বংস। সিস্টেম অ্যাপ্লিকেশনের প্রতিটি স্ক্রিনের জীবনচক্র পরিচালনা করে, onCreate() কলের মুহূর্ত থেকে শুরু করে onDestroy() পর্যন্ত। এই অবস্থাগুলি বোঝা Android অ্যাপ্লিকেশনের স্থিতিশীল পরিচালনার জন্য একটি বাধ্যতামূলক প্রয়োজনীয়তা, কারণ পদ্ধতিগুলির মধ্যে পরিবর্তনের ভুল পরিচালনা মেমরি লিক, ব্যবহারকারী ডেটা হারানো এবং অপ্রত্যাশিত ক্র্যাশের দিকে পরিচালিত করে। Android আর্কিটেকচার সম্পর্কে আরও পড়ুন Android সম্পর্কে সাধারণ নিবন্ধে

মূল বিষয়

  • Activity Lifecycle — পদ্ধতিগুলির একটি কঠোরভাবে সংজ্ঞায়িত ক্রম: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • onCreate — একমাত্র বাধ্যতামূলক পদ্ধতি, Activity তৈরি করার সময় একবার কল করা হয়; এখানে UI এবং ডেটা আরম্ভ করা হয়
  • onResume — Activity অগ্রভাগে থাকে এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে; এটি স্ক্রিনের কার্যকরী অবস্থা
  • onPause / onStop — পটভূমিতে যাওয়ার সময়, Activity প্রথমে বিরতি দেয়, তারপর থামে; গুরুত্বপূর্ণ ডেটা onPause-এ সংরক্ষণ করা হয়
  • onSaveInstanceState — স্ক্রিন রোটেশন এবং সিস্টেম দ্বারা Activity পুনঃসৃষ্টির সময় UI অবস্থা সংরক্ষণের একটি প্রক্রিয়া
  • Fragment জীবনচক্র — Activity-র অনুরূপ, কিন্তু onAttach, onCreateView, onViewCreated, onDestroyView পদ্ধতি দ্বারা সম্পূরক
  • LifecycleObserver — Activity-তে পদ্ধতি ওভাররাইড না করে প্রতিক্রিয়াশীল অবস্থা ট্র্যাকিংয়ের জন্য Jetpack উপাদান

Activity Lifecycle কী

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

জীবনচক্র বোঝা প্রতিটি Android ডেভেলপারের জন্য অপরিহার্য, কারণ সিস্টেম মেমরি কম থাকলে যেকোনো মুহূর্তে Activity ধ্বংস করতে পারে — এবং অ্যাপ্লিকেশনকে তার অবস্থা সঠিকভাবে পুনরুদ্ধার করতে হয়। Google Android Vitals (2025) অনুসারে, যে অ্যাপ্লিকেশনগুলি onSaveInstanceState()-এ অবস্থা সংরক্ষণ পরিচালনা করে না, তারা Activity পুনঃসৃষ্টিতে 42% বেশি ক্র্যাশ দেখায়।

জীবনচক্রে ছয়টি প্রধান কলব্যাক পদ্ধতি অন্তর্ভুক্ত: onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()। অতিরিক্তভাবে onRestart() পদ্ধতি রয়েছে, যা onStart()-এর আগে কল করা হয় যখন Activity থামানো অবস্থা থেকে ফিরে আসে। প্রতিটি পদ্ধতির একটি কঠোরভাবে সংজ্ঞায়িত উদ্দেশ্য এবং সম্পাদনের সময় রয়েছে — সিস্টেম তাদের ক্রমান্বয়ে কল করে, এবং ডেভেলপার তার নিজস্ব যুক্তি বাস্তবায়নের জন্য যেকোনো পদ্ধতি ওভাররাইড করতে পারে।

চক্রটিকে তিনটি মূল পর্যায়ে ভাগ করা যায়: সম্পূর্ণ জীবনকাল (onCreate → onDestroy), দৃশ্যমান জীবনকাল (onStart → onStop) এবং অগ্রভাগের জীবনকাল (onResume → onPause)। এই তিনটি স্তর বোঝা আরম্ভকরণ এবং সম্পদ মুক্তির কোড সঠিকভাবে বিতরণ করতে সাহায্য করে।

Activity জীবনচক্রের পদ্ধতিগুলি

জীবনচক্রের প্রতিটি পদ্ধতি একটি কঠোরভাবে সংজ্ঞায়িত কাজ সম্পাদন করে। সিস্টেম তাদের একটি নির্দিষ্ট ক্রমে কল করে, এবং ডেভেলপারের শুধুমাত্র নির্দিষ্ট যুক্তির জন্য প্রয়োজনীয় পদ্ধতিগুলি ওভাররাইড করা উচিত। জীবনচক্রের পদ্ধতিগুলি সরাসরি কল করার সুপারিশ করা হয় না — এটি Android Runtime দ্বারা পরিচালিত হয়।

সাধারণ কল ক্রম

অ্যাপ্লিকেশন চালু করার সময় সাধারণ ক্রম: onCreate → onStart → onResume। পিছনের বোতাম চাপলে: onPause → onStop → onDestroy। ছোট করলে: onPause → onStop, তারপর ফিরে আসলে: onRestart → onStart → onResume।

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()
    }

    override fun onResume() {
        super.onResume()
    }

    override fun onPause() {
        super.onPause()
    }

    override fun onStop() {
        super.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onRestart() {
        super.onRestart()
    }
}

প্রতিটি ওভাররাইড করা পদ্ধতি অবশ্যই তার super সংস্করণ কল করবে — এটি ছাড়া, সিস্টেম সঠিকভাবে অবস্থা পরিবর্তন সম্পূর্ণ করতে পারে না। এই নিয়মটি Android Developers ডকুমেন্টেশনে প্রতিষ্ঠিত এবং Android Studio-র lint নিয়ম দ্বারা যাচাই করা হয়।

জীবনচক্রের তিনটি স্তর

প্রথম স্তর — সম্পূর্ণ জীবনকাল: onCreate এবং onDestroy-এর মধ্যে ব্যবধান। এখানে একবারের আরম্ভকরণ এবং বৈশ্বিক সম্পদের চূড়ান্ত মুক্তি সম্পাদিত হয়। দ্বিতীয় স্তর — দৃশ্যমান জীবনকাল: onStart এবং onStop-এর মধ্যে। Activity স্ক্রিনে দৃশ্যমান কিন্তু অন্য উইন্ডো দ্বারা আংশিকভাবে ঢাকা থাকতে পারে। তৃতীয় স্তর — অগ্রভাগের জীবনকাল: onResume এবং onPause-এর মধ্যে। Activity টাস্ক স্ট্যাকের শীর্ষে থাকে এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে।

onCreate — Activity তৈরি করা

onCreate() — Activity জীবনচক্রের প্রথম এবং একমাত্র বাধ্যতামূলক পদ্ধতি। এটি সিস্টেম দ্বারা Activity ইনস্ট্যান্স তৈরি করার সময় একবার কল করা হয়। এই পদ্ধতি একটি savedInstanceState: Bundle? প্যারামিটার গ্রহণ করে, যাতে পূর্বে সংরক্ষিত অবস্থা থাকে যদি Activity ধ্বংসের পরে পুনরায় তৈরি করা হয় — উদাহরণস্বরূপ, স্ক্রিন রোটেশনের সময়।

onCreate-এর ভিতরে নিম্নলিখিত কাজগুলি সম্পাদিত হয়: setContentView()-এর মাধ্যমে লেআউট রিসোর্স সহ ব্যবহারকারী ইন্টারফেস আরম্ভকরণ, findViewById()-এর মাধ্যমে View উপাদান বাঁধাই, RecyclerView এবং ViewPager-এর জন্য অ্যাডাপ্টার সেটআপ, savedInstanceState থেকে অবস্থা পুনরুদ্ধার, ViewModel এবং LiveData আরম্ভকরণ, ক্লিক এবং অঙ্গভঙ্গি শ্রোতা সেটআপ। পদ্ধতিটি যত তাড়াতাড়ি সম্ভব সম্পন্ন হওয়া উচিত — এখানে দীর্ঘ অপারেশন প্রথম ফ্রেমের রেন্ডারিং ব্লক করে, যা অ্যাপ্লিকেশন শুরুর সময় বাড়িয়ে দেয়।

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_profile)

    val userNameText: TextView = findViewById(R.id.user_name)
    val loadButton: Button = findViewById(R.id.load_button)

    if (savedInstanceState != null) {
        userNameText.text = savedInstanceState.getString("user_name")
    }

    loadButton.setOnClickListener {
        loadUserProfile()
    }
}

যদি Activity প্রথমবার তৈরি করা হয়, তাহলে savedInstanceState হয় null। স্ক্রিন রোটেশনের পর পুনঃসৃষ্টিতে, Bundle-এ onSaveInstanceState()-এ সংরক্ষিত ডেটা থাকে। null পরীক্ষা ব্যবহারকারীর প্রবেশ করানো ডেটা না হারিয়ে সঠিকভাবে UI পুনরুদ্ধারের জন্য মানক অভ্যাস।

onStart — স্ক্রিনে উপস্থিত হওয়া

onStart() onCreate()-এর পরপরই বা onRestart()-এর পরে কল করা হয়, যখন Activity ব্যবহারকারীর কাছে দৃশ্যমান হয়। এই অবস্থায়, Activity এখনও অগ্রভাগে নয় এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করতে পারে না, কিন্তু এর ব্যবহারকারী ইন্টারফেস ইতিমধ্যে স্ক্রিনে দৃশ্যমান। উদাহরণস্বরূপ, অ্যাপ্লিকেশন চালু করার সময়, সিস্টেম onStart এবং onResume কলের মধ্যে ইন্টারফেসের প্রথম ফ্রেম রেন্ডার করে।

onStart পদ্ধতিতে সাধারণত নিম্নলিখিত কাজগুলি সম্পাদিত হয়: অ্যানিমেশন শুরু করা যা Activity দৃশ্যমান থাকা পর্যন্ত চলা উচিত; ব্রডকাস্ট রিসিভার (BroadcastReceiver) বাঁধাই; ভূ-অবস্থান পরিষেবা এবং সেন্সরের সাথে সংযোগ; ViewModel বা Room থেকে ডেটা আপডেট করা। এখানে bindService()-এর মাধ্যমে Bound পরিষেবাগুলির সাথে বাঁধাইও করা হয় যদি অ্যাপ্লিকেশন প্রক্রিয়ার মধ্যে ক্লায়েন্ট-সার্ভার আর্কিটেকচার ব্যবহার করে।

kotlin
override fun onStart() {
    super.onStart()
    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER,
        5000L,
        10f,
        locationListener
    )
}

override fun onStop() {
    super.onStop()
    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    locationManager.removeUpdates(locationListener)
}

গুরুত্বপূর্ণ নিয়ম: onStart-এ সংযুক্ত সম্পদ onStop-এ মুক্ত করতে হবে। এটি নিশ্চিত করে যে যখন Activity স্ক্রিনে দৃশ্যমান না হয়, তখন এটি ব্যাটারি এবং সিস্টেম সম্পদ গ্রাস করে না। Google Play Store আপডেট মডারেশন করার সময় LocationListener এবং অন্যান্য সিস্টেম পরিষেবা লিকের জন্য অ্যাপ্লিকেশন পরীক্ষা করে।

onResume — ফোকাস অর্জন

onResume() — যে অবস্থায় Activity অগ্রভাগে থাকে এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করতে প্রস্তুত। এটি স্ক্রিনের কার্যকরী অবস্থা: সিস্টেম Activity-তে ইনপুট ফোকাস স্থানান্তর করে, এবং সমস্ত স্পর্শ ঘটনা, কীবোর্ড ইনপুট এবং অঙ্গভঙ্গি এই স্ক্রিনে নির্দেশিত হয়। onResume পদ্ধতি প্রতিবার কল করা হয় যখন Activity অগ্রভাগে ফিরে আসে — অন্য Activity শেষ হওয়ার পর, ডায়ালগ বক্স বন্ধ হওয়ার পর, বা ডিভাইস আনলক হওয়ার পর।

onResume-এ নিম্নলিখিত কাজ সম্পাদিত হয়: onPause-এ বিরতি দেওয়া অ্যানিমেশন পুনরায় শুরু করা; ক্যামেরা এবং অন্যান্য এক্সক্লুসিভ সম্পদ খোলা; সেন্সর শ্রোতা (অ্যাক্সেলেরোমিটার, জাইরোস্কোপ) নিবন্ধন; UI-র জন্য টাইমার এবং স্টপওয়াচ শুরু করা; বর্তমান ডেটা দিয়ে স্ক্রিনের বিষয়বস্তু আপডেট করা। onResume/onPause জোড়া সেই সম্পদের জন্য ব্যবহৃত হয় যা শুধুমাত্র ফোকাস থাকাকালীন সক্রিয় থাকা উচিত — উদাহরণস্বরূপ, অবিচ্ছিন্ন বক্তৃতা শনাক্তকরণ বা ভিডিও ক্যাপচার।

kotlin
override fun onResume() {
    super.onResume()
    cameraHolder.openCamera()
    animator.resume()
    sensorManager.registerListener(
        stepCounter,
        sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
        SensorManager.SENSOR_DELAY_NORMAL
    )
}

override fun onPause() {
    super.onPause()
    cameraHolder.closeCamera()
    animator.pause()
    sensorManager.unregisterListener(stepCounter)
}

onStart এবং onResume-এর মধ্যে পার্থক্য তাৎপর্যপূর্ণ: একটি Activity দৃশ্যমান (onStart) হতে পারে কিন্তু সক্রিয় (onResume) নয় — উদাহরণস্বরূপ, যখন তার উপরে একটি পপআপ ডায়ালগ বা স্বচ্ছ লক স্ক্রিন প্রদর্শিত হয়। এক্সক্লুসিভ সম্পদ যা এক্সক্লুসিভ অ্যাক্সেস প্রয়োজন, সেগুলি onResume-এ খোলা উচিত, onStart-এ নয়।

onPause — ফোকাস হারানো

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

onPause-এ নিম্নলিখিত কাজ সম্পাদিত হয়: ইমেল খসড়া এবং ইনপুট ফর্ম Room বা SharedPreferences-এ সংরক্ষণ; অ্যানিমেশন এবং ভিডিও প্লেব্যাক বন্ধ করা; ক্যামেরা বন্ধ করা এবং এক্সক্লুসিভ সম্পদ মুক্ত করা; পটভূমিতে অ-গুরুত্বপূর্ণ ব্যয়বহুল অপারেশন বাতিল করা। onPause পদ্ধতি 100 মিলিসেকেন্ডের কম সময়ে সম্পন্ন হওয়া উচিত — সিস্টেম onPause নিয়ন্ত্রণ ফিরিয়ে না দেওয়া পর্যন্ত পরবর্তী Activity-তে রূপান্তর ব্লক করে, এবং সীমা অতিক্রম করলে ANR (Application Not Responding) হয়।

kotlin
override fun onPause() {
    super.onPause()
    val editor = SharedPreferences.Manager ...
    editor.putString("draft_text", draftEditText.text.toString())
    editor.apply()
    videoView.pause()
    cameraHolder.release()
}

গুরুত্বপূর্ণ: onPause UI থ্রেডে সম্পাদিত হয়, তাই Room-এর মাধ্যমে সিঙ্ক্রোনাস কুয়েরি সহ ডেটাবেসে লেখার মতো যেকোনো ব্লকিং অপারেশন অ্যাসিঙ্ক্রোনাস (কোরুটিন) দ্বারা প্রতিস্থাপিত হওয়া উচিত বা পটভূমি থ্রেডে সম্পাদিত হওয়া উচিত। SharedPreferences-এর জন্য commit()-এর পরিবর্তে apply() ব্যবহার করুন — apply অ্যাসিঙ্ক্রোনাসভাবে ডেটা লেখে এবং UI থ্রেড ব্লক করে না।

onStop — স্ক্রিন থেকে আড়াল

onStop() কল করা হয় যখন Activity ব্যবহারকারীর কাছে দৃশ্যমান হওয়া বন্ধ করে। এটি নিম্নলিখিত ক্ষেত্রে ঘটে: Activity সম্পূর্ণরূপে অন্য Activity দ্বারা ঢাকা; ব্যবহারকারী হোম বোতাম চেপেছেন বা অন্য অ্যাপ্লিকেশনে স্যুইচ করেছেন; Activity শেষ হচ্ছে (পরে onDestroy কল করা হবে)। onStop অবস্থায়, Activity মেমরিতে থাকে এবং তার সমস্ত ফিল্ড ধরে রাখে — এটি ধ্বংস হয়নি, কিন্তু সক্রিয়ও নয়।

onStop-এ নিম্নলিখিত কাজ সম্পাদিত হয়: onStart-এ নিবন্ধিত BroadcastReceiver আননিবন্ধন; Bound পরিষেবা থেকে সংযোগ বিচ্ছিন্ন; LocationListener, SensorListener এবং অন্যান্য সিস্টেম শ্রোতা মুক্ত করা; দীর্ঘ পটভূমি অপারেশন বন্ধ করা যা অ্যাপ্লিকেশন আড়াল থাকলে প্রয়োজন হয় না; onSaveInstanceState()-এর মাধ্যমে Bundle-তে বর্তমান UI অবস্থা লেখা যদি এটি onPause-এ না করা হয়।

kotlin
override fun onStop() {
    super.onStop()
    unregisterReceiver(connectivityReceiver)
    unbindService(serviceConnection)
    if (isChangingConfigurations()) {
        Log.d("Lifecycle", "কনফিগারেশনের কারণে Activity পুনরায় তৈরি হয়")
    }
}

সিস্টেম মেমরি কম থাকলে onStop অবস্থায় Activity-কে onDestroy কল না করেই ধ্বংস করতে পারে। তাই সমস্ত গুরুত্বপূর্ণ ডেটা onStop-এ রূপান্তরের আগে সংরক্ষণ করতে হবে। isChangingConfigurations() ফ্ল্যাগ নির্ধারণ করতে দেয় যে onStop কল স্ক্রিন রোটেশনের সাথে সম্পর্কিত কিনা — এই ক্ষেত্রে, Activity পুনরায় তৈরি হবে, শেষ হবে না।

onDestroy — Activity ধ্বংস

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

kotlin
override fun onDestroy() {
    super.onDestroy()
    backgroundJob.cancel()
    dbHelper.close()
    if (isFinishing) {
        Log.d("Lifecycle", "Activity স্থায়ীভাবে শেষ হচ্ছে")
    } else {
        Log.d("Lifecycle", "Activity পুনরায় তৈরি হবে")
    }
}

গুরুত্বপূর্ণ নোট: onDestroy কলের গ্যারান্টি নেই যদি অ্যাপ্লিকেশন প্রক্রিয়া সিস্টেম দ্বারা নিহত হয় (out-of-memory kill)। তাই ডেটা সংরক্ষণের জন্য onDestroy-এর উপর নির্ভর করা যায় না — এই কাজটি onPause বা onStop-এ সমাধান করা হয়। isFinishing প্রপার্টি finish() দ্বারা Activity সমাপ্তি এবং কনফিগারেশন পরিবর্তনে পুনঃসৃষ্টির মধ্যে পার্থক্য করতে দেয়।

onRestart — থামানো অবস্থা থেকে ফিরে আসা

onRestart() onStart()-এর আগে কল করা হয় যখন Activity থামানো অবস্থা (onStop) থেকে অগ্রভাগে ফিরে আসে। এটি ঘটে যখন ব্যবহারকারী সাম্প্রতিক অ্যাপ্লিকেশন মেনু থেকে অ্যাপ্লিকেশন পুনরায় খোলে বা একটি চাইল্ড স্ক্রিনে পিছনে চেপে Activity-তে ফিরে আসে। onRestart পদ্ধতি onCreate থেকে ভিন্ন যুক্তি সম্পাদনের অনুমতি দেয় — উদাহরণস্বরূপ, Activity আড়াল থাকাকালীন পরিবর্তিত হতে পারে এমন ডেটা আপডেট করা।

kotlin
override fun onRestart() {
    super.onRestart()
    refreshDataFromNetwork()
    Log.d("Lifecycle", "Activity স্ট্যাক থেকে পুনরায় চালু হচ্ছে")
}

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

স্ক্রিন রোটেশন এবং অবস্থা সংরক্ষণ

স্ক্রিন রোটেশন Activity পুনঃসৃষ্টির সবচেয়ে সাধারণ পরিস্থিতি। ডিফল্টরূপে, Android প্রতিটি ওরিয়েন্টেশন পরিবর্তনে বর্তমান Activity ধ্বংস করে এবং একটি নতুন তৈরি করে। যদি অবস্থা সংরক্ষণ না করা হয়, ব্যবহারকারী সমস্ত প্রবেশ করানো ডেটা হারাবে। Android এর জন্য দুটি প্রক্রিয়া সরবরাহ করে: onSaveInstanceState() সিরিয়ালাইজযোগ্য ডেটার জন্য এবং ViewModel কনফিগারেশন পরিবর্তন থেকে বেঁচে থাকা ডেটার জন্য।

onSaveInstanceState এবং onRestoreInstanceState

অস্থায়ী অবস্থা সংরক্ষণের জন্য Activity ধ্বংসের আগে onSaveInstanceState() কল করা হয়। সংরক্ষিত ডেটা onCreate-এ savedInstanceState প্যারামিটারের মাধ্যমে এবং onRestoreInstanceState() পদ্ধতিতে পাস করা হয়, যা onStart-এর পরে কল করা হয়। Bundle-এর আকার সীমা রয়েছে — প্রায় 500 KB, তাই বড় ডেটা (যেমন বিটম্যাপ) ViewModel-এর মাধ্যমে সংরক্ষণ করা হয়।

xml
<!-- AndroidManifest.xml — ওরিয়েন্টেশন স্থিরকরণ -->
<activity android:name=".MainActivity"
    android:configChanges="orientation|screenSize" />

android:configChanges-এর মাধ্যমে ওরিয়েন্টেশন স্থির করা Activity পুনঃসৃষ্টি প্রতিরোধ করে, কিন্তু এটি অ্যান্টিপ্যাটার্ন হিসাবে বিবেচিত হয় যদি অ্যাপ্লিকেশনটির উভয় ওরিয়েন্টেশন সমর্থন করা প্রয়োজন। আধুনিক Google সুপারিশ হল UI-তে ব্যবহারকারীর প্রবেশ করানো ডেটার জন্য onSaveInstanceState-এর সাথে ViewModel ব্যবহার করা।

Fragment জীবনচক্র

Fragment-এর নিজস্ব জীবনচক্র রয়েছে, Activity-র অনুরূপ কিন্তু অতিরিক্ত পদ্ধতি সহ: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach। Fragment সর্বদা Activity-র ভিতরে বিদ্যমান, এবং এর জীবনচক্র কন্টেইনার Activity-র জীবনচক্রের সাথে আবদ্ধ। যদি Activity ধ্বংস হয়, Fragment তা অনুসরণ করে।

প্রধান পার্থক্য: Fragment শুধুমাত্র উপাদানের অবস্থা নয়, View শ্রেণিবিন্যাসও পরিচালনা করে। onCreateView পদ্ধতি Fragment-এর মূল View ফেরত দেয়, এবং onDestroyView এই শ্রেণিবিন্যাস ধ্বংস করে। এটি Fragment-কে স্ক্রিন রোটেশনের সময় Activity পুনঃসৃষ্টি থেকে বাঁচতে দেয়: Fragment সংরক্ষিত থাকে, এবং এর View onCreateView-এ পুনরায় তৈরি হয়।

kotlin
class ProfileFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.fragment_profile, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val avatarImage: ImageView = view.findViewById(R.id.avatar_image)
        loadAvatar(avatarImage)
    }
}

onCreate এবং onCreateView-এর মধ্যে পার্থক্য বোঝা অত্যন্ত গুরুত্বপূর্ণ: onCreate Fragment-এর জীবদ্দশায় একবার কল হয় (এমনকি View পুনরায় তৈরি হলেও), যেখানে onCreateView প্রতিবার কল হয় যখন Fragment তার View শ্রেণিবিন্যাস তৈরি বা পুনরায় তৈরি করে। ডেটা আরম্ভকরণ onCreate-এ সম্পাদিত হয়, যখন UI বাঁধাই onViewCreated-এ সম্পাদিত হয়।

LifecycleObserver এবং Jetpack

LifecycleObserver — Android Jetpack লাইব্রেরির একটি উপাদান যা Activity বা Fragment-এ পদ্ধতি ওভাররাইড না করে জীবনচক্র পরিবর্তনে প্রতিক্রিয়া জানাতে দেয়। প্রতিটি জীবনচক্র পদ্ধতিতে কোড নকল করার পরিবর্তে, ডেভেলপার @OnLifecycleEvent অ্যানোটেশন সহ একটি পৃথক শ্রেণি তৈরি করে এবং এটি lifecycle.addObserver()-এ পাস করে।

Jetpack LifecycleOwner ইন্টারফেসও সরবরাহ করে, যা AppCompatActivity এবং Fragment বাস্তবায়ন করে। যে কোনো অবজেক্ট যা LifecycleOwner বাস্তবায়ন করে, LiveData সাবস্ক্রিপশন, lifecycleScope-এর মাধ্যমে কোরুটিন এবং জীবনচক্রের সাথে সম্পর্কিত WorkManager পরিচালনা করতে পারে। এটি MVVM এবং Jetpack-ভিত্তিক আধুনিক Android আর্কিটেকচারের ভিত্তিপ্রস্তর।

kotlin
class MyLocationObserver(private val context: Context) : DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) {
        startLocationUpdates()
    }

    override fun onStop(owner: LifecycleOwner) {
        stopLocationUpdates()
    }
}

// Activity-তে:
lifecycle.addObserver(MyLocationObserver(this))

DefaultLifecycleObserver ব্যবহার পরীক্ষা সহজ করে, কোড নকল হ্রাস করে এবং বিভিন্ন স্ক্রিনে জীবনচক্রের যুক্তি পুনর্ব্যবহারযোগ্য করে তোলে। এটি প্রতিটি Activity-তে ম্যানুয়ালি onStart/onStop ওভাররাইড করার আধুনিক বিকল্প। IT Sectr-এর তৈরি Android অ্যাপ্লিকেশনে, আমরা ভূ-অবস্থান, Bluetooth স্ক্যানিং এবং বিশ্লেষণের জন্য LifecycleObserver প্রয়োগ করি — এটি boilerplate কোডের পরিমাণ 30–40% হ্রাস করে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

জীবনচক্র পদ্ধতিতে super না কল করলে কী হবে?

যদি super.onCreate() বা অন্য কোনো super জীবনচক্র পদ্ধতি কল না করা হয়, সিস্টেম SuperNotCalledException ছুঁড়বে এবং অ্যাপ্লিকেশন ক্র্যাশ হবে। এটি Android Runtime-এর একটি কঠোর প্রয়োজনীয়তা — প্রতিটি পদ্ধতিকে বেস ক্লাসে সম্পাদন অর্পণ করতে হবে, অন্যথায় অভ্যন্তরীণ অবস্থা মেশিন পরবর্তী অবস্থায় রূপান্তর করতে পারে না।

স্ক্রিন ঘোরালে Activity পুনরায় তৈরি হয় কেন?

স্ক্রিন ঘোরালে Activity পুনরায় তৈরি হয় কারণ ওরিয়েন্টেশন পরিবর্তন একটি ডিভাইস কনফিগারেশন পরিবর্তন। ডিফল্টরূপে, Android বিকল্প সংস্থান (layout-land, values-land) লোড করার জন্য Activity ধ্বংস করে এবং একটি নতুন তৈরি করে। পুনঃসৃষ্টি অক্ষম করতে, ম্যানিফেস্টে android:configChanges বৈশিষ্ট্য যোগ করা যেতে পারে, কিন্তু Google ডেটা সংরক্ষণের জন্য ViewModel ব্যবহার করার পরামর্শ দেয়।

অ্যাপ্লিকেশন বন্ধ করার আগে কোন পদ্ধতিতে ডেটা সংরক্ষণ করা উচিত?

গুরুত্বপূর্ণ ডেটা onPause()-এ সংরক্ষণ করা হয়, কারণ এটি শেষ পদ্ধতি যা সিস্টেম দ্বারা অ্যাপ্লিকেশন নিহত হওয়ার আগে কল করার গ্যারান্টিযুক্ত। onStop এবং onDestroy-এর পরে, সিস্টেম অতিরিক্ত পদ্ধতি কল না করেই প্রক্রিয়া শেষ করতে পারে। খসড়া এবং মধ্যবর্তী ডেটার জন্য, apply() সহ SharedPreferences বা কোরুটিন সহ Room ব্যবহার করুন।

onPause এবং onStop-এর মধ্যে পার্থক্য কী?

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

ViewModel কী এবং এটি জীবনচক্রের সাথে কীভাবে সম্পর্কিত?

ViewModel একটি Android Jetpack উপাদান যা UI ডেটা সংরক্ষণ করে এবং স্বয়ংক্রিয়ভাবে কনফিগারেশন পরিবর্তন (স্ক্রিন রোটেশন) থেকে বেঁচে যায়। Activity পুনঃসৃষ্টিতে ViewModel ধ্বংস হয় না: এটি ততক্ষণ বেঁচে থাকে যতক্ষণ না LifecycleOwner (Activity বা Fragment) সম্পূর্ণরূপে শেষ হয়। এটি Bundle এবং onSaveInstanceState ব্যবহার না করেই স্ক্রিন রোটেশনের সময় ডেটা সংরক্ষণের সমস্যা সমাধান করে। ViewModel Google-এর সুপারিশকৃত MVVM আর্কিটেকচারের একটি বাধ্যতামূলক উপাদান।

সারসংক্ষেপ

  • Activity Lifecycle — পদ্ধতিগুলির একটি ক্রম onCreate, onStart, onResume, onPause, onStop, onDestroy, প্রতিটি স্ক্রিন পরিচালনার একটি নির্দিষ্ট ধাপের জন্য দায়ী
  • onCreate — UI আরম্ভকরণ এবং পুনঃসৃষ্টিতে savedInstanceState প্রাপ্তি; একমাত্র বাধ্যতামূলক পদ্ধতি
  • onStart / onStop — দৃশ্যমানতা পরিচালনার জন্য জোড়া: সিস্টেম শ্রোতা এবং পরিষেবা নিবন্ধন ও মুক্তি
  • onResume / onPause — ফোকাস পরিচালনার জন্য জোড়া: এক্সক্লুসিভ সম্পদ (ক্যামেরা, সেন্সর) onResume-এ খোলা হয় এবং onPause-এ বন্ধ করা হয়
  • স্ক্রিন রোটেশন — ডিফল্টরূপে Activity পুনরায় তৈরি করে; onSaveInstanceState + ViewModel-এর মাধ্যমে অবস্থা সংরক্ষণ মানক অভ্যাস
  • Fragment জীবনচক্র — onAttach, onCreateView, onViewCreated, onDestroyView, onDetach পদ্ধতি দ্বারা সম্পূরক; View Fragment থেকে আলাদাভাবে তৈরি এবং ধ্বংস হয়
  • LifecycleObserver — Activity-তে কোড নকল না করে প্রতিক্রিয়াশীল জীবনচক্র ট্র্যাকিংয়ের জন্য Jetpack উপাদান
  • ViewModel — কনফিগারেশন পরিবর্তন থেকে বেঁচে থাকে এবং Bundle-তে ম্যানুয়াল সংরক্ষণ ছাড়াই স্ক্রিন রোটেশনের সময় ডেটা হারানোর সমস্যা সমাধান করে
  • Super নিয়ম — প্রতিটি ওভাররাইড করা জীবনচক্র পদ্ধতি তার super সংস্করণ কল করতে হবে, অন্যথায় সিস্টেম SuperNotCalledException ছুঁড়বে

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন