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

后端 未结 6 1033
情话喂你
情话喂你 2020-12-02 15:36

I am developing an Android app and I want to detect when the user exits my app either by clicking the Back button or the Home button.

Also, an event like onIn

6条回答
  •  半阙折子戏
    2020-12-02 16:31

    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.

提交回复
热议问题