콜백 기반 이벤트 처리 메커니즘


이 섹션 소개

3.1에서는 Android의 이벤트 처리 메커니즘, 즉 듣기 기반 이벤트 처리 메커니즘을 연구했습니다. 이벤트 소스(구성 요소)에 리스너를 추가한 다음 사용자가 이벤트를 트리거하면 다양한 이벤트에 따라 처리할 리스너로 전달됩니다. 다양한 작업을 수행합니다. 그렇다면 콜백 기반 이벤트 처리 메커니즘의 원리는 무엇입니까? 좋아요, 질문 하나 더: 아시죠? 메서드 콜백이란 무엇인가요? 당신은 알고 있나요? 많은 친구들이 알고 있지만 표현하지 못하는 경우가 많은 것 같아요! 좋아, 우리는 이 질문들에 대해 안드로이드 이벤트 처리 메커니즘에서 콜백 이벤트 처리 메커니즘을 분석해 보겠습니다!


1. 메소드 콜백이란?

텍스트 설명:

답변: 함수 정의와 함수를 분리하는 수단으로, Java에서 콜백은 인터페이스를 통해 구현됩니다. 시스템 아키텍처로서 자체 운영 환경을 갖추고 사용자에게 구현 인터페이스를 제공해야 합니다. 통합된 인터페이스와 다양한 구현을 달성하기 위해 시스템은 구현 클래스를 다양한 상태에서 "콜백"하여 인터페이스와 구현을 분리합니다.

간단한 예:

예: 금요일에 학교에서 집에 와서 엄마에게 밥이 익었는지 물었더니 엄마가 아직 밥을 안 지었다고 하더군요. 당신은 그녀에게 이렇게 말했습니다. 엄마, 밥 지을 때 전화 좀 해주세요! 분석: 당신과 엄마는 이 인터페이스를 통해 엄마에게 요리를 요청합니다. 또한 이 인터페이스를 사용하여 "밥이 익었습니다"라는 피드백을 제공합니다!

2. Android 콜백 이벤트 처리 메커니즘에 대한 자세한 설명:

Android에는 콜백 기반 이벤트 처리 메커니즘에 대한 두 가지 사용 시나리오가 있습니다.

1) 사용자 정의 보기

사용자가 GUI 구성 요소에서 이벤트를 실행하는 경우 구성 요소에 고유한 특정 메서드가 있는 경우 이벤트 처리를 담당합니다. 일반적인 사용법: 기본 GUI 컴포넌트를 상속받아 해당 컴포넌트의 이벤트 처리 방식을 다시 작성합니다. 즉, 뷰를 사용자 정의합니다. 참고: xml 레이아웃에서 사용자 정의 보기를 사용하는 경우 "정규화된 클래스 이름"을 사용해야 합니다.

공통 보기 구성 요소의 콜백 메서드:

Android는 보기와 함께 GUI 구성 요소에 대한 일부 이벤트 처리 콜백 메서드를 제공합니다. 예를 들어 다음과 같은 방법이 있습니다

①이 컴포넌트에서 화면 이벤트 트리거: boolean onTouchEvent(MotionEvent 이벤트);
②이 컴포넌트에서 버튼을 눌렀을 때: boolean onKeyDown(int keyCode,KeyEvent event);
③컴포넌트 해제 컴포넌트에서 버튼이 눌렸을 때 눌림: boolean onKeyUp(int keyCode,KeyEvent event);
4구성요소의 버튼을 길게 눌렀을 때: boolean onKeyLongPress(int keyCode,KeyEvent event);
⑤키보드 단축키 이벤트 발생: boolean onKeyShortcut(int keyCode,KeyEvent 이벤트);
⑥컴포넌트에서 트랙볼 화면 이벤트 트리거: boolean onTrackballEvent(MotionEvent event);
*7컴포넌트의 포커스가 변경되면 이 메서드는 이전 6과 다릅니다. 에서만 다시 작성할 수 있습니다. 보다! protected void onFocusChanged(boolean GainFocus, int 방향, Rect 이전 FocusedRect)

또한 트랙볼이 무엇인지 설명하지만 웹을 탐색할 때 이전 BlackBerry 휴대폰에서 볼 수는 없습니다. 언제 , 트랙볼을 마우스로 생각할 수 있지만 onTouchEvent를 사용하여 이 작업을 해결할 수 있으며 충분히 아름답지 않으므로 이제 매우 유용하며 기본적으로 필요하지 않습니다. 관심이 있고 보고 싶다면 원래 Android 에뮬레이터에서 f6을 눌러 볼 수 있습니다.

