我已經使用了一種服務,以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,因此只能在主線程中完成),則該處理程序必須與主線程關聯。請檢查編輯。 –