我正在做一个关于 Android Studio的项目。 我需要检测是否在 background 服务中触摸屏幕。 但是在不影响用户使用智能手机的情况下,我会发现屏幕是否触摸到了屏幕上的屏幕。
我说"在后台检测"时,应用的效果不会影响用户在屏幕上所做的事情。 我的进度 below 应该解释我在这里的意思:
我做了一个应用程序,可以检测用户在 background 中是否通过在android中实现onTouchListener并使用该onTouchListener布局。 我按照网站" http://kpbird.blogspot.com.au/2013/03/android-detect-global-touch-event.html"中的说明进行,并对整个屏幕进行了一些修改,以便检测整个屏幕。
但是,在我运行了创建用于检测屏幕触摸的服务的应用之后,每次用户触摸屏幕时,我的服务( 布局) 都会吸收触摸,所以用户无法正确使用他们的手机。 这是因为布局覆盖整个屏幕,并且在它的下阻止任何触摸信息,所以 icon 不知道有触摸,因此不会对用户做出React。 但我希望我的应用和服务允许用户使用他们的手机正常。
我听说android中的服务是为了不与用户交互而设计的( 例如 。 屏幕触摸) 并在 background 中工作,但是我想知道这是否有一个方法。
下面是我的服务代码:
public 类GlobalTouchService扩展服务实现 OnTouchListener{private String TAG = this.getClass().getSimpleName();
//window manager
private WindowManager mWindowManager;
//linear layout will use to detect touch event
private LinearLayout touchLayout;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
//create linear layout
touchLayout = new LinearLayout(this);
//set layout width 30 px and height is equal to full screen
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
touchLayout.setLayoutParams(lp);
//set color if you want layout visible on screen
//touchLayout.setBackgroundColor(Color.CYAN);
//set on touch listener
touchLayout.setOnTouchListener(this);
//fetch window manager object
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
//set layout parameter of window manager
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,//width is equal to full screen
WindowManager.LayoutParams.MATCH_PARENT,//height is equal to full screen
WindowManager.LayoutParams.TYPE_PHONE,//Type Phone, These are non-application windows providing user interaction with the phone (in particular incoming calls).
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,//this window won't ever get key input focus
PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.LEFT | Gravity.TOP;
Log.i(TAG,"add View");
mWindowManager.addView(touchLayout, mParams);
}
@Override
public void onDestroy() {
if(mWindowManager!= null) {
if(touchLayout!= null) mWindowManager.removeView(touchLayout);
}
super.onDestroy();
}
public void showAlert(View view) {
AlertDialog.Builder myAlertBuilder = new AlertDialog.Builder(this);
myAlertBuilder.setMessage(getString(R.string.alertMessage))
. setTitle(getString(R.string.alertTitle))
. setPositiveButton(getString(R.string.alertPositiveChoice), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
. setNegativeButton(getString(R.string.alertNegativeChoice), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
onDestroy();
}
});
AlertDialog myAlert = myAlertBuilder.create();
myAlert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
myAlert.show();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)
//Log.i(TAG,"Action :" + event.getAction() +"t X :" + event.getRawX() +"t Y :" + event.getRawY());
View myView = null;
//showAlert(myView);
///
return false;
}
}