findViewById()
성능이슈 개선 : 갯수가 많아질 수록 번거롭고 속도 저하
찾는것을 번거롭지 않게 만들어줌 (외부 Library)
편의성은 개선되었으나 성능이슈는 여전함...
JDK 경로를 찾아서 사용, 안드로이드 스튜디오 프리뷰버전은 압축해제버전이라 어려움
ButterKnife의 대체품, 찾는것뿐만 아니라 속도까지 성능 개선
안드로이드의 기본기능 (Library아님) 기본적으로 꺼져 있음
기능을 켜면 객체를 만들지 않아도 자동으로 가지고 있음
setContentView(R.layout.activity_main);
를 끊어버리기
id를 기반으로 한 참조변수를 가지고 있게 알아서 해주는 Binding 객체
자동으로 root를 가지고 있음 (LayoutInflate를 대신 해줌)
ViewBinding 클래스명
ⓐ 액티비티 레이아웃 파일명과 자동으로 만들어지는 바인딩 클래스명
activity_main.xml --> ActivityMainBinding
activity_second.xml --> ActivitySecondBinding
activity_xxx.xml --> ActivityXxxBinding
ⓑ 프레그먼트 레이아웃 파일명과 자동으로 만들어지는 바인딩 클래스명
fragment_my.xml --> FragmentMyBinding
fragment_login.xml --> FragmentLoginBinding
fragment_xxx.xml --> FragmentXxxBinding
ⓒ 리사이클러뷰(아답터뷰)의 아이템 1개 레이아웃 파일명과 자동으로 만들어지는 바인딩 클래스명
recycler_item.xml --> RecyclerItemBinding
recycler_xxx.xml --> RecyclerXxxBinding
buildFeatures {
viewBinding true
}
참조변수를 아예 만들지 않고 또다른 변수 (Observable)를 만들어서 연결, 변수만 신경쓰도록...!
요즘 많이 사용되고 있는 이벤트 처리 방법
buildFeatures {
dataBinding true
}
자동으로 화면 갱신 BUT 아무 변수나 바뀔 때마다 갱신하면 앱 효율이 떨어짐
일반 자료형은 값이 변경되어도 화면 갱신이 이루어지지 않고,
dataBinding 기능에 의해 변수값이 바뀌면 화면이 자동갱신되는 특별한 자료형 : ObservableXXX 클래스 객체 (XXX에는 기본자료형, 다른자료형은 Field)
public ObservableField<String> name = new ObservableField<>(); //패키지명이 서로 다른곳에서 사용하기 위해서 public
public ObservableInt age = new ObservableInt();
public ObservableBoolean favor = new ObservableBoolean();
Activity 클래스의 Lifecycle Method
: 액티비티가 객체로 만들어져서 화면에 보여지고 종료되어 메모리에서 사라질때까지 상황에 따라 자동으로 실행되는 생명주기 콜백 메소드
① onCreate : 액티비티가 처음 메모리에 만들어질때 자동으로 실행되는 메소드
이 메소드가 실행되는동안에는 어떤 UI도 그려지지 않은 상태
② onStart : 액티비티의 뷰들이 보이기 시작할때 자동호출
이 메소드 중에는 터치해도 반응하지 않음 (인터랙션 불가) --> 가급적 오래걸리는 작업은 하지말것
③ onResume : 액티비티가 보이고 터치도 가능한 상태
----------- Running --------------
④ onPause : 어떤 이유에서든 액티비티가 안보이기 시작할때 자동 실행되는 메소드
화면에 UI는 아직 보이지만 터치는 안되는 상태 (보통 이곳에서 스레드를 pause 처리)
⑤ onStop : 완전히 안보일때 자동실행되는 메소드
--- 액티비티가 다른 액티비티에 의해 가려진 상태라면 4,5 메소드까지 작동 ----
⑥ onDestroy : 스마트폰의 '뒤로가기' 버튼이나 finish() 메소드로 액티비티가 종료되었을때, 액티비티가 메모리에서 소멸될때 자동으로 실행되는 메소드
Android 12버전 (api 31) 디바이스부터는 ✌ 처음 실행되는 액티비티(intent-filter를 가지는) ✌는 '뒤로가기' 버튼을 눌러도 finish() 되지 않음 (속도 개선을 위해)
만약 뒤로가기 버튼으로 종료시키고 싶다면 onBackPressed() 재정의하여 직접 finish() 하거나 최근실행목록에서 스와이프로 제거