经过更多的研究和测试后,我已经找到了解决方案。
我做的是创建一个后台服务,在其中获取WindowManager的实例并添加一个零大小视图,该视图会在用户触摸其外部时得到通知...但由于视图大小为零,因此它每次都可能被调用。
我们可以在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 获取正在运行的任务,这是一种非常有效的方式来确定用户是否正在与手机交互。