从MainActivity
启动一项服务public void buttonClicked(View v){
//method to call after button is clicked in MainActivity
if(v.getTag() == null){
globalService = new Intent(this,GlobalTouchService.class);
startService(globalService);//start the service
v.setTag("on");
Toast.makeText(this, "Start Service", Toast.LENGTH_SHORT).show();
}
else{
stopService(globalService);
v.setTag(null);
Toast.makeText(this, "Stop Service", Toast.LENGTH_SHORT).show();
}
}
在服务的OnCreate内部,创建一个透明布局并实现Touch Listener。
public class GlobalService extends Service{
@Override
public void onCreate() {
super.onCreate();
// create linear layout
touchLayout = new LinearLayout(this);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
touchLayout.setLayoutParams(lp);
// 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,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mWindowManager.addView(touchLayout, mParams);
touchLayout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("Action :" + event.getAction() + "\t X :" + event.getRawX() + "\t Y :"+ event.getRawY());
return false;
}
});
}
由于onTouch返回false,当我们单击透明布局上方时,控件应移动到背景MainActivity。 但事实并非如此。可能是什么原因?
答案 0 :(得分:2)
我不认为控件应该转移到后台MainActivity - 这将是 主要 安全风险,因为您可以实现某些功能像触摸事件记录器。获得已记录的触摸事件列表后,您可以将它们映射到单独键盘键的坐标并泄漏用户的密码!
操作系统以这种方式行事绝对没有意义。
答案 1 :(得分:0)
由于服务不属于您的活动,因此您收到的所有活动都无法进入活动。如果您想要的只是让事件通过,您可以通过使新图层不可触摸来实现:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
但是你必须考虑到你赢得在听众中获取事件。