혼자 공부하면서 정리하고 싶은 부분을 작성한 글입니다 👀
함께 공부하는 사람에게는 도움이 되었으면 좋겠고,
혹시 제가 잘못 이해한 부분이 있다면 알려주시면 감사하겠습니다 💌
onCreate()
메모리에 올라감 (메모리 관리 상태가 됨), 첫 번째로 뷰를 구성
전 액티비티나 전 활동에서 넘어온 데이터 처리
onStart()
활동이 사용자에게 표시되고, 포그라운드로 보내줌
사용자와 상호작용(인터페이스를 통한 입력)을 할 수 있게끔 준비
onResume()
위의 상호작용이 가능하게 됨. "포커스" 떠날 때(해당 화면을 떠날 때)까지 계속됨
포커스가 떠나게 되면 onPause() - onStop() - onDestory() 순으로 트리거
(액티비티, 라이프 사이클이 완전히 종료)
onPause()
"포커스" 떠날 때. 트리거 되는 기간이 굉장히 짧음. 메모리를 적게 씀
onStop()
갑자기 종료되는 상황을 대비 (데이터가 유실되지 않게끔)
DB에 저장하거나 CPU 소모가 많은 작업은 onStop()에서 이루어지는 게 좋음
onDestory()
메모리에 있던 액티비티 자료를 삭제 → 다시 메모리에 올리기 위한 과정
LinearLayout[선]
orientation(정렬), weight(가중치), gravity(정렬)
RelativeLayout [관계, 상대]
뷰의 관계를 맺는 방식, 뷰끼리 중첩 가능
ConstraintLayout
복잡한 뷰를 그릴 때 계층이 복잡해지지 않고 한 층으로 그릴 수 있음
화면이 전환이 이루어졌을 때 그 비율을 유지함
ListView : 항목이 갱신될 때마다 아이템 뷰를 새로 구성해야 함 → 성능 저하 야기
그 래 서 RecyclerView를 사용!!
진보된 ListView, 화면에 보일 만큼의 view 생성 → 계속 재활용
// 체크리스트 할 때 사용해본 RecycleView
class MyAdapter(
val context: Context,
var list: List<MemoEntity>,
var onDeleteListener: OnDeleteListener
) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
// 아이템이 몇개나 있는지
override fun getItemCount(): Int {
return list.size
}
// ViewHolder : 아이템을 넣는 틀을 만든다
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val itemView = LayoutInflater.from(context).inflate(R.layout.item_memo, parent, false)
return MyViewHolder(itemView)
}
// 생성된 객체가 넘어옴 -> 틀과 내용을 합쳐줌
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val memo = list[position]
holder.memo.text = memo.memo
holder.root.setOnLongClickListener(object : View.OnLongClickListener {
override fun onLongClick(v: View?): Boolean {
onDeleteListener.onDeleteListener(memo)
return true
}
})
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val memo = itemView.tv_memo
val root = itemView.root
}
}
앱에 대한 필수적인 정보를 안드로이드 빌드 툴과 안드로이드 OS, 구글 플레이에 제공
intent-filter : 어플이 실행될 때 가장 먼저 실행하도록 하는 코드
https://github.com/airbnb/lottie-android
귀여운 애니메이션 한가득 😂
이 라이브러리를 지금이라도 알게 되어서 다행이다.. ;ㅅ;
모바일 관련 코딩할 때 진짜 유용하게 쓸 수 있을 것 같다.
https://lottiefiles.com/4837-heart#
다른 귀여운 애니메이션도 많았지만 🙄 좋아요 클릭 전,후를 확실하게 나눌 수 있기 때문에 토글 버튼에는 요 액션 딱이었다. xml에서 바로 설정해서 쓰거나 제공해 주는 그대로 플레이도 가능하지만 아래 코드처럼 원하는 지점에서 멈출 수 있도록 커스텀 해서 쓸 수도 있다! (활성화되어 분홍색인 하트 / 비활성화 회색 하트)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
// 좋아요 버튼 클릭
btn_like.setOnClickListener {
if (!isLiked) {
// ofFloat(시작지점, 종료지점) setDuration(지속시간) 1000 = 1
// 0f = 0퍼센트, 1f = 100퍼센트
val animator = ValueAnimator.ofFloat(0f, 0.5f).setDuration(1000)
animator.addUpdateListener {
animation_view.setProgress(it.getAnimatedValue() as Float)
}
animator.start()
isLiked = true
} else {
val animator = ValueAnimator.ofFloat(0.5f, 1f).setDuration(300)
animator.addUpdateListener {
animation_view.setProgress(it.getAnimatedValue() as Float)
}
animator.start()
isLiked = false
}
}
}
자바에서 코틀린으로 갈아타면서 현시점 가장 편하다고 느끼는 것은 'findviewbyid()'를 질리도록 쓰지 않아도 된다는 것... 여러 뷰를 선언할 때면 정말 인내심 테스트를 하는 것 같았는데 여기에선 xml에서 선언해 준 아이디를 activity에서 바로 쓸 수 있다 😭
그런데 처음 프로젝트 생성 당시 버전이 맞지 않으면 가끔 import가 안될 때가 있다 😖 그때는 gradle에 'kotlin-android-extensions'이 선언되었는지 확인해보면 된다
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
버전 4.1로 오면서 플러그인을 제거했다는데 (지운 데에는 이유가 있을 테니 ;ㅅ;)
ViewBinding을 권유한다고 한다... 편리함을 알자마자 바로 갈아타야할고같다...^_ㅠ
디자인 패턴 : 코딩 방법론 (생성, 구조, 행위)
일반 클래스 선언은 class, 싱글톤 패턴은 object로 선언
싱글톤은 메모리를 하나만 쓰지만(계속 참조),
일반 클래스 인스턴스는 각각 다른 메모리를 생성한다.
@Volatile : CPU가 캐시를 거치지 않고 바로 메인 메모리로 가서 항상 최신 값을 가져올 수 있음