Suspended — এটি কী, iOS ব্যাকগ্রাউন্ডে অ্যাপ ফ্রিজ

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

Suspended — iOS অ্যাপ্লিকেশন লাইফসাইকেলের একটি স্থগিত অবস্থা যেখানে অ্যাপটি মেমরিতে ফ্রিজ করা থাকে কিন্তু কোড এক্সিকিউট করে না। আমরা দেখাই Suspended কীভাবে কাজ করে, ব্যাকগ্রাউন্ডে অ্যাপ ফ্রিজ হওয়ার ঝুঁকিগুলি কী, iOS কীভাবে Suspended অ্যাপ আনলোড পরিচালনা করে এবং Suspended থেকে ফিরে আসার পর নির্বিঘ্ন পুনরুদ্ধারের জন্য state restoration কীভাবে বাস্তবায়ন করবেন।

মূল বিষয়

  • Suspended — অ্যাপ মেমরিতে ফ্রিজ করা, কোড এক্সিকিউট হয় না, UI স্ট্যাক সংরক্ষিত থাকে
  • iOS Suspended — একটি অনন্য অবস্থা যা Android-এ নেই; প্রক্রিয়াটি বিদ্যমান কিন্তু সক্রিয় নয়
  • আনলোড — মেমরি কম হলে Suspended অ্যাপগুলি প্রথমে সরানো হয়, মেমরির ডেটা হারিয়ে যায়
  • State Restoration — আনলোডের পর UI স্ট্যাক সংরক্ষণ এবং পুনরুদ্ধারের জন্য iOS প্রক্রিয়া
  • didEnterBackground — শেষ মেথড যা Suspended-এর আগে নিশ্চিতভাবে কল করা হয়

Suspended — এই অবস্থাটি কী

Suspended হল iOS অ্যাপ্লিকেশন লাইফসাইকেলের একটি অবস্থা যেখানে অ্যাপটি ডিভাইসের RAM-এ থাকে কিন্তু কোনো কোড এক্সিকিউট করে না। এটি সম্পূর্ণ সমাপ্তির আগের চূড়ান্ত অবস্থা: অ্যাপটি ব্যাকগ্রাউন্ডের সমস্ত কাজ শেষ করার পর বা টাইমআউট শেষ হওয়ার পর Background থেকে Suspended-এ রূপান্তরিত হয়। Suspended-এ, অ্যাপ্লিকেশনটি সম্পূর্ণরূপে ফ্রিজ থাকে — সমস্ত থ্রেড থামানো থাকে, টাইমার কাজ করে না, এবং কোনো নেটওয়ার্ক কার্যকলাপ থাকে না।

Suspended হল iOS-এর একটি অনন্য বৈশিষ্ট্য, যা সাধারণ Android লাইফসাইকেলে অনুপস্থিত। কারণটি ভিন্ন প্রক্রিয়া ব্যবস্থাপনা আর্কিটেকচারে নিহিত। iOS অ্যাপের চিত্র মেমরিতে সংরক্ষণ করে (ডেস্কটপ হাইबरनेশনের মতো) যাতে ব্যবহারকারী ফিরে আসলে কোল্ড স্টার্ট ছাড়াই ইন্টারফেসটি তৎক্ষণাৎ পুনরুদ্ধার করা যায়। Android-এ Suspended নেই — একটি প্রক্রিয়া হয় বিদ্যমান এবং কোড এক্সিকিউট করতে পারে (Background) অথবা সমাপ্ত (Not Running), যদিও Android LMK-এর মাধ্যমে থ্রেড এক্সিকিউশন থামাতে পারে।

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

সিস্টেম কীভাবে Suspended পরিচালনা করে

iOS সমস্ত অ্যাপ্লিকেশনের অবস্থা ট্র্যাক করে এবং উপলব্ধ মেমরির উপর ভিত্তি করে Suspended অ্যাপ আনলোড করার সিদ্ধান্ত নেয়। মেমরি কম হলে, সিস্টেম Suspended অ্যাপগুলি আনলোড করা শুরু করে, যেগুলি এই অবস্থায় সবচেয়ে বেশি সময় ধরে আছে সেগুলি থেকে শুরু করে। যদি মেমরি এখনও অপর্যাপ্ত হয়, সিস্টেম অ্যাপগুলিকে Background এবং Inactive থেকে Suspended-এ পরবর্তী আনলোডের সাথে রূপান্তরিত করে। এই প্রক্রিয়াটি ব্যবহারকারীর কাছে সম্পূর্ণ স্বচ্ছ — তারা কেবল App Switcher-এ অ্যাপ আইকন দেখতে পায়, যা ট্যাপ করলে কোল্ড স্টার্ট শুরু হয়।

বৈশিষ্ট্যSuspended (iOS)Background (iOS)Background (Android)
কোড এক্সিকিউট করেনাহ্যাঁ (সীমিত)হ্যাঁ (সীমিত)
মেমরিতেহ্যাঁহ্যাঁহ্যাঁ
CPU খরচ0%কমকম
হট স্টার্টহ্যাঁ — তাৎক্ষণিক পুনরুদ্ধারহ্যাঁ — Inactive-এর মাধ্যমেনা — প্রক্রিয়া নিহত হতে পারে
টাইমআউটনা — ঘন্টার পর ঘন্টা মেমরিতে থাকতে পারে~30 সেকেন্ড (beginBackgroundTask-এর পর)API সংস্করণের উপর নির্ভর করে
সিস্টেম দ্বারা আনলোডমেমরি কম হলেগুরুতর মেমরি সংকটেLMK (Low Memory Killer)
কাজে ফিরে আসাApp Switcher থেকে — তাৎক্ষণিকApp Switcher থেকে — Inactive-এর মাধ্যমেকোল্ড স্টার্ট
State Restorationসুপারিশকৃতপ্রয়োজন নেইSavedStateHandle

iOS-এ Suspended: ফ্রিজিং প্রক্রিয়া

iOS-এ, সমস্ত ব্যাকগ্রাউন্ড কাজ শেষ করার পর Suspended স্বয়ংক্রিয়ভাবে পৌঁছে যায়। সিস্টেম applicationDidEnterBackground কল করে, beginBackgroundTask এক্সিকিউট করার সময় দেয় (প্রায় 30 সেকেন্ড), তারপর জোর করে সমস্ত থ্রেড থামায় এবং অ্যাপকে Suspended-এ রূপান্তরিত করে। মেমরির বস্তুগুলি সংরক্ষিত থাকে, কিন্তু কোনো কোড এক্সিকিউট হয় না — অ্যাপ্লিকেশনটি তার বর্তমান অবস্থায় ফ্রিজ থাকে।

একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়: applicationDidEnterBackground হল শেষ মেথড যা Suspended-এর আগে নিশ্চিতভাবে কল করা হয়। এর পরে, অ্যাপ মেমরি আনলোড সম্পর্কে কোনো বিজ্ঞপ্তি পায় না। যদি ব্যবহারকারী বা সিস্টেম Suspended অবস্থায় অ্যাপটি বন্ধ করে দেয়, তাহলে applicationWillTerminate বা applicationDidEnterBackground আবার কল করা হয় না। তাই সমস্ত ডেটা সংরক্ষণ applicationDidEnterBackground-এ হওয়া উচিত, applicationWillTerminate-এ নয়।

swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    // Suspended-এর আগে শেষ নিশ্চিত কল
    func applicationDidEnterBackground(_ application: UIApplication) {
        // মেমরি আনলোড থেকে বাঁচতে যা যা দরকার সব সংরক্ষণ করুন
        savePersistentState()
        saveNavigationStack()

        // প্রয়োজন হলে অতিরিক্ত সময় অনুরোধ করুন
        let task = application.beginBackgroundTask {
            application.endBackgroundTask(task)
        }
    }

    // Suspended থেকে ফেরা — হট স্টার্ট
    func applicationWillEnterForeground(_ application: UIApplication) {
        // অ্যাপ Suspended-এ ছিল, কাজ পুনরায় শুরু
        print("Suspended বা Background থেকে ফেরা")
    }

    // মেমরি আনলোডের পর সম্পূর্ণ পুনরুদ্ধার
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // যদি এটি Suspended থেকে আনলোডের পর কোল্ড স্টার্ট হয় —
        // state restoration পুনরুদ্ধার করুন
        return true
    }

    private func savePersistentState() {
        UserDefaults.standard.set(Date(), forKey: "lastActiveDate")
    }

    private func saveNavigationStack() {
        guard let rootVC = window?.rootViewController else { return }
        // বর্তমান নেভিগেশন স্ট্যাক সংরক্ষণ করুন
        if let navController = rootVC as? UINavigationController {
            let vcClasses = navController.viewControllers.map { type(of: $0) }
            UserDefaults.standard.set(vcClasses.map { NSStringFromClass($0) }, forKey: "navStack")
        }
    }
}

