기존에 자바를 공부하면서 GUI에 대한 작업은 그렇게 많이 하지 않았기 때문에 이벤트 핸들러 부분에 대해서는 안드로이드를 공부하면서 더 자세히 알게 된 것 같다. 이벤트를 처리하기 위해서는 특정 이벤트에 대해 정의된 콜백 메서드를 사용하여 처리할 수 있는데 여기서 콜백 메서드란 특정 이벤트가 발생하였을 때 시스템에 의해서 자동으로 호출 되는 메서드를 말한다. 다음의 4가지의 콜백 메서드가 안드로이드에서 사용되는 가장 대표적인 것이다.
 boolean onTouchEvent(MotionEvent event)  화면을 터치할 때 발생
 boolean onKeyDown(int keyCode, KeyEvent event)  입력장치(키보드)를 눌렀을 때 발생
 boolean onKeyUp(int keyCode, KeyEvent event)  입력장치(키보드)를 눌렀다 떼었을 때 발생
 boolean onTrackballEvent(MotionEvent event)  트랙볼에 움직임이 발생했을 때 발생
 위의 콜백 메서드 모두 View 클래스로부터 상속받아 재정의 하여 이벤트 발생시의 처리내용들을 정의 할 수 있다. 위의 콜백 메서드의 파라미터인 event파라미터로 이벤트에 대한 상세정보들을 얻을 수 도 있다. 아래의 코드는 바로 View의 onTouchEvent 콜백 메서드를 사용한 것이다. 
 콜백 메서드를 사용하기 위해서는 항상 super클래스를 상속받아 재정의 해야 하는 번거러움이 생기게된다. 자주 발생하는 이벤트야 상관 없다 하여도 안드로이드에서 사용할 수 있는 이벤트의 종류느 매우 많다. 이를 모두 상속받아 재정의 하기 보다는 좀 더 범용적이고 간편한 방법으로 나온 것이 바로 이벤트리스너(Listener)를 사용하는 방법이다.

 다음 코드는 간단하게 버튼 하나를 클릭 했을 때 OK라는 메세지를 출력 할 수 있도록 이벤트 리스너를 등록 하는 것이다.
 리스너 객체를 생성하고 이를 set이벤트리스너()를 이용하여 이벤트 핸들러를 등록 시키는 방식으로, 리스너 객체를 생성하는 방법은 또 여러가지가 있다. 크게 Activity 자체가 implements를 이용하여 리스너인터페이스를 구현하는 방법과 View가 리스너를 구현하는 방식, 그리고 위 처럼 익명클래스를 사용하여 구현하는 방법이있다. 익명클래스를 사용하는 경우가 위와 같이 단 하나의 버튼에 대한 이벤트처리를 위한 리스너 이기 때문에 일회성으로 사용할 때 주로 사용한다.

PS. 이벤트 핸들러에도 우선순위가있다.
 - 이벤트를 처리하는 방식에 크게 2가지로 콜백메서드를 사용하는 방법과 리스너를 사용하는 방법이 있다고 하였다. 그렇다면 이 두가지를 모두 사용한다면 어떤 이벤트가 더 높은 우선순위를 갖게 될까? 정답은 리스너 이다. 더 자세히 나눠보면
 1. View의 리스너
 2. View의 콜백 메서드
 3. Activity의 콜백 메서드
순서로 우선순위를 갖게된다. 물론 이벤트 핸들러 자체가 이벤트 처리 수행과정이 종료되면 true를 리턴해 종료가 되기 때문에 이벤트가 3번 다 일어나는 것은 아니고 한번만 실행 되고 종료가 된다. 하지만 시스템적으로 이러한 우선순위가 있다는 것을 알아두면 도움이 될 날이 있을 것 같다.

+ Recent posts