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?
How can I check if an app running on Android?
Asked Answered
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
}
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 value –
Brush
@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? #48699962 –
Slacken
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-oreo –
Sectorial
It'll return only self process since API 21 –
Hock
isInBackground
is the status of app
ActivityManager.RunningAppProcessInfo myProcess = new ActivityManager.RunningAppProcessInfo();
ActivityManager.getMyMemoryState(myProcess);
Boolean isInBackground = myProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
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;
}
is it working above kitkat ? if yes then please provide the code..thanks –
Churchman
it is deprectaed –
Virology
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
He is talking about the default browser not his own app! –
Dramatize
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
}
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
}
It'll return only self process since API 21. –
Dempstor
© 2022 - 2024 — McMap. All rights reserved.