How do I detect if the user has left my app?

Note: This only works if your target is >= API14


You can also use Application.registerActivityLifecycleCallbacks() and when any activity pauses post a delayed Runnable (that will invoke when user lefts app) to Handler. When activities are created/started/resumed you remove that Runnable from Handler. So when you navigate inside your app you always cancel that Runnable, but if another activity not from your app is activated – the Runnable will be invoked.

I used this to logout user when he lefts my app, here’s code for callbacks:

public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {

    private Handler handler;
    private Runnable runLogout = new Runnable() {
        @Override
        public void run() {
            //logoutUser()
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();

        registerActivityLifecycleCallbacks(this);
        handler = new Handler(getMainLooper());
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityStarted(Activity activity) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityResumed(Activity activity) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityPaused(Activity activity) {
        handler.postDelayed(runLogout, 1000);
    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}

However, Runnable will run not in the context of activity lifecycle, so to use this in activity you would need to set and check some application-wide flag or broadcast an intent.

Leave a Comment