User start my app and logs in.
Selects Session Timeout to be 5 mins.
Does some operations on the app. (all in foreground)
Now User bring Myapp to background and starts some other app.
----> Count down timer starts and logs out user after 5 mins
OR user turns the screen OFF.
----> Count down timer starts and logs out user after 5 mins
I want the same behavior even when the app is in the foreground but user doesn't interact with the app for a long-time say 6-7 mins. Assume the screen is ON all the time. I want to detect kind of user inactivity (No interaction with app even though the app is in the foreground) and kick start my count down timer.
I came up with a solution that I find quite simple based on Fredrik Wallenius's answer. This a base activity class that needs to be extended by all activities.
public class MyBaseActivity extends Activity { public static final long DISCONNECT_TIMEOUT = 300000; // 5 min = 5 * 60 * 1000 ms private static Handler disconnectHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { // todo return true; } }); private static Runnable disconnectCallback = new Runnable() { @Override public void run() { // Perform any required operation on disconnect } }; public void resetDisconnectTimer(){ disconnectHandler.removeCallbacks(disconnectCallback); disconnectHandler.postDelayed(disconnectCallback, DISCONNECT_TIMEOUT); } public void stopDisconnectTimer(){ disconnectHandler.removeCallbacks(disconnectCallback); } @Override public void onUserInteraction(){ resetDisconnectTimer(); } @Override public void onResume() { super.onResume(); resetDisconnectTimer(); } @Override public void onStop() { super.onStop(); stopDisconnectTimer(); } }
I don't know a way of tracking inactivity but there is a way to track user activity. You can catch a callback called onUserInteraction() in your activities that is called every time the user does any interaction with the application. I'd suggest doing something like this:
@Override public void onUserInteraction(){ MyTimerClass.getInstance().resetTimer(); } If your app contains several activities, why not put this method in an abstract super class (extending Activity) and then have all you activities extending it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With