[220321] 코드리뷰_MainActivity

J·2022년 3월 21일
1

안드로이드

목록 보기
2/29
  • setEnabled() : setEnabled를 알기 위해서는 먼저 isEnabled()를 알아야 한다. isEnabled()는 뷰를 활성/비활성화 상태로 만들어주는 메서드로, false로 설정하면 개발자가 설정해 둔 대로 모양이 바뀌고(아무것도 설정하지 않았다면 바뀌지 않는다.), 터치 이벤트와 여러 메서드의 호출이 무시된다. 즉, 사용 가능한지의 여부이다. 반대로 true로 설정하면 사용 가능한 상태로 상태로 변환되며, 터치 이벤트와 여러 메서드의 호출이 잘 작동된다.
    => 쉽게 말하자면, setEnabled(true)는 활성화, setEnabled(false)는 비활성화이다.

  • AccessibilityManager : 우리말로 번역하면 접근성 관리자라는 뜻으로, 접근성 서비스에 등록된 서비스들은 이 AccessibilityManager 클래스의 영향을 받는데, 시스템에서 발생하는 기본적인 접근성 이벤트 외에 추가적인 이벤트(sendAccessibilityEvent)를 발생시키거나, 시스템에서 접근성 서비스 실행 여부를 캐치하거나, 안드로이드 10에서 추가된 액션 취하기 전 대기시간의 사용자 설정을 가지고 오는 등의 여러 메소드를 포함하고 있다.

  • getEnabledAccessibilityServiceList : 지정된 피드백 유형에 대해 활성화된 접근성 서비스의 AccessibilityServiceInfo를 반환한다. 현재 접근성 권한을 가진 리스트를 가져오게 된다.

  • AccessibilityServiceInfo : 접근성 권한을 가지게 되면 동작하게 되는 부분으로 여기서 연결과 이벤트 발생시 콜백을 받을 수 있습니다.

  • AlertDalog : AlertDialog는 사용자의 전체 화면을 가리지 않으면서 사용자의 응답이나 추가 정보를 입력하도록 하는 작은 창을 의미한다. AlertDialog.Builder 객체를 생성하여 AlertDialog의 다양한 디자인을 구축할 수 있다.

  • setTitle() : Text title(내용) 바꾸는 메소드.

  • startActivityForResult() : 새 액티비티를 열어줌 + 결과 값 전달(쌍방향)
    ① startActivity() : 새 액티비티를 열어줌 (단방향)

  • Intent() : 앱 컴포넌트가 무엇을 할 것인지를 담는 메세지 객체. 메세지는 의사소통을 주고받는 것으로, 메세지를 사용하는 가장 큰 목적은 다른 액티비티, 서비스, 브로드캐스트 리시버, 컨텐트 프로바이더 등을 실행하는 것이다. 인텐트는 그들 사이에서 데이터를 주고 받기 위한 용도로 쓰인다.

  • Settings : Settings provider는 global system-level 장치 기본설정이 포함되어 있다.

