안드로이드 생명주기, 레이아웃, RecyclerView, manifest, lottie animation, 싱글톤 패턴

임현주·2021년 11월 4일
1
post-thumbnail

시작

혼자 공부하면서 정리하고 싶은 부분을 작성한 글입니다 👀
함께 공부하는 사람에게는 도움이 되었으면 좋겠고,
혹시 제가 잘못 이해한 부분이 있다면 알려주시면 감사하겠습니다 💌


🔹 안드로이드 생명주기 (Life Cycle)

  • onCreate()
    메모리에 올라감 (메모리 관리 상태가 됨), 첫 번째로 뷰를 구성
    전 액티비티나 전 활동에서 넘어온 데이터 처리

  • onStart()
    활동이 사용자에게 표시되고, 포그라운드로 보내줌
    사용자와 상호작용(인터페이스를 통한 입력)을 할 수 있게끔 준비

  • onResume()
    위의 상호작용이 가능하게 됨. "포커스" 떠날 때(해당 화면을 떠날 때)까지 계속됨
    포커스가 떠나게 되면 onPause() - onStop() - onDestory() 순으로 트리거
    (액티비티, 라이프 사이클이 완전히 종료)

  • onPause()
    "포커스" 떠날 때. 트리거 되는 기간이 굉장히 짧음. 메모리를 적게 씀

  • onStop()
    갑자기 종료되는 상황을 대비 (데이터가 유실되지 않게끔)
    DB에 저장하거나 CPU 소모가 많은 작업은 onStop()에서 이루어지는 게 좋음

  • onDestory()
    메모리에 있던 액티비티 자료를 삭제 → 다시 메모리에 올리기 위한 과정


🔹 레이아웃 (Layout)

  • LinearLayout[선]
    orientation(정렬), weight(가중치), gravity(정렬)

  • RelativeLayout [관계, 상대]
    뷰의 관계를 맺는 방식, 뷰끼리 중첩 가능

  • ConstraintLayout
    복잡한 뷰를 그릴 때 계층이 복잡해지지 않고 한 층으로 그릴 수 있음
    화면이 전환이 이루어졌을 때 그 비율을 유지함


🔹 RecyclerView

ListView : 항목이 갱신될 때마다 아이템 뷰를 새로 구성해야 함 → 성능 저하 야기

그 래 서 RecyclerView를 사용!!
진보된 ListView, 화면에 보일 만큼의 view 생성 → 계속 재활용

  • Adapter : view를 생성하고 만든 view 안에서 어떻게 데이터를 바인딩 해줄지 정의
  • Layout Manager : RecyclerView 내부에서 어떻게 아이템을 보여줄지 결정
// 체크리스트 할 때 사용해본 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
    }

}

🔹 manifest

앱에 대한 필수적인 정보를 안드로이드 빌드 툴과 안드로이드 OS, 구글 플레이에 제공
intent-filter : 어플이 실행될 때 가장 먼저 실행하도록 하는 코드


🔹 lottie animation

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가 캐시를 거치지 않고 바로 메인 메모리로 가서 항상 최신 값을 가져올 수 있음

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글