Background ऐप जीवनचक्र की एक अवस्था है जिसमें यह चलता रहता है लेकिन स्क्रीन पर प्रदर्शित नहीं होता। हम iOS और Android पर पृष्ठभूमि कार्य की मूल बातें समझाते हैं: सीमाएँ, समय-समाप्ति, beginBackgroundTask, WorkManager और Service के माध्यम से पृष्ठभूमि कार्य, साथ ही Background के सही संचालन के लिए सर्वोत्तम अभ्यास।
मुख्य बिंदु
Background ऐप की वह अवस्था है जिसमें यह ऑपरेटिंग सिस्टम में मौजूद रहता है, कोड निष्पादित करता है और संसाधनों का उपभोग करता है, लेकिन डिवाइस स्क्रीन पर प्रदर्शित नहीं होता। उपयोगकर्ता होम स्क्रीन पर, किसी अन्य ऐप में है, या डिवाइस की स्क्रीन लॉक है। iOS पर, Background Inactive के बाद आता है — संक्रमण श्रृंखला: Active → Inactive → Background। Android पर, onStop Activity के Background में संक्रमण का संकेत देता है।
दोनों प्लेटफ़ॉर्म पृष्ठभूमि कार्य पर सख्त प्रतिबंध लगाते हैं। iOS Background में प्रवेश करने के बाद कोड निष्पादित करने के लिए एक सीमित विंडो (आमतौर पर 30 सेकंड) प्रदान करता है, जिसके बाद ऐप Suspended में स्थानांतरित हो जाता है। Android अधिक लचीला है: दृश्य सूचना वाला Foreground Service अनिश्चित काल तक चल सकता है, लेकिन सामान्य Background Service कुछ मिनटों तक सीमित है। डेवलपर का मुख्य कार्य स्थिति को सही ढंग से सहेजना और सिस्टम पृष्ठभूमि कार्य API के माध्यम से कार्य जारी रखने की योजना बनाना है।
सिस्टम मेमोरी कम होने पर किसी भी समय पृष्ठभूमि ऐप को समाप्त कर सकता है। समाप्ति पर, सभी असहेजित डेटा खो जाता है। इसलिए applicationDidEnterBackground (iOS) या onStop (Android) में स्थिति सहेजना अत्यंत महत्वपूर्ण है। समाप्ति के बाद, अगला लॉन्च Not Running से कोल्ड स्टार्ट के साथ शुरू होता है और सहेजी गई स्थिति को पुनर्स्थापित करता है।
Background और Suspended के बीच अंतर करना महत्वपूर्ण है। Background — ऐप सक्रिय रूप से कोड निष्पादित कर रहा है। Suspended — ऐप मेमोरी में है लेकिन कोड निष्पादित नहीं कर रहा — यह जमा हुआ है। iOS पर, ऐप पृष्ठभूमि कार्य पूरा करने के बाद Background से Suspended में जाता है। Android में Suspended नहीं है — प्रक्रिया या तो मौजूद है (Background सहित) या समाप्त हो गई है (Not Running)। हालाँकि, Android LMK (Low Memory Killer) के माध्यम से थ्रेड निष्पादन को रोक सकता है।
| विशेषता | iOS Background | Android Background |
|---|---|---|
| कोड निष्पादित होता है | हाँ, 30 सेकंड तक | हाँ, API पर निर्भर करता है |
| UI दिखाई देता है | नहीं | नहीं |
| डिफ़ॉल्ट समय-समाप्ति | ~30 सेकंड (beginBackgroundTask) | कई मिनट (Service) |
| असीमित कार्य | केवल विशेष श्रेणियाँ (ऑडियो, VoIP, नेविगेशन) | सूचना के साथ Foreground Service |
| निष्पादन गारंटी | नहीं — सिस्टम किसी भी समय समाप्त कर सकता है | WorkManager निष्पादन की गारंटी देता है |
| अनुमति आवश्यक | हाँ — Info.plist में capabilities | हाँ — FOREGROUND_SERVICE अनुमति |
| अगली स्थिति | Suspended → Not Running | Not Running (या पुनरारंभ) |
iOS पर, Background को डेलिगेट विधि applicationDidEnterBackground के माध्यम से संभाला जाता है। इस विधि में, डेवलपर को उपयोगकर्ता स्थिति सहेजनी चाहिए, संसाधन मुक्त करने चाहिए और पृष्ठभूमि कार्य पूरे करने चाहिए। Background में प्रवेश करने के बाद कोड निष्पादित करने के लिए, beginBackgroundTask(expirationHandler:) का उपयोग किया जाता है — एक API जो सिस्टम से अतिरिक्त समय (आमतौर पर 30 सेकंड) का अनुरोध करती है। यदि कार्य इस समय के भीतर पूरा नहीं होता है, तो expirationHandler कॉल किया जाता है, और ऐप को जबरन Suspended में स्थानांतरित कर दिया जाता है।
iOS 13 के साथ, Apple ने BGTaskScheduler प्रस्तुत किया — पृष्ठभूमि कार्यों को शेड्यूल करने के लिए एक आधुनिक API। beginBackgroundTask के विपरीत, जो पृष्ठभूमि में जाने के बाद केवल समाप्त करने का समय देता है, BGTaskScheduler भविष्य में कार्य निष्पादन को शेड्यूल करने की अनुमति देता है — उदाहरण के लिए, घंटे में एक बार सामग्री अपडेट करना या रात में विश्लेषण अपलोड करना। BGTaskScheduler नई परियोजनाओं के लिए अनुशंसित दृष्टिकोण है, क्योंकि यह बैटरी के मामले में अधिक कुशल है।
import UIKit
import BackgroundTasks
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
// ऐप पृष्ठभूमि में चला गया — पृष्ठभूमि कार्य शुरू कर रहे हैं
func applicationDidEnterBackground(_ application: UIApplication) {
saveAppState()
startBackgroundTask()
}
private func startBackgroundTask() {
backgroundTaskID = UIApplication.shared.beginBackgroundTask { [weak self] in
// समय समाप्त — जबरन समाप्त कर रहे हैं
self?.endBackgroundTask()
}
// पृष्ठभूमि कार्य का अनुकरण (सर्वर पर डेटा सहेजना)
DispatchQueue.global().async { [weak self] in
uploadAnalyticsData()
self?.endBackgroundTask()
}
}
private func endBackgroundTask() {
guard backgroundTaskID != .invalid else { return }
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// BGTaskScheduler पंजीकरण
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
handleAppRefresh(task: task as! BGAppRefreshTask)
}
return true
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = { task.setTaskCompleted(success: false) }
fetchLatestData { result in
task.setTaskCompleted(success: result)
}
}
}कोड iOS पर पूर्ण Background प्रसंस्करण दिखाता है। applicationDidEnterBackground टाइमआउट और expirationHandler के साथ beginBackgroundTask के माध्यम से एक पृष्ठभूमि कार्य शुरू करता है। साथ ही, BGTaskScheduler को आवधिक सामग्री अपडेट के लिए पंजीकृत किया जाता है। beginBackgroundTask का उपयोग तत्काल शटडाउन कार्यों के लिए किया जाता है, BGTaskScheduler का उपयोग दीर्घकालिक योजना के लिए किया जाता है। दोनों API को कार्य पहचानकर्ताओं के उचित प्रबंधन की आवश्यकता होती है।
Android पर, Background को कई API के माध्यम से प्रबंधित किया जाता है। पारंपरिक Service पृष्ठभूमि में कोड निष्पादित करने की अनुमति देता है, लेकिन Android 8+ (API 26) से, Background Service सीमित है: सिस्टम ऐप के पृष्ठभूमि में जाने के कुछ मिनट बाद इसे समाप्त कर देता है। स्थायी सूचना वाला Foreground Service अनिश्चित काल तक चल सकता है। WorkManager डिवाइस रीबूट के बाद भी निष्पादन गारंटी के साथ पृष्ठभूमि कार्यों के लिए अनुशंसित समाधान है।
Android, iOS के विपरीत, लंबे समय तक चलने वाली पृष्ठभूमि प्रक्रियाओं का समर्थन करता है। Foreground Service का उपयोग उन कार्यों के लिए किया जाता है जिन्हें उपयोगकर्ता को देखना चाहिए — संगीत चलाना, नेविगेशन, वर्कआउट ट्रैकिंग। JobScheduler और WorkManager का उपयोग उन कार्यों के लिए किया जाता है जिन्हें स्थगित किया जा सकता है: डेटा सिंक्रोनाइज़ेशन, लॉग अपलोड, कैश अपडेट। मुख्य अंतर: Android शर्तों के साथ कार्य शेड्यूल करने की अनुमति देता है — Wi-Fi, चार्जिंग, डिवाइस निष्क्रियता — जो बैटरी और ट्रैफ़िक बचाता है।
import android.app.Service
import android.content.Intent
import android.os.IBinder
import androidx.work.*
// 1. लंबे पृष्ठभूमि कार्य के लिए Foreground Service
class SyncService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = createNotification()
startForeground(NOTIFICATION_ID, notification)
performBackgroundWork()
return START_STICKY
}
private fun performBackgroundWork() {
Thread {
// सर्वर के साथ डेटा सिंक्रोनाइज़ेशन
syncDataToServer()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
}.start()
}
override fun onBind(intent: Intent?): IBinder? = null
}
// 2. स्थगित पृष्ठभूमि कार्यों के लिए WorkManager
class DataSyncWorker(
private val context: Context,
private val params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// सर्वर पर विश्लेषण अपलोड करना
uploadAnalytics()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry() else Result.failure()
}
}
}
// WorkManager कार्य शेड्यूलिंग
fun scheduleBackgroundSync(context: Context) {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<DataSyncWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context).enqueue(request)
}कोड Android पर पृष्ठभूमि कार्य के दो दृष्टिकोण दिखाता है। SyncService — तत्काल और लंबे पृष्ठभूमि कार्य के लिए सूचना के साथ Foreground Service। DataSyncWorker — शर्तों (Wi-Fi, चार्जिंग) के साथ स्थगित कार्यों के लिए WorkManager। WorkManager डिवाइस रीबूट के बाद भी निष्पादन की गारंटी देता है और पुनः प्रयास के लिए एक्सपोनेंशियल बैकऑफ़ का समर्थन करता है। Foreground Service को स्टेटस बार में स्थायी सूचना की आवश्यकता होती है।
दोनों मोबाइल प्लेटफ़ॉर्म लगातार पृष्ठभूमि कार्य नियमों को कड़ा कर रहे हैं। iOS पर, OS की प्रत्येक नई पीढ़ी पृष्ठभूमि निष्पादन समय कम करती है और नए प्रतिबंध जोड़ती है। Android पर, Google तेजी से सख्त पावर सेविंग मोड (Doze, App Standby) पेश कर रहा है। डेवलपर्स को वर्तमान सीमाओं से अपडेट रहना चाहिए ताकि ऐप सिस्टम द्वारा समय से पहले समाप्त न हो।
iOS पर, iOS 13 से शुरू होकर, सिस्टम उन ऐप्स के लिए पृष्ठभूमि कार्य अक्षम कर देता है जो पृष्ठभूमि समय का दुरुपयोग करते हैं। प्रत्येक ऐप को उपयोगकर्ता व्यवहार के आधार पर कुछ सीमाएँ मिलती हैं। BGTaskScheduler इष्टतम समय पर निष्पादन शेड्यूल करता है — उदाहरण के लिए, जब डिवाइस Wi-Fi से जुड़ा हो और चार्ज हो रहा हो। जो ऐप BGTaskScheduler का सही उपयोग करते हैं उन्हें अधिक पृष्ठभूमि समय मिलता है।
Android पर, Android 9 (API 28) से शुरू होकर, पृष्ठभूमि कार्य Doze मोड द्वारा प्रतिबंधित है, जो डिवाइस के निष्क्रिय होने पर सक्रिय होता है। Doze में ऐप पृष्ठभूमि कार्य नहीं कर सकते, नेटवर्क डिस्कनेक्ट हो जाता है, JobScheduler और WorkManager Doze से बाहर निकलने तक कार्य स्थगित कर देते हैं। Foreground Service Doze को बायपास करने का एकमात्र तरीका है, लेकिन दुरुपयोग से ऐप उपयोगकर्ता द्वारा ब्लॉक कर दिया जाता है और अनुमतियाँ रद्द हो जाती हैं।
| प्रतिबंध | iOS | Android |
|---|---|---|
| पृष्ठभूमि कार्य समय-समाप्ति | ~30 सेकंड (beginBackgroundTask) | कई मिनट (JobScheduler) |
| असीमित पृष्ठभूमि | ऑडियो, VoIP, नेविगेशन, Bluetooth | Foreground Service + सूचना |
| पावर सेविंग | लो पावर मोड — पृष्ठभूमि कार्य अक्षम करता है | Doze, App Standby, बैटरी ऑप्टिमाइज़ेशन |
| शेड्यूलिंग | BGTaskScheduler (iOS 13+) | WorkManager (Android Jetpack) |
| रीबूट के बाद | केवल push सूचना | WorkManager कार्य सुरक्षित रखता है |
| अधिकतम निष्पादन समय | ~30 मिनट (ऑडियो) | असीमित (Foreground Service) |
पहला नियम — पृष्ठभूमि में संसाधन खपत कम करें। अधिकांश पृष्ठभूमि कार्यों को उस समय के लिए स्थगित किया जा सकता है जब डिवाइस चार्ज हो रहा हो और Wi-Fi से जुड़ा हो। शर्तों के साथ कार्य शेड्यूल करने के लिए BGTaskScheduler (iOS) और WorkManager (Android) का उपयोग करें। पृष्ठभूमि में भारी गणना न चलाएँ — इससे बैटरी खत्म होती है और CPU थ्रॉटलिंग होती है।
दूसरा नियम — beginBackgroundTask के लिए हमेशा expirationHandler निर्दिष्ट करें। यदि ऐप निर्धारित समय में कार्य पूरा नहीं करता है, तो सिस्टम इसे जबरन Suspended में स्थानांतरित कर देगा या समाप्त कर देगा। expirationHandler डेटा सहेजने और कार्य सही ढंग से समाप्त करने का अंतिम मौका है। Android पर, WorkManager में setForegroundAsync का उपयोग करें यदि अधिक समय की आवश्यकता हो तो सामान्य कार्य को अग्रभूमि में बदलने के लिए।
तीसरा नियम — लॉन्च करने से पहले पृष्ठभूमि कार्य प्रतिबंधों की जाँच करें। iOS पर, शेष समय जाँचने के लिए UIApplication.shared.backgroundTimeRemaining का उपयोग करें। Android पर, ActivityManager.isBackgroundRestricted() जाँचें — यदि true है, तो ऐप पृष्ठभूमि कार्य नहीं चला सकता, और आपको उपयोगकर्ता को सेटिंग्स में प्रतिबंध हटाने का सुझाव देना चाहिए। यह विशेष रूप से महत्वपूर्ण पृष्ठभूमि कार्यों वाले ऐप्स के लिए महत्वपूर्ण है — अलार्म, कैलेंडर, सिंक्रोनाइज़ेशन।
चौथा नियम — पृष्ठभूमि कार्यों का वास्तविक डिवाइस पर परीक्षण करें। सिम्युलेटर और एमुलेटर वास्तविक पृष्ठभूमि कार्य प्रतिबंधों को पुन: उत्पन्न नहीं करते। iOS पर, Xcode में Debug → Simulate Background Fetch का उपयोग करें। Android पर, रीबूट के बाद WorkManager परीक्षण के लिए adb shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED का उपयोग करें। कम बैटरी वाले डिवाइस पर वास्तविक परीक्षण अधिकांश पृष्ठभूमि कार्य समस्याओं का खुलासा करते हैं।
import UIKit
final class BackgroundTaskManager {
static let shared = BackgroundTaskManager()
private var tasks: [String: UIBackgroundTaskIdentifier] = [:]
func startTask(name: String, expiration: @escaping () -> Void) {
let remaining = UIApplication.shared.backgroundTimeRemaining
print("पृष्ठभूमि में शेष समय: \(remaining) सेकंड")
let task = UIApplication.shared.beginBackgroundTask { [weak self] in
print("कार्य के लिए समय समाप्त: \(name)")
expiration()
self?.endTask(name: name)
}
tasks[name] = task
}
func endTask(name: String) {
guard let task = tasks.removeValue(forKey: name),
task != .invalid
else { return }
UIApplication.shared.endBackgroundTask(task)
}
}कोड एक पृष्ठभूमि कार्य प्रबंधक दिखाता है जो शेष समय को ट्रैक करता है और पहचानकर्ताओं का प्रबंधन करता है। backgroundTimeRemaining जबरन समाप्ति से पहले सेकंड की संख्या लौटाता है — यदि मान अनंत है, तो ऐप बिना प्रतिबंध के चल रहा है (ऑडियो, नेविगेशन)। प्रबंधक विभिन्न नामों के साथ कई पृष्ठभूमि कार्य शुरू करने और प्रत्येक को सही ढंग से पूरा करने की अनुमति देता है। यह दृष्टिकोण पृष्ठभूमि कार्य रिसाव को रोकता है और सुनिश्चित करता है कि सिस्टम बंद न किए गए कार्यों के कारण ऐप को समाप्त न करे।
अक्सर पूछे जाने वाले प्रश्न
हाँ, सीमित संख्या में श्रेणियों के लिए: ऑडियो (AVAudioSession श्रेणी .playback), VoIP (PushKit), नेविगेशन (CLLocationManager allowsBackgroundLocationUpdates के साथ), Bluetooth (सेंट्रल बैकग्राउंड मोड), पृष्ठभूमि अपडेट (BGTaskScheduler)। बाकी सभी के लिए — अधिकतम 30 सेकंड। iOS 16+ में, Apple ने अनुमत श्रेणियों के लिए भी आवश्यकताएँ कड़ी कर दी हैं।
beginBackgroundTask पृष्ठभूमि में जाने के बाद ऐप का जीवन ~30 सेकंड बढ़ाने के लिए एक सिंक्रोनस API है। इसे applicationDidEnterBackground में कॉल किया जाता है। BGTaskScheduler सिस्टम ट्रिगर (समय, स्थान, सामग्री अपडेट) के माध्यम से भविष्य में कार्य शेड्यूल करने के लिए एक एसिंक्रोनस API है। BGTaskScheduler आधुनिक दृष्टिकोण है, जिसे Apple द्वारा iOS 13+ के लिए अनुशंसित किया गया है।
Android 8 (API 26) से शुरू होकर, ऐप के पृष्ठभूमि में जाने के कुछ मिनट बाद Background Service समाप्त हो जाती है। समाधान: लंबे संचालन के लिए सूचना के साथ Foreground Service या स्थगित कार्यों के लिए WorkManager का उपयोग करें। सेटिंग्स में अपने ऐप के लिए बैटरी ऑप्टिमाइज़ेशन जाँचें — यदि यह ऑप्टिमाइज़्ड है, तो सिस्टम पृष्ठभूमि कार्यों को स्थगित या रद्द कर सकता है।
होम स्क्रीन पर जाने के लिए Cmd+Shift+H दबाएँ। Xcode में, Debug → Simulate Background Fetch का उपयोग करें। beginBackgroundTask जाँचने के लिए, कंसोल (Shift+Cmd+C) खोलें और e UIApplication.shared.backgroundTimeRemaining कॉल करें। Xcode 15+ में, सिम्युलेटर के Diagnostics टैब में Background Execution स्क्रिप्ट उपलब्ध है।
Process Death संसाधनों की कमी या पृष्ठभूमि में निष्क्रियता पर सिस्टम द्वारा Android प्रक्रिया की समाप्ति है। iOS के विपरीत, Android में Suspended नहीं है — प्रक्रिया या तो जीवित है (पृष्ठभूमि में हो सकती है) या मृत (Not Running)। Process Death OS का सामान्य व्यवहार है, और ऐप को इसके बाद SavedStateHandle, onSaveInstanceState या DataStore के माध्यम से स्थिति को सही ढंग से पुनर्स्थापित करना चाहिए।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें