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.