//접근성 설정화면으로 이동
        Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
        startActivity(intent);
  • getApplicationContext() : Application Context를 가리킴.

  • Context란? : 안드로이드에는 두가지의 Context가 있다.
    ① Application Context : 어플리케이션 자체와 연동되는 것이므로, 어플리케이션의 life cycle이 지속되는 동안 동일한 객체이다. 즉, 어플리케이션을 종료 후 다시 실행시킬때에만 바뀌는 것이다.
    ② Activity Context : 액티비티와 연동된 것이므로, 그 액티비티를 파괴시키고 다시 시작시키면 activity context도 바뀐다.(한 개의 어플리케이션 내에는 여러 액티비티를 넣을 수 있음).

  • this와 getApplicationContext()의 차이점 : this는 Activity Context를 가리키고, getApplicationContext()는 Application Context를 가리킨다.
    두 종류의 context 중 어느 context를 써도 대부분 별 문제 없는 상황이므로 this를 써도 정상적으로 작동되고, getApplicationContext()를 써도 잘 작동된다.
    this로 오류가 날때는 해당 액티비티가 없어서 그런 것이므로, getApplicationContext()를 넣으면 작동된다.

  • getBaseContext()와 getApplication() :
    ① this = getBaseContext() = Activity Context
    ② getApplicationContext() = getApplication() = Application Context

  • PERMISSION_GRANTED : 퍼미션이 허용되어 있는 상태.

  • PERMISSION_DENIED : 퍼미션이 거부되어 있는 상태.

  • ACTION_MANAGE_OVERLAY_PERMISSION : 현재 패키지명을 넘겨 설정화면을 노출.

  • canDrawOverlays() : 오버레이가 사용 가능한지 체크.

  • Service란? :
    ① 어플리케이션을 구성하는 4대 컴포넌트 중 하나.
    ② 액티비티처럼 상호자와 상호인터렉션하는 컴포넌트가 아니라, 사용자 몰래 화면뒷단에서 동작하는 컴포넌트.
    ③ 백그라운드에서 동작하는 컴포넌트.
    ④ 액티비티와 다르게 UI가 존재하지 않는다.
    ⑤ 서비스의 시작과 종료는 다른서비스, Activity, BroadCast Receiver를 포함한 다른 Application에서도 가능.
    ⑥ 만약 서비스가 실행되고 있는 상태라면, 안드로이드 OS 에선 왠만하면 프로세스를 죽이지 않고 관리한다.

  • Service가 필요한 이유? :
    ① 예를 들어 Activity가 Pause 되거나, 화면에 없어지는 경우(Stop) 음악이 계속 흘러나와야 할 때 또는 파일을 다운로드 해야할 때.
    ② 화면 뒷단, 즉 백그라운드 영역에서 작업을 해야하는 경우.
    ③ 사용자로부터의 특별한 지시가 필요하지 않은 경우.
    음악을 재생시킨다 --> 음악이 흘러나온다
    (특별한 지시가 있을 때까지 음악을 재생시킨다.)
    ④ 어플리케이션이 실행 중이지 않을 때도 작업해야하는 경우 서비스를 사용.
    (어플리케이션이 실행 중일 때만 작업해야하는 경우는 스레드 권장.)

  • Service 구현 방법 :
    ① startService : startService() 함수를 호출해서 서비스를 시작하면, 시작타입의 서비스가 실행된다. 시작타입의 서비스는 한 번 시작되면, 백그라운드에서 무한정 실행되지만, 보통의 경우는 일처리를 다 완료하면 서비스가 종료된다. 시작타입의 서비스는 호출한 곳에 결과값을 반환하지 않고 계속해서 서비스한다. (음악재생,파일다운로드 등)
    하나의 프로세스안에서 동작하며, 패키지내 컴포넌트들과 유기적으로 통신하는 역할
    ② boundService : bindService() 함수를 통해서 서비스하면, 연결타입의 서비스가 실행된다. 연결타입의 서비스는 서버-클라이언트 형식의 구조를 취하기 때문에 호출자(액티비티)에서 서비스에게 어떤것을 요청하고 서비스는 그 요청을 처리한 후 결과값을 반환한다. 이러한 구조때문에 액티비티가 사라지면, 서비스도 자동적으로 destroy되면서 없어진다. 또 하나의 서비스에 여러개의 액티비티가 붙을 수 있다.
    다른 프로세스들 간에서도 통신이 유기적으로 가능.
    ③ intentService : 일반 Service와 다르게 요청이 끝나면, 자동으로 서비스가 종료, 또 다른 서비스들과 다르게 onHandleIntent()함수 하나만을 통해 작업을 처리할 수 있다.

====================================================

출처 :
(1) https://maternalgrandfather.tistory.com/entry/this%EC%99%80-getApplicationContext%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80
(2) https://limkydev.tistory.com/43

0개의 댓글