How can I check if an app running on Android?
Asked Answered
D

6

81

I am an Android developer and I want to write an if statement in my application. In this statement I want to check if the default browser (browser in Android OS) is running. How can I do this programmatically?

Dali answered 18/11, 2010 at 8:45 Comment(0)
B
159

Add the below Helper class:

public class Helper {

        public static boolean isAppRunning(final Context context, final String packageName) {
            final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            final List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
            if (procInfos != null)
            {
                for (final ActivityManager.RunningAppProcessInfo processInfo : procInfos) {
                    if (processInfo.processName.equals(packageName)) {
                        return true;
                    }
                }
            }
            return false;
        }
    }

Now you can check from the below code if your desired App is running or not:

if (Helper.isAppRunning(YourActivity.this, "com.your.desired.app")) {
    // App is running
} else {
    // App is not running
}
Brush answered 18/11, 2010 at 10:36 Comment(9)
Thx, but as i see every time com.android.browser is running. When it is foreground, generally it's in 3rd or 4th position of the list, otherwise it is still in the list. So this statement every time returns true. How can i solve this problem? Only when the recent process is browser it must write "browser is running".Dali
a field 'lru' in the RunningAppProcessInfo will give you the relative information of the application runtime for further reference check the doc page - developer.android.com/reference/android/app/…Brush
for much finer detail you can maintain a time counter in your application. in one of my past app to display the process state just like gmail chat status we maintained the app time along with the importance valueBrush
@Brush is there any way to check that the app has now gone to background (i.e. no longer visible to the user)?Notion
Is it any way to check process is pause or resume?Lardy
Doesn't work if u have yours packages in main package.Weapon
Does it work to detect activity of other apps? #48699962Slacken
Whoever got this code not working in killed/background states of app in Naugat?Marshmallow versions of android, Please check this answer once: https://mcmap.net/q/260436/-background-service-for-android-oreoSectorial
It'll return only self process since API 21Hock
B
7

isInBackground is the status of app

ActivityManager.RunningAppProcessInfo myProcess = new ActivityManager.RunningAppProcessInfo();
ActivityManager.getMyMemoryState(myProcess);
Boolean isInBackground = myProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
Brunette answered 9/10, 2019 at 6:36 Comment(0)
C
1

You can check it by the following method

public static boolean isRunning(Context ctx) {
    ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);

    List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (ActivityManager.RunningTaskInfo task : tasks) {
        if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName()))
            return true;
    }
    return false;
}
Cutwater answered 6/7, 2017 at 11:57 Comment(2)
is it working above kitkat ? if yes then please provide the code..thanksChurchman
it is deprectaedVirology
R
1

Best solution is :

Create an interface like this.

interface LifeCycleDelegate {
    void onAppBackgrounded();
    void onAppForegrounded();
}

Now add a class that handle all activity lifecycle callbacks.

public class AppLifecycleHandler implements 
 Application.ActivityLifecycleCallbacks, ComponentCallbacks2 {

LifeCycleDelegate lifeCycleDelegate;
boolean appInForeground = false;

public AppLifecycleHandler(LifeCycleDelegate lifeCycleDelegate) {
    this.lifeCycleDelegate = lifeCycleDelegate;
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {
    if (!appInForeground) {
        appInForeground = true;
        lifeCycleDelegate.onAppForegrounded();
    }
}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityStopped(Activity activity) {

}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}

@Override
public void onTrimMemory(int level) {
    if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
        // lifecycleDelegate instance was passed in on the constructor
        appInForeground = false;
        lifeCycleDelegate.onAppBackgrounded();
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {

}

@Override
public void onLowMemory() {

}
}

Now in a class extending Application

public class MyApplication extends Application implements 
 LifeCycleDelegate{
 @Override
public void onCreate() {
    super.onCreate();

    AppLifecycleHandler lifeCycleHandler = new 
    AppLifecycleHandler(MyApplication.this);
    registerLifecycleHandler(lifeCycleHandler);
}

@Override
public void onAppBackgrounded() {
    Log.d("Awww", "App in background");
}

@Override
public void onAppForegrounded() {
    Log.d("Yeeey", "App in foreground");
}

private void registerLifecycleHandler(AppLifecycleHandler lifeCycleHandler) {
    registerActivityLifecycleCallbacks(lifeCycleHandler);
    registerComponentCallbacks(lifeCycleHandler);
}
}

For More refer : https://android.jlelse.eu/how-to-detect-android-application-open-and-close-background-and-foreground-events-1b4713784b57

Regular answered 25/12, 2019 at 4:45 Comment(1)
He is talking about the default browser not his own app!Dramatize
M
0
fun Context.isAppInForeground(): Boolean {

val application = this.applicationContext
val activityManager = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningProcessList = activityManager.runningAppProcesses

  if (runningProcessList != null) {
     val myApp = runningProcessList.find { it.processName == application.packageName }
     ActivityManager.getMyMemoryState(myApp)
     return myApp?.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
  }

  return false
}
Mohandis answered 1/5, 2020 at 6:43 Comment(0)
I
0

If you are Using Kotlin

   private fun isAppRunning(context: Context, packageName: String): Boolean {
        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        activityManager.runningAppProcesses?.apply {
            for (processInfo in this) {
                if (processInfo.processName == packageName) {
                    return true
                }
            }
        }
        return false
    }
Iden answered 8/2, 2021 at 20:53 Comment(1)
It'll return only self process since API 21.Dempstor

© 2022 - 2024 — McMap. All rights reserved.