एंड्रॉइड में ऐप फोरग्राउंड/बैकग्राउंड स्थिति का पता लगाना
आधुनिक एंड्रॉइड (API 26+) ActivityManager.RunningTaskInfo (API 21 में डिप्रिकेट) के बजाय ComponentCallbacks2, ProcessLifecycleOwner, या ActivityLifecycleCallbacks का उपयोग करने की सिफारिश करता है। यह लेख विश्वसनीय, भविष्य-प्रूफ दृष्टिकोण दिखाता है।
दृष्टिकोण 1 - ProcessLifecycleOwner (अनुशंसित, लाइफसाइकिल 2.0+)
लाइफसाइकिल लाइब्रेरी जोड़ें:
dependencies {
implementation "androidx.lifecycle:lifecycle-process:2.7.0"
}
एप्लिकेशन क्लास
package com.example.applifecycledemo;
import android.app.Application;
import android.util.Log;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.ProcessLifecycleOwner;
public class MyApplication extends Application implements DefaultLifecycleObserver {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@Override
public void onStart(androidx.lifecycle.LifecycleOwner owner) {
Log.d("AppLifecycle", "ऐप फोरग्राउंड में आया");
// UI रीफ्रेश करें, कनेक्शन फिर से शुरू करें, आदि।
}
@Override
public void onStop(androidx.lifecycle.LifecycleOwner owner) {
Log.d("AppLifecycle", "ऐप बैकग्राउंड में गया");
// टाइमर रोकें, कैश फ्लश करें, संवेदनशील डेटा छिपाएं।
}
}
मैनिफेस्ट में android:name=".MyApplication" पंजीकृत करें।
दृष्टिकोण 2 - ActivityLifecycleCallbacks (कोई अतिरिक्त निर्भरता नहीं)
public class MyApplication extends Application {
private int activityReferences = 0;
private boolean isBackground = false;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override public void onActivityCreated(android.app.Activity a, Bundle b) {}
@Override public void onActivityStarted(android.app.Activity a) {
if (++activityReferences == 1 && isBackground) {
isBackground = false;
onAppForeground();
}
}
@Override public void onActivityResumed(android.app.Activity a) {}
@Override public void onActivityPaused(android.app.Activity a) {}
@Override public void onActivityStopped(android.app.Activity a) {
if (--activityReferences == 0) {
isBackground = true;
onAppBackground();
}
}
@Override public void onActivitySaveInstanceState(android.app.Activity a, Bundle b) {}
@Override public void onActivityDestroyed(android.app.Activity a) {}
});
}
private void onAppForeground() {
// फोरग्राउंड लॉजिक
}
private void onAppBackground() {
// बैकग्राउंड लॉजिक
}
}
दृष्टिकोण 3 - ComponentCallbacks2 (कम मेमोरी/ट्रिम इवेंट)
public class MyApplication extends Application implements ComponentCallbacks2 {
@Override public void onTrimMemory(int level) {
if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
// UI छिपा हुआ → ऐप बैकग्राउंड में
}
}
}
तुलना
| विधि | न्यूनतम API | पक्ष | विपक्ष |
|---|---|---|---|
| ProcessLifecycleOwner | 14+ (लाइफसाइक्ल लिब के माध्यम से) | सरल, जीवनचक्र-संवेदनशील, Jetpack के साथ काम करता है | लाइफसाइक्ल निर्भरता की आवश्यकता |
| ActivityLifecycleCallbacks | 14+ | कोई अतिरिक्त लाइब्रेरी नहीं, बारीक नियंत्रण | बॉयलरप्लेट, मैन्युअल रेफरेंस काउंटिंग |
| ComponentCallbacks2 | 14+ | सिस्टम-स्तरीय ट्रिम इवेंट | सटीक फोरग्राउंड/बैकग्राउंड संक्रमण के लिए नहीं |
लीगेसी कोड क्यों विफल होता है
मूल उदाहरण ActivityManager.getRunningTasks(1) का उपयोग करता था, जो:
- API 21+ पर डिप्रिकेट है (केवल कॉलर के अपने टास्क लौटाता है)।
GET_TASKSपरमिशन की आवश्यकता होती है (सामान्य ऐप्स के लिए प्रतिबंधित)।- मल्टी-विंडो/स्प्लिट-स्क्रीन परिदृश्यों पर अविश्वसनीय।
परीक्षण युक्तियाँ
- लॉगकैट में "ऐप फोरग्राउंड में आया/बैकग्राउंड में गया" देखें।
- होम दबाएं → बैकग्राउंड लॉग दिखाई देता है।
- रिसेंट्स से ऐप फिर से खोलें → फोरग्राउंड लॉग दिखाई देता है।
- स्प्लिट-स्क्रीन आज़माएं — ProcessLifecycleOwner इसे सही ढंग से संभालता है।
सामान्य उपयोग-मामले
- बैकग्राउंड पर WebSocket/सॉकेट कनेक्शन रोकें/फोरग्राउंड पर फिर से कनेक्ट करें।
- ऐप बैकग्राउंड होने पर संवेदनशील स्क्रीन मास्क करें (बैंकिंग ऐप्स)।
- केवल फोरग्राउंड में एनालिटिक्स "सत्र प्रारंभ/समाप्त" इवेंट भेजें।
मजबूत, रखरखाव योग्य ऐप-स्तरीय जीवनचक्र जागरूकता के लिए ProcessLifecycleOwner चुनें।