কোডটি iOS-এ Suspended-এর অত্যন্ত গুরুত্বপূর্ণ হ্যান্ডলিং দেখায়। applicationDidEnterBackground হল শেষ নিশ্চিত কল। সমস্ত ডেটা সংরক্ষণ এখানে হওয়া উচিত: ব্যবহারকারীর অবস্থা, নেভিগেশন স্ট্যাক, খসড়া, টাইমার। applicationWillEnterForeground Suspended বা Background থেকে ফিরে আসার সময় কল করা হয়। didFinishLaunchingWithOptions — শুধুমাত্র কোল্ড স্টার্টে, যখন অ্যাপটি Suspended-এর পর মেমরি থেকে আনলোড করা হয়েছিল।

Android-এ Suspended — কি কোনো অ্যানালগ আছে

Android-এ, iOS Suspended-এর কোনো সরাসরি অ্যানালগ নেই। Android এক্সিকিউশন কনটেক্সট সংরক্ষণ করে অ্যাপগুলিকে মেমরিতে ফ্রিজ করে না। পরিবর্তে, Android হয় প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে রাখে অথবা এটি শেষ করে। তবে, Android 11+ (API 30)-এ App Freezer নামে একটি প্রক্রিয়া চালু করা হয়েছে, যা SIGSTOP সিগন্যাল ব্যবহার করে ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির এক্সিকিউশন থামায়। এটি কার্যকরীভাবে Suspended-এর মতো, কিন্তু গুরুত্বপূর্ণ পার্থক্য সহ।

App Freezer Android মেমরি ব্যবস্থাপনা সিস্টেমের অংশ। যখন একটি অ্যাপ সক্রিয় বিজ্ঞপ্তি ছাড়া দীর্ঘ সময় ব্যাকগ্রাউন্ডে থাকে, সিস্টেম এটিকে SIGSTOP পাঠায়, সমস্ত থ্রেড থামিয়ে দেয়। যখন অ্যাপ ফোরগ্রাউন্ডে ফিরে আসে, SIGCONT পাঠানো হয় এবং এক্সিকিউশন পুনরায় শুরু হয়। iOS থেকে মূল পার্থক্য: App Freezer অবস্থা সংরক্ষণের গ্যারান্টি দেয় না — ফ্রিজিং-এর সময় প্রক্রিয়া নিহত হলে মেমরির ডেটা হারিয়ে যেতে পারে।

Android-এ, যেকোনো প্রক্রিয়া সমাপ্তির সময় স্বয়ংক্রিয় অবস্থা সংরক্ষণের জন্য ViewModel-এ SavedStateHandle ব্যবহার করার সুপারিশ করা হয়। SavedStateHandle onSaveInstanceState-এর মাধ্যমে Bundle-এ ডেটা সংরক্ষণ করে, যা App Freezer এবং Process Death উভয় থেকেই বেঁচে যায়। iOS-এর বিপরীতে, যেখানে Suspended থেকে আনলোড একটি ব্যতিক্রমী পরিস্থিতি, Android-এ Process Death একটি সাধারণ আচরণ যা সর্বদা প্রত্যাশিত হওয়া উচিত।

kotlin
// SavedStateHandle — Android-এ Process Death থেকে রক্ষা
class CheckoutViewModel(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    // অবস্থা যা App Freezer-এর পরও প্রক্রিয়া থেকে বেঁচে থাকে
    var currentStep: MutableLiveData<Int> =
        savedStateHandle.getLiveData("checkout_step", 1)

    var cartItems: MutableLiveData<List<CartItem>> =
        savedStateHandle.getLiveData("cart_items", emptyList())

    fun proceedToNextStep() {
        currentStep.value = (currentStep.value ?: 0) + 1
    }

    fun addToCart(item: CartItem) {
        val updatedList = (cartItems.value ?: emptyList()) + item
        cartItems.value = updatedList
        savedStateHandle["cart_items"] = updatedList
    }
}

// App Freezer-এর ক্ষেত্রে onStop-এ সংরক্ষণ করুন
class MainActivity : AppCompatActivity() {

