2019. 4. 14. 14:58
Android Application Components
- 사용자가 마음대로 New 해서 만들 수 없음
1. Activities
- UI가 있는 단일 화면, 하나의 Activity가 하나의 기능을 가지도록 구현하는 것이 좋음
- 하나의 App에 있더라도 각 Activity는 독립적
2. Services
- 백그라운드에서 실행, UI 제공 X
- 폰이 켜질 때 자동으로 켜지게 할 수도 있고 앱이 실행될 때 서비스가 같이 실행되서 나중에 빠질 수도 있음
- 백그라운드에서 파일을 다운 받는 등 오랜 시간이 걸리거나 화면이 꺼져도 동작해야 하는 경우 사용
3. Broadcast receiver
- 안드로이드에서는 시스템이 브로드캐스트라는 메시지를 보냄
- 알림 화면등을 생성해 사용자에게 이벤트 발생 알림
- 메시지 수신자이기 때문에 UI가 따로 있진 않지만 갱신은 가능, 출력 가능
- 화면 업데이트에는 관여하지 않는 것이 좋음
=> 화면 업데이트는 액티비티의 할 일
- 배터리 잔량 부족, 화면 꺼짐, 블루투스 기능 꺼짐 등 있음
* receiver 참고 : https://cocomo.tistory.com/419
4. Content providers
- 내 App이 가진 Contents를 다른 앱이 조회하거나 사용할 수 있도록 제공
- 누가봐도 폰에 무조건 있을 것 같은 기능들 (카메라, 계산기, 갤러리 등)
Activity Lifecycle
- onCreate() : 레이아웃 지정 및 각종 초기화
- onStart() : 내 앱 (Activity)이 화면에 출력되는 시점
- onResume() : 사용자의 터치가 가능할 때
- onPause() : 내 앱이 Foreground에서 떨어질 때
(시스템 팝업, 화면에는 뜨지만 터치가 안 먹히는 상황)
- onStop() : Activity가 화면에 더이상 나오지 않게 될 때
(예. 게임 중 전화가 오면 게임이 화면에서 사라지고 전화 화면이 위에 덮히는 상황, 여기서 게임 Activity는 가려진 것일 뿐 종료는 아님)
- onDestroy() : 이전 설정을 못 쓸 때, Activity가 Finish되거나 완전히 새로 로딩 되어야 할 때 (예. 화면 회전 등)
Intent (작업 요청 메세지)
- 앱 컴포넌트가 무엇을 할 것인지를 담는 메세지 객체 ( 메세지 : 의사소통을 하기 위해 보내고 받는 것)
- 메세지를 사용하는 가장 큰 목적 다른 Activity, Services, Broadcast Receiver, Contents provides 등을 실행하는 것
=> Intent는 그들 사이에 데이터를 주고 받기 위한 용도로 사용
(예. Activity가 Android에게 보내는 요청, Activity가 다른 Activity의 기능이 필요할 때 보내는 것)
장점 |
- 요청을 받을 Activity가 내 App의 Activity건, 다른 App의 Acitivity건 동일한 양식 - 요청을 주고 받을 수 있는 상대가 내 App 뿐 아니라 폰에 설치된 전체 App으로 확장 - 다른 앱의 Activity를 사용할지라도 동일한 객체를 통해 데이터 주고 받기 가능 |
단점 | - 간단한 화면 전환도 Intent를 사용해야 하고 간단한 Parameter도 Intent로 전달해야 함 |
1. 명시적 Intent
- Class Type 지정해 요청, 즉 내 App내의 Activity 요청
- 내 App에 있는 다른 화면들을 부를 때 주로 사용
2. 묵시적 Intent
- 내가 필요한 동작을 지정하여 요청하는 것
- 지금 내가 하고 싶은 동작만 정의, 어떤 앱이 실행할지는 모름
(예. 사진첩에서 공유하기 버튼을 눌렀을 때, 사용자 폰에 설치 된 여러 앱이 뜨고 그 중 하나를 골라 실행)
Activity Stack
- startActivity를 호출하면 생성된 Activity는 Activity Stack에 쌓임, 이 후 back키를 누르거나 스스로 finish() 함수를 호출하면 종료되면서 stack에서 나옴
- finish()가 실행되기 전까지는 mainActivity는 사라지지 않음
=> secondActivity가 생겨도 mainActivity는 그대로 있고 그 위에 secondActivity가 불러와지는 형태
1. 단방향 전달
- 호출하는 Activity에서 호출되는 Activity에 데이터를 Intent를 통해 전달 가능
(예. mainActivity ----"Hello!"(string)----> secondActivity ----"Hello!"(string)----> TextView)
2. 양방향 전달
- 보내는 Activity쪽에서 보낼 데이터를 Intent에 보내면 됨, 다만 결과를 달라는 뜻으로 startActivityForResult()를 호출
- 불리는 Activity는 setResult() 함수를 통해 성공/실패 설정 가능, Intent를 통해 데이터 반환도 가능
- 불리는 Activity가 종료되면 보내는 Activity의 onActivityResult 콜백 불림