I have an android application i need one function or any broadcast receiver that can check if the app is closed.. i don't need to call on destroy in every activity (there is about 20 activity into the app) i tried to add this function in Application class
public class ApplicationLifeCycleManager implements ActivityLifecycleCallbacks {
/** Manages the state of opened vs closed activities, should be 0 or 1.
* It will be 2 if this value is checked between activity B onStart() and
* activity A onStop().
* It could be greater if the top activities are not fullscreen or have
* transparent backgrounds.
*/
private static int visibleActivityCount = 0;
/** Manages the state of opened vs closed activities, should be 0 or 1
* because only one can be in foreground at a time. It will be 2 if this
* value is checked between activity B onResume() and activity A onPause().
*/
private static int foregroundActivityCount = 0;
/** Returns true if app has foreground */
public static boolean isAppInForeground(){
return foregroundActivityCount > 0;
}
/** Returns true if any activity of app is visible (or device is sleep when
* an activity was visible) */
public static boolean isAppVisible(){
return visibleActivityCount > 0;
}
public void onActivityCreated(Activity activity, Bundle bundle) {
}
public void onActivityDestroyed(Activity activity) {
Log.wtf("destroyed","app closed!!");
}
public void onActivityResumed(Activity activity) {
foregroundActivityCount ++;
}
public void onActivityPaused(Activity activity) {
foregroundActivityCount --;
}
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
public void onActivityStarted(Activity activity) {
visibleActivityCount ++;
}
public void onActivityStopped(Activity activity) {
visibleActivityCount --;
}
}
Also i have registered in on create in Application class
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ApplicationLifeCycleManager());
}
but the onPaused and onResumed and onDestroyed function is called when i switch between activity: because it detects whether any activity is closed or destroyed or even resumed
so any solution to check whether the app is closed in one function??
This answer uses ProcessLifecycleOwner to detect application visibility.
which is a part of Android Architecture Component .
implementation "android.arch.lifecycle:extensions:1.1.1"
public class AppController extends Application implements LifecycleObserver {
///////////////////////////////////////////////
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onEnterForeground() {
Log.d("AppController", "Foreground");
isAppInBackground(false);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onEnterBackground() {
Log.d("AppController", "Background");
isAppInBackground(true);
}
///////////////////////////////////////////////
// Adding some callbacks for test and log
public interface ValueChangeListener {
void onChanged(Boolean value);
}
private ValueChangeListener visibilityChangeListener;
public void setOnVisibilityChangeListener(ValueChangeListener listener) {
this.visibilityChangeListener = listener;
}
private void isAppInBackground(Boolean isBackground) {
if (null != visibilityChangeListener) {
visibilityChangeListener.onChanged(isBackground);
}
}
private static AppController mInstance;
public static AppController getInstance() {
return mInstance;
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
// addObserver
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
}
And use it like this:
AppController.getInstance().setOnVisibilityChangeListener(new ValueChangeListener() {
@Override
public void onChanged(Boolean value) {
Log.d("isAppInBackground", String.valueOf(value));
}
});
Don't forget to add application name
into your manifest
<application
android:name="myPackageName.AppController"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"">
Done.
(Kotlin example)