    override fun onStop() {
        super.onStop()
        // ডেটা সংরক্ষণ করুন যা ফ্রিজিং থেকে বাঁচতে হবে
        saveDraftData()
        // হিমায়িত অবস্থায় প্রয়োজন নেই এমন রিসোর্স মুক্ত করুন
        releaseHeavyResources()
        // সতর্ক করুন যে অ্যাপ হিমায়িত হবে
        // (ডিবাগিংয়ের জন্য লগিং)
        Log.d("Lifecycle", "Activity stopped — সম্ভাব্য App Freeze")
    }
}

কোডটি Android-এ Suspended অ্যানালগ পরিচালনার পদ্ধতি দেখায়। ViewModel-এ SavedStateHandle Process Death-এর সময় স্বয়ংক্রিয়ভাবে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করে। onStop সম্ভাব্য App Freezer বা প্রক্রিয়া সমাপ্তির আগে শেষ নিশ্চিত ইভেন্ট। চেকআউট ফর্মের অবস্থা, কার্টের আইটেম তালিকা — এই সমস্ত ডেটা SavedStateHandle-এর কারণে ফ্রিজিং থেকে বেঁচে যায়। ভারী রিসোর্সের (বিটম্যাপ, DB কার্সার) জন্য, onStop হল মেমরি মুক্ত করার জায়গা।

State Restoration: Suspended-এর পর পুনরুদ্ধার

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

State Restoration UIViewControllerRestoration এবং UIStateRestoring প্রোটোকলের মাধ্যমে কাজ করে। ডেভেলপার প্রতিটি ViewController এবং View-এ restorationIdentifier নির্ধারণ করে যা তারা পুনরুদ্ধার করতে চায়। ব্যাকগ্রাউন্ডে যাওয়ার সময়, iOS এই বস্তুগুলির অবস্থা এনকোড করে। আনলোডের পর ফিরে আসার সময়, iOS নতুন বস্তু তৈরি করে এবং সংরক্ষিত অবস্থা ডিকোড করে। State restoration ছাড়া, ব্যবহারকারী কোল্ড স্টার্টের পর একটি ফাঁকা স্ক্রিন দেখতে পাবেন যেখানে তিনি ছেড়েছিলেন তার পরিবর্তে।

swift
import UIKit

class DetailViewController: UIViewController {

    var itemID: String = ""
    var scrollPosition: CGPoint = .zero

    override func viewDidLoad() {
        super.viewDidLoad()
        restorationIdentifier = "DetailViewController"
        restorationClass = type(of: self)
    }

    override func encodeRestorableState(with coder: NSCoder) {
        super.encodeRestorableState(with: coder)
        coder.encode(itemID, forKey: "itemID")
        coder.encode(scrollPosition, forKey: "scrollPosition")
    }

    override func decodeRestorableState(with coder: NSCoder) {
        super.decodeRestorableState(with: coder)
        if let savedID = coder.decodeObject(forKey: "itemID") as? String {
            itemID = savedID
            loadItem()
        }
        if let savedPosition = coder.decodeCGPoint(forKey: "scrollPosition") {
            scrollPosition = savedPosition
            // ডেটা লোড করার পর অবস্থান পুনরুদ্ধার করুন
        }
    }
}

// AppDelegate — State Restoration সক্রিয় করা
func application(
    _ application: UIApplication,
    shouldSaveSecureApplicationState coder: NSCoder
) -> Bool {
    return true
}

func application(
    _ application: UIApplication,
    shouldRestoreSecureApplicationState coder: NSCoder
) -> Bool {
    return true
}

কোডটি iOS-এ State Restoration-এর বাস্তবায়ন দেখায়। প্রতিটি পুনরুদ্ধারযোগ্য ViewController-এর জন্য restorationIdentifier এবং restorationClass প্রয়োজন। encodeRestorableState/decodeRestorableState NSCoder-এর মাধ্যমে ডেটা সংরক্ষণ এবং লোড করে। AppDelegate-এ, shouldSaveSecureApplicationState এবং shouldRestoreSecureApplicationState এনক্রিপ্টেড অবস্থা সংরক্ষণ সক্ষম করে। iOS 12+-এ, ডেটা সুরক্ষার জন্য নিরাপদ এনকোডিং (NSSecureCoding) ব্যবহার করার সুপারিশ করা হয়।

Suspended নিয়ে কাজ করার সেরা অভ্যাস

