当我的应用程序不在前台时,如何检查用户不活动
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。我想要的是知道用户是否正在交互,即使应用程序不在前台,即没有用户界面。
是否有任何特定方法可以在不使用屏幕超时的情况下执行此操作?
是否可以通过服务知道我的设备是否处于非活动状态?
好吧,我自己找到了方法,谢谢大家的建议。
使用使用 WindowManager
和 LayoutParams(0,0,0,0)
设置叠加层的服务,然后使用
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
标志。这将 return 一个名为 OUTSIDE_TOUCH
的 MotionEvent
,它帮助我检测屏幕上任何地方的触摸,即使我的应用程序不在前台也是如此。
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()
来查明我的设备在特定时间内是否处于活动状态。
我的应用程序将在后台 运行,如果用户在 10 秒后未在设备上活动,则会提醒用户。 我不能使用以下方法,因为屏幕应该一直保持打开状态。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
我发现的另一种方法是在 activity 上重写 OnUserInteraction()
。
但它似乎只适用于我们应用程序的 activity。我想要的是知道用户是否正在交互,即使应用程序不在前台,即没有用户界面。
是否有任何特定方法可以在不使用屏幕超时的情况下执行此操作?
是否可以通过服务知道我的设备是否处于非活动状态?
好吧,我自己找到了方法,谢谢大家的建议。
使用使用 WindowManager
和 LayoutParams(0,0,0,0)
设置叠加层的服务,然后使用
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
标志。这将 return 一个名为 OUTSIDE_TOUCH
的 MotionEvent
,它帮助我检测屏幕上任何地方的触摸,即使我的应用程序不在前台也是如此。
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()
来查明我的设备在特定时间内是否处于活动状态。