디스패치 이벤트 or 프리임 핸들러
디스패처(Dispatcher) 이벤트 란?
망의 전송 링크나 노드에 장애가 발생하는 것과 같은 이벤트를 탐지하여 보고하는 실체(이벤트 소스)와 그 보고를 받아서 반응하는 실체(이벤트 싱크) 간의 중간 매개 역할을 하는 기능 또는 장치.
(네이버 정의)본론)
가상키를 이용하여 엉망으로 만들기 (Making a mess with virtual Keys)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
// Take care of calling this method on earlier versions of
// the platform where it doesn't exist.
onBackPressed();
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
// This will be called either automatically for you on 2.0
// or later, or by the code above on earlier versions of the
// platform.
return;
}
하드 코어용: 올바르게 이벤트 처리하기
다룰 가치가 있는 마지막 주제는 onDispatchEvent() 또는 onPreIme() 와 같은 원시 dispatch 함수에서 올바르게 이벤트를 다루는 방법이다. onKeyDown() 과 같은 고수준 함수를 호출할 때 프레임워크가 제공하는 도움을 받을 수 없기 때문에, 이것들에 대해서는 좀 더 많은 주의가 요구된다. 아래 코드는 BACK 키가 릴리즈 될 때 올바르게 액션을 수행하기 위한 BACK 키 처리를 가로채는 방법을 보여준다.
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
// Tell the framework to start tracking this event.
getKeyDispatcherState().startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
getKeyDispatcherState().handleUpEvent(event);
if (event.isTracking() && !event.isCanceled()) {
// DO BACK ACTION HERE
return true;
}
}
return super.dispatchKeyEvent(event);
} else {
return super.dispatchKeyEvent(event);
}
}
getKeyDispatchState() 호출은 윈도우의 현재 키 상태를 추적하는 데 사용되는 객체를 반환한다. View 클래스에서 일반적으로 사용가능하고 액티비티는 필요하면 그 객체를 가져 오기 위해 임의의 View를 사용할 수 있다.