প্রথম নিয়ম — কখনও ধরে নেবেন না যে অ্যাপ Suspended থেকে ফিরে আসবে। সিস্টেম যেকোনো মুহূর্তে অ্যাপ আনলোড করতে পারে। সমস্ত অত্যন্ত গুরুত্বপূর্ণ ডেটা Suspended-এ রূপান্তরের আগে স্থায়ী স্টোরেজে সংরক্ষণ করা উচিত — অর্থাৎ applicationDidEnterBackground বা onStop-এ। UserDefaults, Core Data, File Manager — উপযুক্ত স্টোরেজ বিকল্প। মেমরি (ভেরিয়েবল, প্রপার্টি) এমন ডেটার জন্য অবিশ্বস্ত স্টোরেজ যা Suspended থেকে বেঁচে থাকা উচিত।

দ্বিতীয় নিয়ম — Suspended-এর আগে রিসোর্স মুক্ত করুন। ফাইল ডেসক্রিপ্টর বন্ধ করুন, GPU মেমরি (Metal, Core Graphics) মুক্ত করুন, নেটওয়ার্ক সংযোগ বন্ধ করুন। যদিও অ্যাপ Suspended-এ CPU খরচ করে না, ধরে রাখা রিসোর্স অন্যান্য অ্যাপ্লিকেশনের জন্য ব্লক করা থাকে। iOS-এ, Suspended-এ খোলা সকেট রাখা যাবে না — Suspended থেকে ফিরে আসার সময় সেগুলি অকার্যকর হতে পারে, যার ফলে ত্রুটি হয়।

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

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

swift
import UIKit

// পরীক্ষা: অ্যাপটি কি মেমরি থেকে আনলোড করা হয়েছিল?
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    // সংরক্ষিত অবস্থা আছে কিনা পরীক্ষা করুন
    if UserDefaults.standard.object(forKey: "navStack") != nil {
        // অ্যাপটি Suspended থেকে আনলোড করা হয়েছিল
        // অবস্থা পুনরুদ্ধার করতে হবে
        restoreNavigationStack()
    } else {
        // Not Running থেকে পরিষ্কার কোল্ড স্টার্ট
        showOnboardingIfNeeded()
    }
    return true
}

private func restoreNavigationStack() {
    guard let savedStack = UserDefaults.standard.array(forKey: "navStack") as? [String],
          let navController = window?.rootViewController as? UINavigationController
    else { return }

    for vcClassName in savedStack {
        if let vcClass = NSClassFromString(vcClassName) as? UIViewController.Type {
            let vc = vcClass.init()
            navController.pushViewController(vc, animated: false)
        }
    }
}

কোডটি নির্ধারণ করার অভ্যাস দেখায় যে অ্যাপটি Suspended থেকে আনলোড করা হয়েছিল কিনা। সংরক্ষিত নেভিগেশন স্ট্যাকের উপস্থিতির জন্য UserDefaults পরীক্ষা আনলোডের পর কোল্ড স্টার্টকে পরিষ্কার কোল্ড স্টার্ট থেকে আলাদা করতে দেয়। প্রথম ক্ষেত্রে, নেভিগেশন স্ট্যাক পুনরুদ্ধার করা হয়; দ্বিতীয়টিতে, অনবোর্ডিং বা প্রধান স্ক্রিন দেখানো হয়। এই পদ্ধতিটি এমন ক্ষেত্রে অন্তর্নির্মিত State Restoration-কে পরিপূরক করে যেখানে NSCoder অপর্যাপ্ত।

সচরাচর জিজ্ঞাসা

একটি অ্যাপ কতক্ষণ Suspended-এ থাকতে পারে?

অসীম — কয়েক সেকেন্ড থেকে কয়েক দিন পর্যন্ত। iOS-এর Suspended-এর জন্য কোনো টাইমআউট নেই। অ্যাপটি ততক্ষণ মেমরিতে থাকবে যতক্ষণ না সিস্টেম রিসোর্সের অভাবে এটি আনলোড করার সিদ্ধান্ত নেয়। ব্যবহারিকভাবে, অ্যাপগুলি ডিভাইসের RAM এবং সক্রিয় অ্যাপের সংখ্যার উপর নির্ভর করে 15 মিনিট থেকে কয়েক ঘন্টা Suspended-এ থাকে।

Suspended থেকে আনলোڈ করার সময় applicationWillTerminate কি কল করা হয়?

