当我的应用程序不在前台时,如何检查用户不活动

How do I check user inactivity while my app isn't on foreground

我的应用程序将在后台 运行,如果用户在 10 秒后未在设备上活动,则会提醒用户。 我不能使用以下方法,因为屏幕应该一直保持打开状态。

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

我发现的另一种方法是在 activity 上重写 OnUserInteraction()。 但它似乎只适用于我们应用程序的 activity。我想要的是知道用户是否正在交互,即使应用程序不在前台,即没有用户界面。 是否有任何特定方法可以在不使用屏幕超时的情况下执行此操作? 是否可以通过服务知道我的设备是否处于非活动状态?

好吧,我自己找到了方法,谢谢大家的建议。 使用使用 WindowManagerLayoutParams(0,0,0,0) 设置叠加层的服务,然后使用 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 标志。这将 return 一个名为 OUTSIDE_TOUCHMotionEvent,它帮助我检测屏幕上任何地方的触摸,即使我的应用程序不在前台也是如此。

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() 来查明我的设备在特定时间内是否处于活动状态。