মূল পয়েন্ট
App Lifecycle একটি সীমিত অবস্থা মেশিন যা একটি মোবাইল অ্যাপ্লিকেশনের সমস্ত সম্ভাব্য অবস্থা এবং তাদের মধ্যে স্থানান্তর বর্ণনা করে। প্রতিটি অবস্থা নির্ধারণ করে যে অ্যাপটি কোড নির্বাহ করতে, UI প্রদর্শন করতে এবং রিসোর্স ব্যবহার করতে পারে কিনা। iOS এবং Android-এর মডেল একই রকম কিন্তু অভিন্ন নয় — পার্থক্যগুলি OS আর্কিটেকচারের কারণে: iOS কঠোর মেমরি নিয়ন্ত্রণ ব্যবহার করে (suspended অবস্থা), যখন Android onSaveInstanceState-এর মাধ্যমে নমনীয় প্রক্রিয়া ব্যবস্থাপনা ব্যবহার করে।
iOS-এ, জীবনচক্র ফোরগ্রাউন্ড/ব্যাকগ্রাউন্ডের সাথে দৃঢ়ভাবে সংযুক্ত: অ্যাপটি হয় সক্রিয় অথবা স্থগিত। Android-এ, জীবনচক্র আরও দানাদার — একটি Activity/উইন্ডো 6+ অবস্থার মধ্য দিয়ে যায়, এবং প্রক্রিয়াটির নিজেই ProcessLifecycleOwner-এর মাধ্যমে একটি অতিরিক্ত জীবনচক্র থাকে। আধুনিক অ্যাপ্লিকেশন (2024 থেকে) ক্রমবর্ধমানভাবে জীবনচক্র-ভিত্তিক আর্কিটেকচার প্যাটার্ন ব্যবহার করছে: SwiftUI Lifecycle (iOS 16+) .scenePhase পরিবেশের মাধ্যমে, Compose Lifecycle LifecycleEventObserver-এর মাধ্যমে। এই প্যাটার্নগুলি স্বয়ংক্রিয়ভাবে প্রসঙ্গ পরিবর্তন পরিচালনা করে এবং মেমরি লিক প্রতিরোধ করে। Google-এর মতে, Android-এ সঠিক জীবনচক্র ব্যবস্থাপনা পটভূমির কাজের সময় মেমরি খরচ 30–40 % হ্রাস করে।
iOS-এ, অ্যাপ জীবনচক্র UIApplicationDelegate ক্লাস (AppDelegate) এর মাধ্যমে পরিচালিত হয়। প্রধান পদ্ধতিগুলি: application(_:didFinishLaunchingWithOptions:) — প্রথম লঞ্চে আরম্ভ; applicationDidBecomeActive — অ্যাপ দৃশ্যমান এবং মিথস্ক্রিয়ার জন্য প্রস্তুত; applicationWillResignActive — নিষ্ক্রিয় অবস্থায় স্থানান্তর (আগত কল, নোটিফিকেশন শেড বন্ধ করা); applicationDidEnterBackground — অ্যাপ লুকানো, ডেটা সংরক্ষণের জন্য ~5 সেকেন্ড; applicationWillEnterForeground — পটভূমি থেকে ফিরে আসা; applicationWillTerminate — সমাপ্তি (শুধুমাত্র পুরানো অ্যাপের জন্য suspended ছাড়া কল করা হয়)।
iOS 13 থেকে শুরু করে, Apple iPad এবং macOS Catalyst-এ মাল্টি-উইন্ডো অ্যাপ্লিকেশন সমর্থন করার জন্য SceneDelegate (UISceneDelegate) চালু করেছে। SceneDelegate প্রতিটি পৃথক দৃশ্য (উইন্ডো) এর জীবনচক্র পরিচালনা করে: scene(_:willConnectTo:options:) — দৃশ্য তৈরি; sceneDidBecomeActive — দৃশ্য সক্রিয়; sceneWillResignActive — দৃশ্য ফোকাস হারায়; sceneDidEnterBackground — দৃশ্য লুকানো। AppDelegate বিশ্বব্যাপী ইভেন্ট (ডেটা লোডিং, পুশ নোটিফিকেশন) পরিচালনা করে, যখন SceneDelegate প্রতিটি উইন্ডোর UI অবস্থা পরিচালনা করে। SwiftUI-তে, জীবনচক্র @Environment(\.scenePhase): .active, .inactive, .background পরিবেশ মানের মাধ্যমে পরিচালিত হয় — এটি SwiftUI এবং UIKit অ্যাপ্লিকেশন উভয়ের জন্য একটি ঐক্যবদ্ধ API প্রদান করে।
Android-এ, জীবনচক্র Application ক্লাস দিয়ে শুরু হয় — একটি সিঙ্গলটন যা যেকোনো Activity-র আগে তৈরি হয়। Application.onCreate() পদ্ধতি হল প্রথম প্রবেশ বিন্দু, বিশ্বব্যাপী আরম্ভের জন্য ব্যবহৃত (Analytics, DI, Crash Reporting)। এর পরে, Activity ক্রম সহ লঞ্চ হয়: onCreate() → onStart() → onResume()। মিনিমাইজ করলে: onPause() → onStop() → onSaveInstanceState()। ধ্বংস করলে: onDestroy()। ফিরে আসলে: onRestart() → onStart() → onResume()।
ProcessLifecycleOwner (AndroidX Lifecycle 2.2+ থেকে) পুরো প্রক্রিয়ার জীবনচক্র ট্র্যাক করে, একটি পৃথক Activity নয়। এটি দুটি অবস্থা প্রদান করে: ON_RESUME (অ্যাপ ফোরগ্রাউন্ডে) এবং ON_STOP (অ্যাপ লুকানো)। ProcessLifecycleOwner প্রক্রিয়া স্তরে «অ্যাপ কখন পটভূমিতে গেল» সমস্যা সমাধান করে — এটি SDK, লাইব্রেরি এবং মডুলার অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ। Jetpack Compose-এ, জীবনচক্র LifecycleEventObserver এবং collectAsStateWithLifecycle-এর মাধ্যমে পরিচালিত হয়, যা পটভূমি মোডে স্বয়ংক্রিয়ভাবে ডেটা সংগ্রহ স্থগিত করে। Android 14 (API 34) Service.onTimeout-এর মাধ্যমে ফোরগ্রাউন্ড সার্ভিস জীবনচক্র বিজ্ঞপ্তি যোগ করেছে — সার্ভিসটি 6 ঘন্টার মধ্যে সম্পূর্ণ হতে হবে, অন্যথায় সিস্টেম এটি জোর করে বন্ধ করে দেয়।
| iOS | Android | বিবরণ |
|---|---|---|
| Not Running | — | অ্যাপ চালু হয়নি |
| didFinishLaunching | Application.onCreate | লঞ্চে প্রথম আরম্ভ |
| Active | onResume | অ্যাপ দৃশ্যমান এবং ইনপুট গ্রহণ করছে |
| Inactive | onPause | অস্থায়ী ফোকাস হ্রাস (কল, নোটিফিকেশন শেড) |
| Background | onStop | অ্যাপ লুকানো, কোড কার্যকর হতে পারে |
| Suspended | — | কোড নির্বাহ হচ্ছে না, মেমরি সংরক্ষিত |
| Will Terminate | onDestroy | অ্যাপ সমাপ্ত হচ্ছে |
প্রধান পার্থক্য: iOS পটভূমিতে প্রবেশের 5-10 সেকেন্ড পরে অ্যাপকে জোর করে Suspended (কোড নির্বাহ বন্ধ) এ স্থানান্তর করে। Android দীর্ঘ সময়ের জন্য পটভূমির কাজ (সার্ভিস, WorkManager) অনুমতি দেয়, কিন্তু Doze Mode (Android 6+) এবং পটভূমি বিধিনিষেধ (Android 12+) এর সীমাবদ্ধতা সহ। Android-এ ProcessLifecycleOwner iOS-এ UIApplicationDidEnterBackgroundNotification-এর সমতুল্য, এই পার্থক্যের সাথে যে এটি পটভূমিতে যেকোনো স্থানান্তরে সক্রিয় হয়, শুধু ফোকাস হারানোর পরে নয়।
সমস্ত জীবনচক্র অবস্থা পরিচালনা করে একটি মৌলিক AppDelegate বাস্তবায়ন। পটভূমিতে যাওয়ার সময় ডেটা সংরক্ষণ এবং ফিরে আসার সময় UI আপডেট করা।
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
Analytics.shared.initialize()
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
NotificationCenter.default.post(name: .appDidBecomeActive, object: nil)
}
func applicationWillResignActive(_ application: UIApplication) {
NotificationCenter.default.post(name: .appWillResignActive, object: nil)
}
func applicationDidEnterBackground(_ application: UIApplication) {
CoreDataManager.shared.saveContext()
UserDefaults.standard.synchronize()
}
func applicationWillEnterForeground(_ application: UIApplication) {
NetworkManager.shared.refreshSession()
}
}
AppDelegate কেন্দ্রীয় জীবনচক্র বিন্দু। applicationDidEnterBackground একটি গুরুত্বপূর্ণ পদ্ধতি: iOS সংরক্ষণের জন্য ~5 সেকেন্ড দেয়। applicationDidBecomeActive — UI আপডেট করুন, অ্যানিমেশন পুনরায় শুরু করুন। SceneDelegate (iOS 13+) এর জন্য, জীবনচক্র যুক্তি দৃশ্যগুলিতে বিতরণ করা হয়: sceneDidBecomeActive / sceneDidEnterBackground পৃথক উইন্ডো পরিচালনা করে।
মাল্টি-উইন্ডো iPad অ্যাপ্লিকেশনের জন্য SceneDelegate। প্রতিটি দৃশ্যের নিজস্ব জীবনচক্র রয়েছে, অন্যান্য উইন্ডো থেকে স্বাধীন।
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
}
func sceneDidBecomeActive(_ scene: UIScene) {
PlayerManager.shared.resume()
}
func sceneDidEnterBackground(_ scene: UIScene) {
PlayerManager.shared.pause()
CoreDataManager.shared.saveContext()
}
func sceneDidDisconnect(_ scene: UIScene) {
PlayerManager.shared.cleanup()
}
}
SceneDelegate একটি পৃথক দৃশ্যের জীবনচক্র পরিচালনা করে। sceneDidBecomeActive / sceneDidEnterBackground একটি নির্দিষ্ট উইন্ডোর জন্য AppDelegate পদ্ধতির সমতুল্য। sceneDidDisconnect দৃশ্য বন্ধ হলে কল করা হয় (ব্যবহারকারী iPad-এ একটি উইন্ডো বন্ধ করেছে)। iOS 12 এবং নীচের সাথে সামঞ্জস্যের জন্য, AppDelegate-কে SceneDelegate যুক্তি নকল করতে হবে। iOS 17+-এ, আপনি scenePhase-এর উপর ভিত্তি করে কার্যগুলি স্বয়ংক্রিয়ভাবে বিরাম/পুনরায় শুরু করতে @Observable ব্যবহার করতে পারেন।
ProcessLifecycleOwner ট্র্যাক করে কখন অ্যাপ প্রক্রিয়া স্তরে ফোরগ্রাউন্ড/ব্যাকগ্রাউন্ডে থাকে। এটি বিশ্বব্যাপী জীবনচক্র ব্যবস্থাপনার জন্য সর্বোত্তম পদ্ধতি।
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
}
class AppLifecycleObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
Analytics.shared.onForeground()
NetworkMonitor.shared.start()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
Analytics.shared.onBackground()
NetworkMonitor.shared.stop()
}
}
ProcessLifecycleOwner অ্যাপ স্তরে পটভূমিতে স্থানান্তর ট্র্যাক করার একমাত্র সঠিক উপায়। ON_START সক্রিয় হয় যখন অ্যাপ দৃশ্যমান হয় (ফোরগ্রাউন্ড), ON_STOP — যখন সম্পূর্ণ লুকানো থাকে (ব্যাকগ্রাউন্ড)। Activity জীবনচক্রের বিপরীতে, ProcessLifecycleOwner একটি নির্দিষ্ট স্ক্রিনের সাথে আবদ্ধ নয়। Jetpack Compose-এর জন্য, ম্যানুয়াল পর্যবেক্ষণের পরিবর্তে LifecycleResumeEffect বা collectAsStateWithLifecycle ব্যবহার করুন।
ViewModel + Lifecycle জীবনচক্র ব্যবস্থাপনার জন্য সঠিক Android আর্কিটেকচার। ViewModel স্বয়ংক্রিয়ভাবে onDestroy-এ পরিষ্কার হয়ে যায়, লিক প্রতিরোধ করে।
import androidx.lifecycle.ViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
class TimerViewModel : ViewModel() {
private val _time = MutableLiveData<Long>()
val time: LiveData<Long> = _time
private var startTime = System.currentTimeMillis()
init {
updateTime()
}
private fun updateTime() {
_time.value = System.currentTimeMillis() - startTime
}
override fun onCleared() {
super.onCleared()
Logger.d("ViewModel cleared — রিসোর্স মুক্ত করা হচ্ছে")
}
}
// Activity-তে
class TimerActivity : AppCompatActivity() {
private val viewModel: TimerViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Logger.d("Activity created")
}
override fun onResume() {
super.onResume()
viewModel.time.observe(this) { Logger.d("Time: $it") }
}
override fun onPause() {
super.onPause()
Logger.d("Activity paused — অ্যানিমেশন বিরাম দেওয়া হচ্ছে")
}
override fun onDestroy() {
super.onDestroy()
Logger.d("Activity destroyed — পরিষ্কার")
}
}
ViewModel স্ক্রিন রোটেশন থেকে বেঁচে থাকে এবং শুধুমাত্র Activity শেষ হলে ধ্বংস হয়। onCleared() হল রিসোর্স মুক্ত এবং স্ট্রিম থেকে সাবস্ক্রিপশন অপসারণের স্থান। LiveData স্বয়ংক্রিয়ভাবে onPause-এ পর্যবেক্ষণ বিরাম দেয় এবং onResume-এ পুনরায় শুরু করে — এটি পটভূমির কাজের সময় লিক এবং ক্র্যাশ থেকে সুরক্ষা প্রদান করে। Compose-এ, একই উদ্দেশ্যে collectAsStateWithLifecycle() ব্যবহার করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
মিনিমাইজ করলে, অ্যাপ সক্রিয় থেকে নিষ্ক্রিয় (সংক্ষেপে), তারপর পটভূমিতে চলে যায়। কয়েক সেকেন্ড পরে, সিস্টেম এটিকে suspended-এ স্থানান্তর করতে পারে — কোড নির্বাহ বন্ধ, মেমরি সংরক্ষিত। মেমরি কম হলে, সিস্টেম স্থগিত অ্যাপ শেষ করে (willTerminate কল করা হয় না)। applicationDidEnterBackground-এ আপনার ডেটা সংরক্ষণ করুন — এটি সংরক্ষণের জন্য শেষ নিশ্চিত বিন্দু।
ন্যূনতম বাধ্যতামূলক: applicationDidEnterBackground — ব্যবহারকারী ডেটা সংরক্ষণ; applicationWillEnterForeground — UI আপডেট; Android-এ onPause — অ্যানিমেশন/সেন্সর বিরাম। ProcessLifecycleOwner পরিচালনা সহজ করে: onResume — onPause ফোরগ্রাউন্ডের জন্য, onStart — onStop দৃশ্যমানতার জন্য। প্রয়োজন অনুসারে অন্যান্য অবস্থা পরিচালনা করুন — সমস্ত অবস্থা প্রতিটি অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ নয়।
AppDelegate পুরো অ্যাপ্লিকেশনের বিশ্বব্যাপী ডেলিগেট (লঞ্চ, পটভূমি স্থানান্তর)। SceneDelegate (iOS 13+) একটি পৃথক উইন্ডো (দৃশ্য) এর জীবনচক্র পরিচালনা করে — মাল্টি-উইন্ডো iPad অ্যাপ্লিকেশনে, প্রতিটি দৃশ্যের নিজস্ব জীবনচক্র রয়েছে। iOS 12 এবং নীচের জন্য, সমস্ত জীবনচক্র AppDelegate-এর মাধ্যমে পরিচালিত হয়। iPadOS 16+ এর সাথে, Stage Manager-এর জন্য SceneDelegate বাধ্যতামূলক।
ProcessLifecycleOwner AndroidX Lifecycle-এর একটি কম্পোনেন্ট যা পুরো অ্যাপ্লিকেশন (প্রক্রিয়া) এর জীবনচক্র ট্র্যাক করে, একটি পৃথক Activity নয়। এটি দুটি প্রধান ইভেন্ট প্রদান করে: ON_RESUME (অ্যাপ ফোরগ্রাউন্ডে) এবং ON_STOP (অ্যাপ ব্যাকগ্রাউন্ডে)। এটি SDK, বিশ্লেষণ, নেটওয়ার্ক মনিটরগুলির আরম্ভ/পরিষ্কারের জন্য ব্যবহৃত হয় — যা কিছু বর্তমান স্ক্রীন নির্বিশেষে, অ্যাপের পটভূমিতে স্থানান্তরে প্রতিক্রিয়া জানাতে হবে।
Jetpack Compose-এ, LocalLifecycleOwner.current.lifecycle বা collectAsStateWithLifecycle() ফাংশনের মাধ্যমে LifecycleEventObserver ব্যবহার করুন। Compose স্ক্রিনের জন্য, LifecycleResumeEffect ব্যবহার করুন — DisposableEffect-এর মতো, যা onResume-এ চলে এবং onPause-এ পরিষ্কার হয়। lifecycleScope.launchWhenResumed — একটি করুটিন যা পটভূমিতে স্বয়ংক্রিয়ভাবে স্থগিত হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।