Ну я сам нашел способ, спасибо за предложения, ребята. Используйте Сервис, который устанавливает оверлей, используя WindowManager
с LayoutParams(0,0,0,0)
, а затем используйте флаг WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
. Это вернет MotionEvent
с именем OUTSIDE_TOUCH
, что помогло мне обнаружить касание в любом месте экрана, даже если мое приложение не на переднем плане.
int overlayType = Build.VERSION.SDK_INT < Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
0, 0, 0, 0,
overlayType,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
touchListenerView = new View(this);
touchListenerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
handleInactive(event);
return false;
}
});
wm.addView(touchListenerView, params);
Я могу использовать это и handler.postDelayed()
чтобы узнать, является ли мое устройство активным или неактивным в течение указанного c времени.