ওভারভিউ
এই উদাহরণটি দেখায় কিভাবে ActivityManager.RunningAppProcessInfo ব্যবহার করে বর্তমান অ্যাপ্লিকেশন ফোরগ্রাউন্ডে চলছে কিনা ব্যাকগ্রাউন্ডে তা যাচাই করা যায়।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি
ধাপ ২: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="70dp"
android:background="#008080"
android:padding="5dp"
android:text="Background Check Demo"
android:textColor="#fff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Checking if app is in background..."
android:textAlignment="center"
android:textColor="@android:color/holo_red_light"
android:textSize="18sp"
android:textStyle="bold" />
</RelativeLayout>
ধাপ ৩: MainActivity.kt (লিগ্যাসি পদ্ধতি - ডিপ্রিকেটেড)
import android.app.ActivityManager
import android.app.ActivityManager.RunningAppProcessInfo
import android.os.Bundle
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "App State Demo"
textView = findViewById(R.id.textView)
checkAppState()
}
private fun checkAppState() {
// ⚠️ getMyMemoryState() ডিপ্রিকেটেড (API 29+)
val runningAppProcessInfo = RunningAppProcessInfo()
ActivityManager.getMyMemoryState(runningAppProcessInfo)
val isInBackground = runningAppProcessInfo.importance != RunningAppProcessInfo.IMPORTANCE_FOREGROUND
val message = if (isInBackground) {
"App is running in BACKGROUND"
} else {
"App is in FOREGROUND"
}
textView.text = message
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
override fun onPause() {
super.onPause()
// অ্যাক্টিভিটি পজ করার সময় (ব্যাকগ্রাউন্ডে যাওয়ার সংকেত)
Toast.makeText(this, "onPause: App going to background", Toast.LENGTH_SHORT).show()
}
override fun onResume() {
super.onResume()
Toast.makeText(this, "onResume: App in foreground", Toast.LENGTH_SHORT).show()
}
}
⚠️ সতর্কতা: API 29+ (Android 10) থেকে পরিবর্তন
ActivityManager.getMyMemoryState() এবং RunningAppProcessInfo ব্যবহার করুন **ডিপ্রিকেটেড** এবং **ব্লকড** (প্রাইভেসি কারণে)। আধুনিক Android-এ প্রসেস ইনফো এক্সেস সীমাবদ্ধ।
🚀 আধুনিক এবং সঠিক পদ্ধতি: ProcessLifecycleOwner (Jetpack Lifecycle)
এটি আর্কিটেকচার কম্পোনেন্টের অংশ এবং লাইফসাইকেল-আওয়্যার।
Dependencies:
implementation "androidx.lifecycle:lifecycle-process:2.7.0"
Application ক্লাসে বাস্তবায়ন:
import android.app.Application
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.ProcessLifecycleOwner
class MyApplication : Application(), DefaultLifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
override fun onStart(owner: LifecycleOwner) {
// অ্যাপ ফোরগ্রাউন্ডে এসেছে
AppState.isInForeground = true
Logger.d("App entered FOREGROUND")
}
override fun onStop(owner: LifecycleOwner) {
// অ্যাপ ব্যাকগ্রাউন্ডে গেল
AppState.isInForeground = false
Logger.d("App entered BACKGROUND")
}
}
// State holder
object AppState {
@Volatile var isInForeground = false
}
AndroidManifest.xml-এ অ্যাপ্লিকেশন ক্লাস রেজিস্টার:
<application
android:name=".MyApplication"
... >
যেকোনো জায়গা থেকে চেক করুন:
if (AppState.isInForeground) {
// ফোরগ্রাউন্ডে
} else {
// ব্যাকগ্রাউন্ডে
}
বিকল্প: ActivityLifecycleCallbacks (পুরানো কিন্তু কার্যকর)
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var activityCount = 0
override fun onActivityResumed(activity: Activity) {
activityCount++
if (activityCount == 1) {
// প্রথম অ্যাক্টিভিটি রিজিউম -> ফোরগ্রাউন্ড
AppState.isInForeground = true
}
}
override fun onActivityPaused(activity: Activity) {
activityCount--
if (activityCount == 0) {
// সব অ্যাক্টিভিটি পজ -> ব্যাকগ্রাউন্ড
AppState.isInForeground = false
}
}
// অন্যান্য মেথড খালি রাখুন
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityStopped(activity: Activity) {}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {}
})
}
}
সার্ভিস/ওয়ার্কম্যানেজারের জন্য: Foreground Service
যদি ব্যাকগ্রাউন্ডে কাজ চালিয়ে রাখতে চান, Foreground Service ব্যবহার করুন নোটিফিকেশন সহ।
সারসংক্ষেপ
| পদ্ধতি | API লেভেল | সুপারিশ |
|---|---|---|
| RunningAppProcessInfo | < 29 | ❌ ডিপ্রিকেটেড |
| ProcessLifecycleOwner | 21+ | ✅ সেরা (Lifecycle-aware) |
| ActivityLifecycleCallbacks | 14+ | ✅ ভালো (লিগ্যাসি সাপোর্ট) |