잘 디자인된 안드로이드 앱에서 중요한 컴포넌트 중 하나가 앱 바 app bar다. 앱 바는 사용자가 수행할 수 있는 액션과 화면 간을 이동할 수 있는 매커니즘을 제공한다. 더불어 디자인의 일관성도 제공한다. 앱 바의 오른쪽 위에는 메뉴를 넣을 수 있다. 메뉴는 액션 항목 action item 으로 구성되며, 액션 항목은 현재 화면과 관련된 액션 또는 앱 전체의 액션을 수행할 수 있다.
대화상자 Dialog는 사용자의 주의를 끌고 입력을 받는 데 사용되며 사용자의 선택을 받거나 중요한 정보를 보여줄 때 유용하다. DatePickerDialog는 사용자가 날짜를 선택할 수 있게 해주며 사용자 선택을 알아내기 위해 구현하는 리스너 인터페이스를 제공한다. AlertDialog는 다목적의 Dialog 서브 클래스이며 커스텀 대화상자를 생성할 때 흔히 사용한다.
프래그먼트 인자 fragment argument는 프래그먼트 생애에 걸쳐 보존된다. 구성 변경이 생기더라도 프래그먼트 매니저가 새 프래그먼트 인스턴스를 생성하면서 프래그먼트 인자를 다시 첨부하기 때문이다. 따라서 새 프래그먼트는 첨부된 인자 번들을 사용해서 자신의 상태 데이터를 다시 생성할 수 있다.
ListView는 getView()를 호출하여 list를 뿌리게 되는데 화면 스크롤시 getView()함수가 계속해서 호출되게 되어 inflate를 통해서 view가 생성되며 동시에 findByViewId가 계속해서 호출되게 된다. 그러면 리스트를 생성하는데 있어 메모리의 비효율성이 발생하게 된다. 하지만 RecyclerView는 ViewHolder(findByViewId를 한 번만 호출) 패턴을 강제하여 사용자의 화면을 구성하고 있는데 충분한 수의 ViewHolder가 생성되면 RecyclerView는 기존의 ViewHolder를 재활용해 시간과 메모리를 절약한다.
하나 이상의 프래그먼트(fragment) 로 앱의 UI를 관리하면 유연성이 좋아진다. 프래그먼트는 액티비티의 작업 수행을 대행할 수 있는 컨트롤러 객체다. 여기서 작업이란 UI 관리를 말하며, UI는 화면 전체 또는 일부분이 될 수 있다. 그런데 액티비티는 이런 유연성을 제공하도록 설계되지 않았다. 액티비티의 뷰들은 런타임 시에 변경되며, 이 뷰들을 제어하는 코드는 액티비티 내부에 있어야 한다. 따라서 액티비티는 사용하는 특정 화면과 강하게 결합되어 있다.