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