【问题标题】:longpress functionality doesnt work on a service?长按功能不适用于服务?
【发布时间】:2013-10-23 10:30:11
【问题描述】:

我尝试了一个代码来检测手机上任意位置的长按。是这样的:

WindowManager wm;
View myview;
LayoutInflater li;

@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.RIGHT | Gravity.TOP;
    myview = li.inflate(R.layout.traslucent, 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.setOnLongClickListener(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 onLongClick(View arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "LongPress", Toast.LENGTH_SHORT).show();
    return false;
}

它没有检测到长按,但我尝试了一个类似的活动代码,它工作得很好。这是代码:

公共类testlongpress扩展Activity实现OnLongClickListener、OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    LayoutInflater li = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    View v = li.inflate(R.layout.test_layout, null);
    v.setOnLongClickListener(this);
    setContentView(v);
}

@Override
public boolean onLongClick(View arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "LongPress", Toast.LENGTH_SHORT).show();
    return true;
    }
}

我的问题是为什么它不能在活动上运行,但不能在服务上运行?

【问题讨论】:

  • 一个服务没有UI,用户在按什么?

标签: android service android-activity long-press


【解决方案1】:

根据 Android 文档

Service 是一个应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。

你不能在 Service 上进行 UI 操作,屏幕上显示的任何视图都是由 Activity 的 UI 而不是服务组成的。

有关更多信息,请查看official documentation 服务。

【讨论】:

  • 但我的布局包含一个云,即使在活动结束后也一直出现。这并不意味着我的服务处于活动状态并且正在更改 UI。如果这不是方法,那么有没有办法检测长按?
  • 是的,只在activity中写同样的方法。
  • @david 查看他附上的代码。它显然使用了带有外部触摸标志的窗口管理器。
  • 发布完整的课程,告诉我这个课程正在扩展什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2021-08-16
  • 1970-01-01
  • 2011-05-24
  • 2021-03-11
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多