Android 后退按钮,列表视图在服务中不工作?

Android 后退按钮,列表视图在服务中不工作?,android,listview,service,Android,Listview,Service,我做了一项服务来创建一个系统覆盖(按钮),用于检测长时间的按压。这是我的代码: public class myservice extends Service implements OnTouchListener { WindowManager wm; View myview; LayoutInflater li; Button b; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated metho

我做了一项服务来创建一个系统覆盖(按钮),用于检测长时间的按压。这是我的代码:

public class myservice extends Service implements OnTouchListener {
WindowManager wm;
View myview;
LayoutInflater li;
Button b;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    System.out.println("\n=\n=\n=\n" + "oncreate service" + "\n=\n=\n=\n");

    li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            //WindowManager.LayoutParams.TYPE_INPUT_METHOD |
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY |
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            //WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    System.out.println("\n=\n=\n=\n" + "lp " + params + "\n=\n=\n=\n");

    params.gravity = Gravity.CENTER;
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
    myview = li.inflate(R.layout.test_layout, null);
    System.out.println("\n=\n=\n=\n" + "View inflated" + "\n=\n=\n=\n");

    System.out.println("\n=\n=\n=\n" + "Layout inflator = " + li + "\nWindow manager = " + wm + "\nparams = " + params + "\nView = " + myview + "\n=\n=\n=\n");


    myview.setOnTouchListener(this);
    System.out.println("\n=\n=\n=\n" + "On touch listener" + "\n=\n=\n=\n");

    wm.addView(myview, params);
    System.out.println("\n=\n=\n=\n" + "add view" + "\n=\n=\n=\n");


}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    wm.removeView(myview);
    myview=null;
}

@Override
public boolean onTouch(View arg0, MotionEvent event) {
    // TODO Auto-generated method stub
    System.out.println("\n=\n=\n=\n Inside On Touch method \n=\n=\n=\n");

    if(event.getAction()==MotionEvent.ACTION_DOWN) {
        Toast.makeText(getApplicationContext(), "Press", Toast.LENGTH_SHORT).show();
        System.out.println("\n=\n=\n=\ntouch " + event.getX() + " " + event.getY() + "\n=\n=\n=\n");
        return true;
        }
    return false;
}
它应该允许用户正常使用手机,除非用户按下按钮。但我注意到“后退”按钮不起作用,我手机上的列表视图(如联系人、闹钟、信息、whatsapp列表)也不再可点击。单击列表项时,它会显示正常动画,但不会打开任何内容

我试图找出错误并发现了

  • 当我添加TYPE_SYSTEM_ALERT时,问题仍然存在
  • 当我添加TYPE_SYSTEM_OVERLAY和not use TYPE_SYSTEM_时,警报问题消失了,但现在按钮不可点击,它就像一个永久图像,没有任何用途(不是我想要的)
  • 图标在它的“后退”按钮和列表视图中工作得非常好。为什么?我该如何纠正它

  • 使用
    类型系统警告
    而不是
    类型系统覆盖
    (不再接收来自4.3的点击)
  • 不要将窗口类型和窗口类型放在一起-这不是它们的工作方式

  • 正如您从我的评论中所看到的,我还使用了许多文章中关于如何实现这一点的类似示例代码。由于某种原因,“后退”按钮停止工作(在2台设备上)

    现在它正在工作-遗憾的是,我不知道修复是什么:

    • 我将
      onTouch()
      的返回值从
      false
      更改为
      true
      ,然后再次返回

    • 我之前给
      参数指定了一个标题,但我去掉了它

    但现在,无论我做什么,我似乎都不能再打破按钮了。很遗憾,我想知道如何在系统范围内禁用后退按钮


    对我来说,这意味着对项目进行清理和重建的老把戏。或者这可能是因为我们正在使用“黑客”来做覆盖的事情


    顺便说一句,这些列表也再次发挥作用。很抱歉,我无法提供更多帮助。

    为什么您要使用
    服务
    直接与UI交互?我是否可以有一个活动,可以在每次长按时检测到它?@Squonk我需要长按,我不能使用活动,因为它不会持续(用户可以关闭它,而且它并不总是在顶部,毫无意义)因此我无法使用该服务。现在,这一切有中间立场吗,或者我有办法解决这个问题吗?“……有办法解决这个问题吗?”我真的不明白你的问题是什么。用户可以在他们的设备上使用很多应用程序,但是你想在上面覆盖一些东西吗???我需要制作一个按钮,当长按该按钮时,该按钮将被激活,用户可以从手机上的任何位置访问该按钮。我已经能够制作这样一个按钮。但现在的问题是,手机上的列表视图和后退按钮不能正常工作。我试着通过点击这个名字来打电话,但它并没有点击,只是显示了一个来回的动画,就像闹钟和whatsapp联系人一样。