Active — iOS অ্যাপ্লিকেশনের জীবনচক্রের সক্রিয় অবস্থা, যেখানে এটি অগ্রভাগে থাকে, স্পর্শ ইভেন্ট গ্রহণ করে এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে। আসুন জেনে নিই Active অবস্থা কীভাবে কাজ করে, UIApplicationDelegate-এর কোন মেথডগুলি এর জন্য দায়ী এবং Swift-এ Active ও Inactive-এর মধ্যে ট্রানজিশন সঠিকভাবে কীভাবে পরিচালনা করতে হয়।
মূল বিষয়
Active — মোবাইল অ্যাপ্লিকেশনের জীবনচক্রের এমন একটি অবস্থা, যেখানে এটি অগ্রভাগে থাকে, ডিভাইসের স্ক্রিনে প্রদর্শিত হয় এবং ব্যবহারকারীর সাথে সক্রিয়ভাবে ইন্টারঅ্যাক্ট করে। এই অবস্থায় অ্যাপ্লিকেশন সমস্ত স্পর্শ ইভেন্ট, কী প্রেস, অ্যাক্সেলেরোমিটার এবং গাইরোস্কোপ ডেটা গ্রহণ করে, সেইসাথে ইন্টারফেস রেন্ডার করার জন্য গ্রাফিক্স প্রসেসরে সম্পূর্ণ অ্যাক্সেস পায়।
iOS-এ Active অবস্থা হল পাঁচ-অবস্থার জীবনচক্র মডেলের একটি অংশ: Not Running → Inactive → Active → Inactive → Background → Suspended → Not Running। Android-এ এর অ্যানালগ হল onResume কলের পরে Activity-র অবস্থা, যখন Activity স্ট্যাকের শীর্ষে থাকে এবং ব্যবহারকারীর ইনপুট গ্রহণ করে। Active হল একমাত্র অবস্থা যেখানে UI সম্পূর্ণ ইন্টারঅ্যাকটিভ এবংジェスチャ, স্ক্রোল, প্রেস এবং অ্যানিমেশনে সাড়া দেয়।
সিস্টেম Active-এ অ্যাপ্লিকেশনকে প্রসেসর এবং র্যামে সর্বোচ্চ অগ্রাধিকার প্রদান করে। এর অর্থ হল সিস্টেম রিসোর্সের অভাব হলে এই জাতীয় অ্যাপ্লিকেশন শেষ করবে না — প্রথমে ব্যাকগ্রাউন্ড এবং স্থগিত প্রক্রিয়াগুলি আনলোড করা হবে। তবে অ্যাপ্লিকেশনকে ব্যাটারি নিষ্কাশন না করতে এবং CPU থ্রটলিং না ঘটাতে দক্ষতার সাথে রিসোর্স ব্যবহার করা উচিত।
ব্যবহারকারীর জন্য Active হল অ্যাপ্লিকেশনের সাথে কাজ করার স্বাভাবিক অবস্থা। ব্যবহারকারী ইন্টারফেস দেখতে পায়, বোতাম টিপতে পারে, ফর্ম পূরণ করতে পারে, ফিড স্ক্রোল করতে পারে। এই অবস্থার যেকোনো বিঘ্ন (কল, নোটিফিকেশন, Control Center-এর জন্য উপরে সোয়াইপ) অ্যাপ্লিকেশনকে Inactive-এ নিয়ে যায়, তারপর এটি Active-এ ফিরে আসতে পারে বা Background-এ চলে যেতে পারে।
iOS অবস্থা পরিচালনার জন্য UIApplicationMain ব্যবহার করে। Active-এ রূপান্তরের সময় সিস্টেম applicationDidBecomeActive কল করে। SwiftUI-এর জন্য অনুরূপ প্রক্রিয়া — Environment-এর মাধ্যমে scenePhase পর্যবেক্ষণ। Android অগ্রভাগে Activity-র কার্যকলাপের সূচক হিসাবে onResume ব্যবহার করে। উভয় পদ্ধতিই নিশ্চিত করে যে অ্যাপ্লিকেশন অবস্থা পরিবর্তনের বিজ্ঞপ্তি পায় এবং তার আচরণ অভিযোজিত করতে পারে।
| প্ল্যাটফর্ম | মেথড/ইভেন্ট | Swift (UIKit) | SwiftUI | Android (Kotlin) |
|---|---|---|---|---|
| iOS | Active-এ রূপান্তর | applicationDidBecomeActive | scenePhase == .active | — |
| iOS | Active থেকে প্রস্থান | applicationWillResignActive | scenePhase == .inactive | — |
| Android | Active-এ রূপান্তর | — | — | onResume() |
| Android | Active থেকে প্রস্থান | — | — | onPause() |
iOS-এ Active অবস্থা UIApplicationDelegate-এর মাধ্যমে পরিচালিত হয়। প্রধান মেথড — applicationDidBecomeActive(_:)। এটি অ্যাপ্লিকেশনের প্রথম লঞ্চে এবং Inactive থেকে ফিরে আসার সময় কল করা হয়। এই মেথডটি Inactive-এ যাওয়ার সময় স্থগিত করা কাজগুলি পুনরায় শুরু করার জন্য আদর্শ জায়গা: অ্যানিমেশন শুরু করা, টাইমার পুনরায় চালু করা, সেন্সর পুনরায় চালু করা, সার্ভারে ডেটা আপডেট পরীক্ষা করা।
iOS 13 থেকে Apple iPad-এ একাধিক উইন্ডো সমর্থনের জন্য UISceneDelegate চালু করেছে। এই ক্ষেত্রে applicationDidBecomeActive প্রতিটি পৃথক সিনার জন্য sceneDidBecomeActive দ্বারা প্রতিস্থাপিত হয়। শুধুমাত্র একটি স্ক্রিন সমর্থনকারী অ্যাপ্লিকেশনগুলি UIApplicationDelegate ব্যবহার চালিয়ে যেতে পারে। উভয় পদ্ধতিই সেই মুহূর্তে কল করা হয় যখন অ্যাপ্লিকেশন বা সিনা সক্রিয় হয়।
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
// অ্যাপ্লিকেশন সক্রিয় হয়েছে — কাজ পুনরায় শুরু করছি
func applicationDidBecomeActive(_ application: UIApplication) {
resumeAnimations()
restartTimers()
refreshDataIfNeeded()
startObservingSensors()
}
// অ্যাপ্লিকেশন সক্রিয়তা হারাচ্ছে — স্থগিত করছি
func applicationWillResignActive(_ application: UIApplication) {
pauseAnimations()
stopTimers()
saveDraftData()
}
private func resumeAnimations() {
UIView.animate(withDuration: 0.3) {
// UI অ্যানিমেশন পুনরায় শুরু
}
}
private func refreshDataIfNeeded() {
let lastRefresh = UserDefaults.standard.object(forKey: "lastRefresh") as? Date ?? .distantPast
if Date().timeIntervalSince(lastRefresh) > 300 {
fetchDataFromServer()
}
}
}কোডে UIKit-এ Active-এর সঠিক পরিচালনা দেখানো হয়েছে। applicationDidBecomeActive অ্যানিমেশন, টাইমার পুনরায় শুরু করে এবং ডেটা আপডেট প্রয়োজন কিনা তা পরীক্ষা করে। applicationWillResignActive রিসোর্স ব্যবহার করতে পারে এমন সবকিছু স্থগিত করে এবং খসড়া সংরক্ষণ করে। এই ধরনের মেথড জুটি নিশ্চিত করে যে অ্যাপ্লিকেশন অবস্থা পরিবর্তনে সঠিকভাবে প্রতিক্রিয়া জানায়।
SwiftUI-তে AppDelegate নেই — অবস্থা পরিচালনা Environment<ScenePhase>-এর মাধ্যমে ঘটে। .active মান নির্ধারিত হয় যখন সিনা অগ্রভাগে এবং ইন্টারঅ্যাকটিভ থাকে। SwiftUI Active-এ ফিরে আসার সময় স্বয়ংক্রিয়ভাবে অ্যানিমেশন এবং আপডেট পুনরায় শুরু করে। ডেভেলপারকে শুধুমাত্র onChange-এ সাবস্ক্রাইব করতে হবে পার্শ্ব প্রতিক্রিয়া সম্পাদনের জন্য।
import SwiftUI
@main
struct ActiveDemoApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { oldPhase, newPhase in
switch newPhase {
case .active:
print("সিনা সক্রিয় হয়েছে")
resumeWork()
case .inactive:
print("সিনা নিষ্ক্রিয় হয়েছে")
pauseWork()
case .background:
print("সিনা ব্যাকগ্রাউন্ডে চলে গেছে")
saveState()
@unknown default:
break
}
}
}
private func resumeWork() {
// Network-অনুরোধ, অ্যানিমেশন পুনরায় শুরু
}
private func pauseWork() {
// সময়-সংবেদনশীল কাজ স্থগিত
}
private func saveState() {
// অ্যাপ্লিকেশনের অবস্থা সংরক্ষণ
}
}SwiftUI-তে scenePhase — অ্যাপ্লিকেশনের অবস্থা সম্পর্কে একমাত্র সত্যের উৎস। onChange প্রতিটি রূপান্তরে ক্রিয়া সম্পাদনের অনুমতি দেয়। এটি মনে রাখা গুরুত্বপূর্ণ যে scenePhase শুধুমাত্র iOS 14+ এবং SwiftUI Lifecycle-এ উপলব্ধ। UIKit অ্যাপ্লিকেশনগুলির জন্য SwiftUI স্ক্রিন সহ UIApplicationDelegate পদ্ধতি ব্যবহার করুন।
Active বিভিন্ন পথে অর্জিত হয়। প্রথম এবং সুস্পষ্ট — কোল্ড স্টার্ট: ব্যবহারকারী আইকনে ক্লিক করে, অ্যাপ্লিকেশন Not Running থেকে Inactive হয়ে Active-এ যায়। দ্বিতীয় — ব্যাকগ্রাউন্ড থেকে ফিরে আসা: ব্যবহারকারী App Switcher-এর মাধ্যমে অ্যাপ্লিকেশনে ফিরে আসে, অ্যাপ্লিকেশন Inactive-এর মধ্য দিয়ে যায় এবং Active হয়। তৃতীয় — অস্থায়ী বিঘ্ন থেকে ফিরে আসা: ব্যবহারকারী কল শেষ করে, Control Center বন্ধ করে বা নোটিফিকেশনে সাড়া দেয় — অ্যাপ্লিকেশন Inactive থেকে Active-এ ফিরে আসে।
Not Running → Inactive → Active — কোল্ড স্টার্ট। Background → Inactive → Active — ব্যাকগ্রাউন্ড থেকে ফিরে আসা। Inactive → Active — অস্থায়ী বিঘ্ন থেকে ফিরে আসা। প্রতিটি ক্ষেত্রে applicationDidBecomeActive কল করা হয়, কিন্তু প্রসঙ্গ ভিন্ন হতে পারে। কোল্ড স্টার্টে Active-এর আগে didFinishLaunchingWithOptions কল করা হয়, ব্যাকগ্রাউন্ড থেকে ফিরে আসার সময় — willEnterForeground। ডেভেলপার অবস্থা পুনরুদ্ধারের কৌশল নির্বাচনের জন্য এই পার্থক্যগুলি ব্যবহার করতে পারেন।
| পরিস্থিতি | রূপান্তর পথ | iOS কলব্যাক | Android কলব্যাক |
|---|---|---|---|
| কোল্ড স্টার্ট | Not Running → Active | didFinishLaunching → didBecomeActive | onCreate → onStart → onResume |
| ব্যাকগ্রাউন্ড থেকে ফিরে আসা | Background → Active | willEnterForeground → didBecomeActive | onRestart → onStart → onResume |
| Suspended থেকে ফিরে আসা | Suspended → Active | willEnterForeground → didBecomeActive | onRestart → onStart → onResume |
| বিঘ্নের পরে | Inactive → Active | didBecomeActive | onResume |
গুরুত্বপূর্ণ নোট: Suspended থেকে ফিরে আসার সময় iOS didFinishLaunchingWithOptions কল করে না, কারণ অ্যাপ্লিকেশন ইতিমধ্যে মেমরিতে লোড করা ছিল। এর অর্থ হল এই মেথডে রাখা ইনিশিয়ালাইজেশন কোড পুনরায় executed হয় না। ডেভেলপাররা প্রায়ই এটি ভুলে যান এবং উভয় পরিস্থিতির জন্য applicationWillEnterForeground বা applicationDidBecomeActive-এ গুরুত্বপূর্ণ লজিক স্থানান্তর করেন।
Android-এ Active-এর অ্যানালগ হল onResume() কলের পরে Activity-র অবস্থা। Activity তখন সক্রিয় বলে বিবেচিত হয় যখন এটি অগ্রভাগে থাকে এবং ব্যবহারকারীর ইনপুট গ্রহণ করে। এই অবস্থাটি Activity-স্ট্যাকের শীর্ষের সাথে সম্পর্কিত। যদি অন্য কোন Activity উপরে দেখা যায় (এমনকি আংশিকভাবে), বর্তমান Activity onPause অবস্থায় চলে যায় — iOS Inactive-এর অ্যানালগ।
Android-এর মূল পার্থক্য — multi-window মোডে (split screen, freeform) একাধিক Activity একই সাথে সক্রিয় হতে পারে। এই ক্ষেত্রে, ব্যবহারকারী যার সাথে ইন্টারঅ্যাক্ট করছে সেই Activity সক্রিয় বলে বিবেচিত হয়, এবং পাশেরটি স্থগিত (onPause) হয়। iOS iPhone-এ multi-window সমর্থন করে না, শুধুমাত্র iPad-এ UIScene-এর মাধ্যমে।
class MainActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
// অ্যাপ্লিকেশন সক্রিয় হয়েছে — কাজ পুনরায় শুরু করছি
resumeCameraPreview()
startLocationUpdates()
activateSensors()
}
override fun onPause() {
super.onPause()
// অ্যাপ্লিকেশন সক্রিয়তা হারাচ্ছে — রিসোর্স মুক্ত করছি
releaseCamera()
stopLocationUpdates()
deactivateSensors()
}
private fun resumeCameraPreview() {
// ক্যামেরা প্রিভিউ শুরু (অনুমতি প্রয়োজন)
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this,
cameraSelector,
preview,
imageAnalyzer
)
}
private fun startLocationUpdates() {
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY, 5000
).build()
locationClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
}কোডে Android-এ onResume/onPause-এর মাধ্যমে Active পরিচালনা দেখানো হয়েছে। onResume ক্যামেরা, জিওলোকেশন এবং সেন্সরগুলির সাথে কাজ পুনরায় শুরু করে — রিসোর্স যা কেবল তখনই সক্রিয় হওয়া উচিত যখন অ্যাপ্লিকেশন ব্যবহারকারীর কাছে দৃশ্যমান। onPause ব্যাটারি নষ্ট না করার জন্য এই রিসোর্সগুলি মুক্ত করে। CameraX lifecycle-aware API onPause-এ স্বয়ংক্রিয়ভাবে প্রিভিউ স্থগিত করে।
প্রথম নিয়ম — applicationDidBecomeActive বা onResume-এ ভারী অপারেশন সম্পাদন করবেন না। ডেটা লোড করা, JSON পার্সিং, ডেটাবেসের সাথে কাজ — এই সবগুলি অ্যাসিঙ্ক্রোনাস হওয়া উচিত এবং প্রধান থ্রেড ব্লক করা উচিত নয়। ব্যাকগ্রাউন্ড টাস্কের জন্য iOS-এ GCD (DispatchQueue) এবং Kotlin-এ Coroutines ব্যবহার করুন। প্রধান থ্রেড শুধুমাত্র UI আপডেট এবং অ্যাসিঙ্ক্রোনাস অপারেশন শুরু করা উচিত।
দ্বিতীয় নিয়ম — Active-এ প্রতিটি ফিরে আসার সময় অবস্থা সিঙ্ক্রোনাইজ করুন। ব্যবহারকারী সিস্টেম অ্যাপ্লিকেশনে সেটিংস পরিবর্তন করতে পারে, push-নোটিফিকেশন পেতে পারে বা অন্য অ্যাপ্লিকেশনে ডেটা আপডেট করতে পারে। Active-এ রূপান্তরের সময় ক্যাশের বৈধতা পরীক্ষা করুন — ব্যবহারকারীর অনুপস্থিতির সময় ডেটা পুরানো হয়ে যেতে পারে।
তৃতীয় নিয়ম — Active-কে একমাত্র অবস্থা হিসাবে নির্ভর করবেন না। অ্যাপ্লিকেশন Active এড়িয়ে যেতে পারে এবং Not Running থেকে সরাসরি Background-এ যেতে পারে (যদি ব্যাকগ্রাউন্ড মোডে চালু হয়)। iOS-এ এটি content-available বিকল্প সহ push-নোটিফিকেশনের মাধ্যমে লঞ্চ করার সময় ঘটে। Android-এ — BroadcastReceiver-এর মাধ্যমে লঞ্চ করার সময়। UI অপারেশন সম্পাদনের আগে সর্বদা বর্তমান অবস্থা পরীক্ষা করুন।
চতুর্থ নিয়ম — onActivityResult-এর পরিবর্তে Android-এ Activity Result API ব্যবহার করুন। এটি Active অবস্থায় ক্যামেরা, গ্যালারি বা অনুমতি কলের ফলাফল প্রক্রিয়া করার অনুমতি দেয় Activity পুনরায় তৈরি হওয়ার সময় ডেটা না হারিয়ে। iOS-এর জন্য সিস্টেম ডায়ালগের জন্য UIApplication.shared.open-এর সাথে async/await ব্যবহার করুন।
import UIKit
final class ActiveStateManager {
static let shared = ActiveStateManager()
private var isActive = false
func setActive(_ active: Bool) {
isActive = active
if active {
NotificationCenter.default.post(name: .appDidBecomeActive, object: nil)
}
}
func performWhenActive(_ block: @escaping () -> Void) {
if isActive {
block()
} else {
// Active-এ ফিরে না আসা পর্যন্ত execution স্থগিত করুন
NotificationCenter.default.addObserver(
forName: .appDidBecomeActive,
object: nil,
queue: .main
) { _ in
block()
}
}
}
}
extension Notification.Name {
static let appDidBecomeActive = Notification.Name("appDidBecomeActive")
}কোডে Active অবস্থার ম্যানেজার দেখানো হয়েছে, যা অ্যাপ্লিকেশনের অন্যান্য কম্পোনেন্টগুলিকে বর্তমান সক্রিয় অবস্থা পরীক্ষা করার অনুমতি দেয়। performWhenActive হয় অবিলম্বে ব্লক executes করে যদি অ্যাপ্লিকেশন সক্রিয় থাকে, অথবা Active-এ ফিরে আসা পর্যন্ত execution স্থগিত করে। এটি পরিষেবাগুলির জন্য দরকারী যা ব্যবহারকারী অ্যাপ্লিকেশনে ফিরে আসার পরে একটি ক্রিয়া সম্পাদন করতে হবে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
মেথডটি প্রতিবার কল করা হয় যখন অ্যাপ্লিকেশন সক্রিয় অবস্থায় যায়: প্রথম লঞ্চে, ব্যাকগ্রাউন্ড থেকে ফিরে আসার সময়, Control Center বা Notification Center বন্ধ করার পরে, কল শেষ করার পরে। সাধারণ সেশনে ব্যবহারকারীর কর্মের উপর নির্ভর করে 5–10 বার কল করা হতে পারে। এই মেথডে এককালীন ইনিশিয়ালাইজেশন রাখবেন না।
Visible — একটি অনানুষ্ঠানিক শব্দ, যার অর্থ অ্যাপ্লিকেশন স্ক্রিনে দৃশ্যমান কিন্তু ইভেন্ট নাও গ্রহণ করতে পারে (উদাহরণস্বরূপ, iPad-এ অন্য উইন্ডো দ্বারা আংশিকভাবে ঢাকা)। Active — সরকারী অবস্থা, যেখানে অ্যাপ্লিকেশন দৃশ্যমান এবং ইন্টারঅ্যাকটিভ উভয়ই। iPhone-এ Visible অ্যাপ্লিকেশন সর্বদা Active, iPad-এ Visible + Inactive পরিস্থিতি সম্ভব।
willEnterForeground ব্যাকগ্রাউন্ড থেকে ফিরে আসার সময় কল করা হয়, কিন্তু অ্যাপ্লিকেশন এখনও সক্রিয় নয় — এটি Inactive-এ রয়েছে। didBecomeActive অ্যাপ্লিকেশন সম্পূর্ণ ইন্টারঅ্যাকটিভ হওয়ার পরে কল করা হয়। যদি ব্যবহারকারী ইন্টারফেস দেখার আগে একটি ক্রিয়া সম্পাদনের প্রয়োজন হয় — willEnterForeground ব্যবহার করুন। যদি প্রদর্শনের পরে — didBecomeActive ব্যবহার করুন।
না। Active বোঝায় যে অ্যাপ্লিকেশন অগ্রভাগে রয়েছে এবং স্ক্রিনে প্রদর্শিত হচ্ছে। দৃশ্যমান UI ছাড়া অ্যাপ্লিকেশন Background বা Suspended-এ থাকতে পারে। ব্যতিক্রম — iPad multi-window, যেখানে একটি উইন্ডো সক্রিয় হতে পারে এবং অন্যটি নয়, কিন্তু উভয়ই দৃশ্যমান। VoiceOver এবং ডিক্টাফোন এই নিয়ম পরিবর্তন করে না।
iOS সিমুলেটরে Home Screen-এ যেতে Cmd+Shift+H চাপুন (অ্যাপ্লিকেশন Background-এ যায়), তারপর আবার অ্যাপ্লিকেশন আইকনে ক্লিক করুন। স্ক্রিন লক (willResignActive) এবং আনলক (didBecomeActive) করার জন্য Cmd+L ব্যবহার করুন। Inactive পরীক্ষা করার জন্য Control Center (macOS কীবোর্ডের জন্য Cmd+Shift+;) বা Notification Center কল করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন