check android application is in foreground or not?
I don't understand what you want, but You can detect currently foreground/background application with ActivityManager.getRunningAppProcesses()
call.
Something like,
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0].getApplicationContext();
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}
// Use like this:
boolean foregroud = new ForegroundCheckTask().execute(context).get();
Also let me know if I misunderstand..
UPDATE: Look at this SO question Determining the current foreground application from a background task or service fore more information..
Thanks..
How to know if my application is in foreground or background, android?
Original Answer : https://stackoverflow.com/a/60212452/10004454
The recommended way to do it in accordance with Android documentation is
class MyApplication : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this);
}
fun isActivityVisible(): String {
return ProcessLifecycleOwner.get().lifecycle.currentState.name
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackgrounded() {
//App in background
Log.e(TAG, "************* backgrounded")
Log.e(TAG, "************* ${isActivityVisible()}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForegrounded() {
Log.e(TAG, "************* foregrounded")
Log.e(TAG, "************* ${isActivityVisible()}")
// App in foreground
}}
In your gradle (app) add : implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
Then to check the state at runtime call MyApplication().isActivityVisible()
How can I tell if Android app is running in the foreground?
Make a global variable like private boolean mIsInForegroundMode;
and assign a false
value in onPause()
and a true
value in onResume()
.
Sample code:
private boolean mIsInForegroundMode;
@Override
protected void onPause() {
super.onPause();
mIsInForegroundMode = false;
}
@Override
protected void onResume() {
super.onResume();
mIsInForegroundMode = true;
}
// Some function.
public boolean isInForeground() {
return mIsInForegroundMode;
}
Check if app is running in foreground or background (with sync adapter)
Original Answer : https://stackoverflow.com/a/48767617/10004454
The recommended way to do it in accordance with Android documentation is
class MyApplication : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
fun isInForeground(): Boolean {
return ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackgrounded() {
//App in background
Log.e(TAG, "************* backgrounded")
Log.e(TAG, "************* ${isInForeground()}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForegrounded() {
Log.e(TAG, "************* foregrounded")
Log.e(TAG, "************* ${isInForeground()}")
// App in foreground
}}
In your gradle (app) add : implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
Then to check the state at runtime call (applicationContext as MyApplication).isActivityVisible()
How to detect when an Android app goes to the background and come back to the foreground
The onPause()
and onResume()
methods are called when the application is brought to the background and into the foreground again. However, they are also called when the application is started for the first time and before it is killed. You can read more in Activity.
There isn't any direct approach to get the application status while in the background or foreground, but even I have faced this issue and found the solution with onWindowFocusChanged
and onStop
.
For more details check here Android: Solution to detect when an Android app goes to the background and come back to the foreground without getRunningTasks or getRunningAppProcesses.
How to check in foreground service if the app is running?
There is no proper way to do that. One work around you can use is to start a service normally from your activity and overriding onTaskRemoved
method. This method will be called when your app is removed from the recent apps screen. You can do set global static variables in your main service class and access them later on to determine whether the app is killed or not.
This is the service code:
Your foreground service:
Kotlin:
class ForegroundService : Service() {
companion object {
// this can be used to check if the app is running or not
@JvmField var isAppInForeground: Boolean = true
}
...
}
Java:
class ForegroundService extends Service {
public static boolean isAppInForeground = true;
}
Your service for checking app state:
Kotlin:
AppKillService.kt
class AppKillService : Service() {
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// service is started, app is in foreground, set global variable
ForegroundService.isAppInForeground = true
return START_NOT_STICKY
}
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
// app is killed from recent apps screen, do your work here
// you can set global static variable to use it later on
// e.g.
ForegroundService.isAppInForeground = false
}
}
Java:
AppKillService.java
public class AppKillService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// service is started, app is in foreground, set global variable
ForegroundService.isAppInForeground = true;
return START_NOT_STICKY;
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
// app is killed from recent apps screen, do your work here
// you can set global static variable to use it later on
// e.g.
ForegroundService.isAppInForeground = false;
}
}
In your MainActivity
:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// start your service like this
startService(Intent(this, AppKillService::class.java))
}
}
Related Topics
How to Add Java.Awt.Image Package in Android
How to Downsample Images Correctly
How to Create Turn-By-Turn Gps Navigation App on Android/iOS Using Google Maps
React Native Android Build Failed. Sdk Location Not Found
How to Make a Scroll Listener for Webview in Android
Voice Recognition on Android with Recorded Sound Clip
How to Hide the System Bar in Android 3.0? It's an Internal Device and I'm Managing Navigation
Deleting Android Sms Programmatically
Why Does Eclipse Automatically Add Appcompat V7 Library Support Whenever I Create a New Project
Webview Shouldinterceptrequest Example
Get the Id of a Drawable in Imageview
System Is Returning Error 127 When Called from C++ in Linux
Datepicker Dialog Without Calendar Visualization in Lollipop [Spinner Mode]