我已经使用了一种服务,以3秒为间隔将代码发布到处理程序,以继续生成简单的触摸事件(按下按钮)。在后台线程中模拟Android中的触摸事件
这是该服务的代码:
public class BackgroundTouchService extends IntentService
{
public BackgroundTouchService() {
super("BackgroundTouchService");
}
@Override
protected void onHandleIntent(Intent intent)
{
final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_BUTTON_PRESS, 400, 400, 0);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
View v = new View(getApplication());
v.onTouchEvent(event);
handler.postDelayed(this, 3000);
}
});
}
}
以我UI,我已经覆盖有按钮在屏幕上(用适当的监听器),这样我可以很容易地发现已经按下了哪个按钮。然而,主要活动加载,然后没有任何反应。为什么是这样?
编辑: 由于VojtěchSáze正确指出,上述代码中的处理程序与主线程没有关联,因此无法通过生成触摸事件来修改UI。因此,我在主要活动本身编写了处理程序的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startTouch();
}
private void startTouch()
{
final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_BUTTON_PRESS,400.0f, 400.0f, 0);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
onTouchEvent(event);
handler.postDelayed(this, 3000);
}
});
}
}
但是,这仍然没有任何作用。有任何想法吗?
SOLUTION: 好,所以我原本指定ACTION_BUTTON_PRESS的MotionEvent.obtain方法的事件类型的参数,但是,当我用不同的活动来分别指定ACTION_DOWN和ACTION_UP,这似乎工作。 任何解释为什么发生这种情况是受欢迎的。 万一有人需要这个,这里是代码:
final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN,400.0f, 400.0f, 0);
final MotionEvent event2 = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP, 400.0f, 400.0f, 0);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
dispatchTouchEvent(event);
dispatchTouchEvent(event2);
handler.postDelayed(this, 3000);
}
});
你说得对。如果处理程序必须生成触摸事件(它被分类为修改UI,因此只能在主线程中完成),则该处理程序必须与主线程关联。请检查编辑。 –