Как проверить неактивность пользователя, когда мое приложение не на переднем плане - PullRequest
1 голос
/ 19 февраля 2020

Мое приложение будет работать в фоновом режиме и уведомит пользователя, если он не активен на устройстве через 10 секунд. Я не могу использовать следующий метод, поскольку предполагается, что экран постоянно включен.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();

Другой найденный мною метод - переопределение OnUserInteraction() для активности. Но, похоже, это влияет только на активность нашего приложения. Я хочу знать, взаимодействует ли пользователь, даже если приложение не на переднем плане ie, пользовательского интерфейса нет. Есть ли какой-либо конкретный метод c, чтобы сделать это без использования тайм-аута экрана? Можно ли узнать, что мое устройство неактивно с помощью службы?

1 Ответ

0 голосов
/ 21 февраля 2020

Ну я сам нашел способ, спасибо за предложения, ребята. Используйте Сервис, который устанавливает оверлей, используя 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 времени.

...