After several studies and trials, I managed to get up with a solution.
What I did was create a background service in which I get an instance of WindowManager and add a view of zero size that receives a notification of the user touching outside of it ... but since the view is of zero size, it can be called every time. To do this, we can check https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
InactivityService.java , , .
, , .
public class InactivityService extends Service {
protected static final String LOG_TAG = InactivityService.class.getSimpleName();
private boolean isAdded = false;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(!isAdded){
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
0, 0, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
View view = new View(this);
view.setOnTouchListener(new OnTouchListener() {
@SuppressLint("DefaultLocale")
@Override
public boolean onTouch(View v, MotionEvent event) {
GregorianCalendar calendar = new GregorianCalendar();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(InactivityService.this);
String log = prefs.getString(LOG_KEY, "");
log = String.format("User interaction detected at: %02d:%02d:%02d \n%s",
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND),
log);
prefs.edit().putString(LOG_KEY, log).commit();
return false;
}
});
wm.addView(view, params);
}
return START_STICKY;
}
}
:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
, ActivityManager - , .