Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect user inactivity in Android

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.

like image 343
Akh Avatar asked Nov 17 '10 20:11

Akh


2 Answers

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();     } } 
like image 113
gfrigon Avatar answered Sep 25 '22 00:09

gfrigon


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.

like image 31
Fredrik Wallenius Avatar answered Sep 22 '22 00:09

Fredrik Wallenius