1.png

코드 예:MyButton 클래스를 사용자 정의하여 Button 클래스를 상속합니다. , 그런 다음 onKeyLongPress 메서드를 재정의합니다. 그런 다음 xml 파일의 정규화된 클래스 이름을 통해 사용자 정의 보기를 호출합니다.

렌더링은 다음과 같습니다.

2.jpg

간단한 버튼, 버튼을 클릭한 후 onTouchEvent 이벤트가 트리거되고, 버튼을 누르면 onTouchEvent 이벤트가 트리거됩니다. 시뮬레이터 시간의 키보드, onKeyDown 이벤트는 눌려지면 트리거되고, onKeyUp 이벤트는 키보드에서 나갈 때 트리거됩니다! Logcat을 통해 확인해보자!

3.jpg

구현 코드: MyButton.java

public class MyButton extends Button{
private static String TAG = "haha";
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs)
}

//키보드 누르기에 의해 트리거되는 트리거 다시 작성 이벤트
       @Override
     공개 부울 onKeyDown(int keyCode, KeyEvent 이벤트) {
                                                            onKeyD 소유                                                          onKeyDown                            
}

/ /키보드 팝업으로 트리거된 이벤트 무시
        @Override               public boolean onKeyUp(int keyCode, KeyEvent event) {
          super.onKeyUp(keyCode, 이벤트);                                                               사용 사용 사용   사용   사용   사용 사용      out out out off   out of   under  ‐      ‐  ‐                                                     true를 반환
}

//구성 요소가 터치되었습니다
@Override
공개; boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
Log.i(TAG,"onTouchEvent 메소드가 호출됨")
}
}

레이아웃 파일:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools "
 android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">

 <example.jay.com.mybutton.MyButton
 및 roid:layout_width="wrap_content"
android:layout_height="wrap_content"
 android:text="Button"/>

코드 분석:

Button의 세 가지 콜백 메서드를 직접 재정의했기 때문에 클릭 이벤트가 발생할 때 필요가 없습니다. Java 파일에서 수행합니다. 이벤트 리스너의 바인딩은 콜백을 완료할 수 있습니다. 즉, 구성 요소가 해당 이벤트를 처리합니다. 즉, 이벤트 소스(구성 요소) 자체가 이벤트를 처리합니다!


2) 콜백 기반 이벤트 전파:

4.jpg

결론적으로, 외부로 전파할지 여부는 메서드의 반환 값이 true인지 false인지에 따라 다릅니다.

코드 예:

public; class MyButton은 Button{
private static String TAG = "haha";
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs)
}

//키보드 누름에 의해 트리거된 이벤트 다시 작성
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Log.i(TAG, "사용자 정의 버튼의 onKeyDown 메소드가 호출되었습니다.")
return false;

main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/ tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context=".MyActivity">  ㅋㅋㅋ       android:id="@+id/btn_my "/>  
</LinearLayout>

MainActivity.java:

public 클래스 MyActivity는 ActionBarActivity를 확장합니다.{  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_my);  
  
        버튼 btn = (버튼)findViewById(R.id.btn_my);  ㅋㅋㅋ  if(event.getAction() == KeyEvent.ACTION_DOWN)  
               {  
                  Log.i ("呵呵","监听器的onKeyDown방법被调사용");  
             }  
             false를 반환합니다.  
           } });  
    }  
  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        super.onKeyDown(keyCode, event);  
        Log.i("呵呵","Activity的onKeyDown방법被调사용");  
        false를 반환합니다.  
    }  
}

실행 중인 스크린샷:

5.jpg

결과 분석: 위의 실행 결과에서 전파 순서는 다음과 같습니다. Listener--->View 구성 요소 콜백 메서드--->Activity 콜백 메서드;


이 섹션 요약

이 섹션에서는 Android 이벤트 처리 메커니즘 중 콜백 기반 이벤트 처리 메커니즘을 설명합니다! 핵심은 이벤트 전파 순서입니다. 리스너가 우선순위를 갖고 View 구성요소 자체에 우선순위를 두고 마지막으로 Activity에 false가 계속 전파되고 true가 전파를 종료합니다~!