না। Suspended থেকে অ্যাপ আনলোড করার সময় applicationWillTerminate কল করা হয় না। সিস্টেম অ্যাপকে না জানিয়েই মেমরি মুক্ত করে। এটি আরেকটি কারণ যে সমস্ত ডেটা সংরক্ষণ applicationDidEnterBackground-এ হওয়া উচিত। applicationWillTerminate কেবল তখন কল করা হয় যখন ব্যবহারকারী App Switcher থেকে অ্যাপটি সোয়াইপ করে ম্যানুয়ালি বন্ধ করে।

Android-এর কি Suspended-এর অ্যানালগ আছে?

কোনো সরাসরি অ্যানালগ নেই। Android 11+-এ, App Freezer চালু করা হয়েছে, যা SIGSTOP-এর মাধ্যমে ব্যাকগ্রাউন্ড প্রক্রিয়া থামায় — এটি কার্যকরীভাবে Suspended-এর মতো। তবে, Android অ্যাপগুলি যেকোনো মুহূর্তে Process Death ধরে নিয়ে ডিজাইন করা উচিত। অবস্থা সংরক্ষণের জন্য ViewModel-এ SavedStateHandle এবং onSaveInstanceState ব্যবহার করুন যা App Freezer এবং Process Death উভয় থেকেই বেঁচে থাকবে।

কীভাবে পরীক্ষা করবেন অ্যাপটি Suspended-এ ছিল কিনা?

iOS-এ পরীক্ষার জন্য কোনো সরাসরি API নেই। একটি পরোক্ষ পদ্ধতি: didFinishLaunchingWithOptions-এ সংরক্ষিত অবস্থার উপস্থিতির জন্য UserDefaults পরীক্ষা করুন। যদি অবস্থা থাকে — অ্যাপটি Suspended থেকে আনলোড করা হয়েছিল এবং কোল্ড স্টার্ট করছে। যদি অবস্থা না থাকে — পরিষ্কার কোল্ড স্টার্ট। SwiftUI-তে, scenePhase.background-এ একটি ফ্ল্যাগ সংরক্ষণ করা যেতে পারে এবং পরবর্তী লঞ্চে পরীক্ষা করা যেতে পারে।

Suspended-এর প্রসঙ্গে স্ন্যাপশট কী?

Suspended-এ রূপান্তর করার সময়, iOS একটি স্ন্যাপশট নেয় — বর্তমান অ্যাপ UI-এর স্ক্রিনশট। এই স্ক্রিনশটটি App Switcher-এ এবং অ্যাপে ফিরে আসার সময় (“গলানো” অ্যানিমেশন হিসাবে) দেখানো হয়। যদি অ্যাপটিতে গোপনীয় ডেটা থাকে, স্ন্যাপশট এটি প্রকাশ করতে পারে। সুরক্ষার জন্য, UIApplication.shouldSnapshotSecureApp (iOS 16+) ব্যবহার করুন বা applicationDidEnterBackground-এ ব্লার ওভারলে প্রয়োগ করুন।

সারসংক্ষেপ

  • Suspended — অ্যাপ iOS মেমরিতে ফ্রিজ করা, কোড এক্সিকিউট হয় না, তবে তাৎক্ষণিক পুনরুদ্ধারের জন্য UI স্ট্যাক সংরক্ষিত থাকে
  • iOS স্বতন্ত্রতা — Suspended Android-এ নেই; Android আংশিক অ্যানালগ হিসাবে App Freezer (SIGSTOP) ব্যবহার করে
  • আনলোড — সিস্টেম মেমরি কম হলে কোনো বিজ্ঞপ্তি ছাড়াই Suspended অ্যাপগুলিকে প্রথম অগ্রাধিকার হিসাবে আনলোড করে
  • সংরক্ষণ — applicationDidEnterBackground শেষ নিশ্চিত মেথড; সমস্ত ডেটা এখানে সংরক্ষণ করা উচিত
  • State Restoration — Suspended থেকে আনলোডের পর স্বয়ংক্রিয় UI পুনরুদ্ধারের জন্য NSCoder-ভিত্তিক প্রক্রিয়া
  • Android বিকল্প — Process Death থেকে বাঁচতে SavedStateHandle + onSaveInstanceState
  • স্ন্যাপশট — iOS Suspended-এর সময় স্ক্রিনশট নেয়; গোপনীয় ডেটা ব্লার ওভারলে বা নিরাপদ স্ন্যাপশটের মাধ্যমে লুকানো উচিত

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

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

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

আরও পড়ুন