예시사진은 내일 올리겠습니다..시간이 없네요..!!
[상단 탭과 하단 탭 만들기]
[상단 탭 보여주기]
1. 안드로이드의 경우에 하나의 화면을 나타내는 액티비티를 최대한 많이 분리시켜서 하나의 화면에 보이는 뷰의 개수를 줄여주는 것이 좋습니다.
2. 그러나 때로는 하나의 화면에 여러 가지 구성 요소를 넣어두고 필요할 때 전환하여 보여주는 게 좋을 때도 있습니다. 대표적인 것이 서브화면들입니다.
3. 몇 개의 버튼을 두고 그 중 하나의 버튼을 눌러 서브 화면을 전환하는 방식처럼 하나의 뷰에서 여러 개의 정보를 볼 때 일반적으로 사용하는 뷰로 탭(Tab)을 들 수 있습니다. 탭은 안드로이드 전화번호부를 비롯한 몇 개의 기본앱에서 볼 수 있는데 상단에 있는 탭을 누를 때마다 내용이 보이는 화면 영역이 전환되어 나타납니다.
4. 탭은 내비게이션(Navigation) 위젯이라고 불리기도 하며 상단 탭과 하단 탭(Bottom Navigation)으로 구분할 수 있습니다. 최근에는 하단 탭을 더 많이 사용합니다.
※ 상단 탭 만들기 예시
☞ FrameLayout으로 하단에 공간을 확보한 후 그 안에 상황에 따라 서로 다른 프래그먼트를 넣어줄 수 있습니다.
☞ setSupportActionBar() 메서드는 액티비티에 디폴트로 만들어진 액션바가 없을 경우에만 동작합니다. 그런데 프로젝트가 만들어질 때 메인 액티비티에는 자동으로 액션바가 만들어집니다. 이것은 테마를 액션바가 들어있는 테마로 설정했기 때문입니다. 액티비티에 설정된 테마를 변경하기 위해 app/res/values 폴더에서 theme.xml 파일에서 수정해야 합니다.
[하단 탭 보여주기]
1. 하단 탭은 BottomNavigationView 위젯으로 만들 수 있습니다.
※ 하단 탭 만들기 예시
[뷰페이저 만들기]
1. 뷰페이저는 손가락으로 좌우 스크롤하여 넘겨볼 수 있는 기능을 제공합니다.
2. 뷰페이저는 그 안에 프래그먼트를 넣을 수 있고 좌우 스크롤로 프래그먼트를 전환합니다.
3. 뷰페이저는 내부에서 어댑터라는 것과 상호작용하게 되어 있는데 이것은 뷰페이저가 여러 개의 아이템 중에 하나를 보여주는 방식으로 동작하기 때문입니다.
※ 뷰페이저 만들기 예시
☞ 어댑터는 뷰페이저에 보여줄 각 프래그먼트를 관리하는 역할을 하며, 뷰페이저에 설정하면 서로 상호작용하면서 화면에 표시해주게 됩니다.
☞ 뷰페이저는 어댑터와 상호작용하면서 getCount() 메서드로 몇 개의 프래그먼트가 들어있는지 확인합니다.
☞ addItem() 메서드를 호출하면서 프래그먼트 객체를 파라미터로 넘겨주면 어댑터 안에 들어있는 ArrayList에 추가된다는 점을 이해해야 합니다.
☞ 위나 아래쪽에 전체 아이템의 개수와 현재 보고 있는 아이템이 어떤 것인지를 보여줄 필요가 있습니다. 이런 역할을 하는 것이 ‘타이틀스트립(TitleStrip)’입니다.
[바로가기 메뉴 만들기]
1. 바로가기 메뉴는 화면의 좌측 상단에 위치한 햄버거 모양 아이콘을 눌렀을 때 나타나는 화면을 말합니다.
2. 웹이나 앱에서 자주 사용되는 기능이며 안드로이드에서는 NavigationDrawer 라는 이름으로 불립니다.
3. 바로가기 메뉴를 추가하는 가장 쉬운 방법은 안드로이드에서 첫 화면의 유형으로 제공하는 것을 사용하는 것입니다.
※ 바로가기 메뉴 만들기 예시
[서비스]
1. 서비스란 백그라운드에서 실행되는 앱의 구성요소를 말합니다.
2. 예를 들어, 카카오톡은 앱이 실행되어 있지 않거나 화면이 사용자에게 보이지 않는 상태에서도 다른 사람이 보낸 메시지를 받을 수 있습니다.
[서비스의 실행 원리와 역할]
1. 서비스를 실행하려면 메인 액티비티에서 startService() 메서드를 호출하면 됩니다.
2. 서비스의 주요 역할 중 하나는 단말이 항상 실행되어 있는 상태로 다른 단말과 데이터를 주고받거나 필요한 기능을 백그라운드에서 실행하는 것입니다. 그래서 서비스는 실행된 상태를 계속 유지하기 위해 서비스가 비정상적으로 종료되더라도 시스템이 자동으로 재실행합니다.
3. 서비스를 시작시키기 위해 startService() 메서드를 호출할 때는 인텐트 객체를 파라미터로 전달합니다. 이 인텐트 객체는 어떤 서비스를 실행할 것이닞에 대한 정보를 담고 있으며 시스템은 서비스를 시작시킨 후 인텐트 객체를 서비스에 전달합니다.
4. 그런데 서비스가 실행중이면 실행 이후에 startService() 메서드를 여러 번 호출해도 서비스는 이미 메모리에 만들어진 상태로 유지됩니다. 따라서 startService() 메서드는 서비스를 시작하는 목적 이외에 인텐트를 전달하는 목적으로도 자주 사용됩니다.
※ 서비스 사용 예시 + 로그 사용하여 인텐트의 부가 데이터 출력하기
☞ 하나는 command라는 키(Key)를 부여하였으며 또 다른 하나는 name이라는 키를 부여했습니다. command 서비스 쪽으로 전달한 인텐트 객체의 데이터가 어떤 목적으로 사용되는지를 구별하기 위해 넣은 것입니다. name은 입력상자에서 가져온 문자열을 전달하기 위한 것입니다.
☞ onStartCommand() 메서드는 서비스 내에서 아주 중요한 역할을 합니다. 서비스는 시스템에 의해 자동으로 다시 시작될 수 있기 때문에 onStartCommand() 메서드로 전달되는 인텐트 객체가 null인 경우도 검사합니다. 만약 인텐트 객체가 null이면 onStartCommand() 메서드는 Service.START_STICKY을 반환합니다. 그리고 이 값을 반환하면 서비스가 비정상 종료되었다는 의미이므로 시스템이 자동으로 재시작합니다. 만약 자동으로 재시작하지 않도록 만들고 싶다면 다른 상수를 사용할 수 있습니다.
☞ 서비스가 서버 역할을 하면서 액티비티와 연결될 수 있도록 만드는 것을 바인딩(Binding)이라고 합니다. 이를 위해서는 onBind() 메서드를 정의해야 합니다.(여기서는 사용x)
☞ 액티비티에서 인텐트에 넣어 전달한 데이터는 서비스에서 그대로 출력됩니다. 그런데 이렇게 액티비티에서 서비스로 데이터를 전달할 수 있는 것처럼 서비스에서 액티비티로도 데이터를 전달할 수 있어야 합니다. 서비스에서 액티비티로 전달하고 싶다면 서비스에서 startActivity() 메서드를 사용합니다. 이 메서드를 호출하면서 인텐트 객체를 전달하면 액티비티에서는 그 안에 들어있는 부가데이터를 받아볼 수 있습니다.
☞ processComand() 메서드의 마지막 부분에서 액티비티 쪽으로 인텐트를 전달하면 메인 액티비티에서는 이 인텐트를 전달 받아 화면에 보여줄 수 있을 것입니다.
☞ 서비스에서 startActivity() 메서드를 호출할 때는 새로운 태크스(Task)를 생성하도록 FLAG_ACTIVITY_NEW_TASK 플래그를 인텐트에 추가해야 합니다. 서비스는 화면이 없기 때문에 화면이 없는 서비스에서 화면이 있는 액티비티를 띄우려면 새로운 태스크를 만들어야 하기 때문입니다. 그리고 MainActivity 객체가 이미 메모리에 만들어져 있을 때 재사용하도록 FLAG_ACTIVITY_SINGLE_TOP과 FLAG_ACTIVITY_CLEAR_TOP 플래그도 인텐트에 추가합니다.