1. 왜 액티비티 클래스 의 onCreate() 메소드 안에서 setContentView() 를 사용해야 할까요?
> 액티비티의 onCretate() 메소드는 액티비티 불릴 때 한번만 호출이 되기 때문에, 초기화에 자주 사용된다. onResume() 또는 onStart() 같이 여러번 호출 될 수 있는 곳에서 호출하는 것은 매우 비효율적인 코드이다.
2. 액티비티 클래스의 onSavedInstanceState(), onRestoreInstanceState() 메소드의 역할은 무엇인가?
> onSaveInstanceState() - 액티비티가 pause 되기 전에 데이터를 저장하는데 사용합니다.
onRestoreInstanceState() - 액티비티가 파괴되고, 다시 재생성될 때, 액티비티가 가지고 있는 번들로부터 데이터를 회복할수 있다. 또한 onCreate() 와 onRestoreInstanceState() 콜백 메서드는 같은 번들 객체를 전달 받는다. 그래서 보통은 데이터를 회복하는 코드를 onRestoreInstanceState() 에 많이 작성하는 편이며, onCreate 에서 savedInstance를 받아 처리하는 경우에는 처음 실행이 되는지, 재생성되는 것인지 판단하기 위해서, 데이터의 null check 가 필요하다. null 이라면 처음 생성되는 것이고, 아니라면 재생성이다.
3. 안드로이드 런치모드들에 대해서 설명해주세요.
> 런치모드란 액티비티가 어떤 방식으로 실행되야하는지에 대한 방식들이다.
Standard : 시스템이 액티비티가 시작된 작업(Task)에서 액티비티의 새 인스턴스를 만들고 인텐트의 경로를 이것으로 지정한다. 액티비티는 여러 번 인스턴스화될 수 있고, 각 인스턴스는 서로 다른 작업에 속할 수 있으며 한 작업에 여러 개의 인스턴스가 있을 수 있다.
Eg : 현재 A -> B -> C 로 쌓여있는 액티비티 스택이 있다고 가정해보자, 현재 B를 다시 실행하고 싶은 상태이고, 이를 standard 로 액티비티 B를 실행할 경우 A -> B -> C -> B 이 된다.
SingleTop : 액티비티의 인스턴스가 이미 현재 작업의 맨 위에 존재하는 경우, 시스템은 새 액티비티 인스턴스를 만드는 대신 onNewIntent() 메서드를 호출하여 인텐트를 해당 인스턴스로 라우팅한다. 액티비티는 여러 번 인스턴스화될 수 있고, 각 인스턴스는 서로 다른 작업에 속할 수 있으며 한 작업에 여러 개의 인스턴스가 있을 수 있다(다만 백 스택의 맨 위에 있는 액티비티가 액티비티의 기존 인스턴스가 아닌 경우에만 이것이 적용된다).
SingleTop 런치모드와 비슷하지만, 실행하는 액티비티가 액티비티 스택의 Top 일 때 새로운 인스턴트를 만드는 것이 아니라. 현재 인스턴스스의 onNewIntent()를 호출한다
Eg : 현재 A -> B 로 이루어진 액티비티 스택이 있다고 가정해보자. 만약 C 액티비티를 SingleTop 으로 실행하면 A -> B -> C로 정상적으로 쌓일 것이다. 그리고 현재 A -> B -> C 로 이루어진 액티비티 스택에서 C를 SingleTop 으로 다시 실행하면 A -> B -> C -> C가 되는 것이 아니고 여전히 A -> B -> C 이다.
SingleTask : 시스템이 새 작업을 만들고 새 작업의 루트에 있는 액티비티를 인스턴스화한다. 하지만, 액티비티의 인스턴스가 이미 별개의 작업에 존재하는 경우, 시스템은 인텐트의 경로를 기존 인스턴스로 지정한다. 이때 새 인스턴스를 만들지 않고, 해당 인스턴스의 onNewIntent() 메서드를 호출하는 방법을 사용한다. 한 번에 액티비티 인스턴스 한 개씩만 존재할 수 있습니다.
Eg : A -> B -> C -> D 로 이루어진 액티비티 스택이 있다고 가정하자. 현재 액티비티 D를 SingleTask 모드로 실행하면, A -> B -> C -> D이고 D의 onNewIntent() 가 불리운다. 그리고 액티비티 B를 SingleTask 로 실행하면, 액티비티 스택은 A -> B 로 바뀌고, 액티비티 C, D 는 파괴된다
SingleInstance : "singleTask"와 동일하다. 단, 인스턴스가 있는 작업에 대해 시스템이 어떤 액티비티도 시작하지 않은 경우는 예외이다. 액티비티는 언제나 자신의 작업의 유일무이한 멤버이고, 이것으로 시작한 액티비티는 모두 별개의 작업에서 열린다.
Eg : A -> B -> C -> D로 이루어진 액티비티 스택이 있다. 만약 액티비티 D를 singleInstance 모드로 실행할 경우, 아래와 같이 작업이 분리된다
Task 1 - A -> B -> C
Task 2 - D
4. 화면 회전을 했을 때 액티비티가 어떻게 동작하나요 ?
> 화면 회전을 했을 때, 현재 만들어진 액티비티 인스턴스는 파괴되고 새로운 Orientation 을 가진 액티비티 인스턴트가 만들어진다. 그렇기 때문에 데이터를 백업해두지 않으면, 메모리에서 해제되기 때문에 이를 유의하여 개발해야한다.
5. 화면 회전이 되었을 때, 데이터가 초기화 되는 것을 어떻게 막을 수 있나요 ?
> 기본적인 문제 해결 접근으로는 ViewModel, onSavedInstanceState() 두 방법을 사용하는 방식이 있다.
그렇다면 이들을 어떤식으로 사용해야할까요 ?
ViewModel : 뷰모델은 라이프 사이클에 Aware 하다고 한다. 알고 있다 or 알고 있기 때문에 좀더 유연해진다 정도로 받아드리면 될 것 같다. 그리고 뷰모델은 앱의 Configuration (rotatin 등) 이 바뀌어 액티비티가 파괴되어도, 파괴되지 않고, 액티비티가 재생성되었을 때 다시 연결된다. 만약에 화면 회전을 3번하면 액티비티 인스턴스는 부서지고 만들어져 3번 다 다른 인스턴스이지만, 뷰모델 인스턴스는 하나이다.
그렇기 때문에 뷰모델 클래스에 데이터를 저장하면 자연스럽게 해결할 수 있다. 또는 onSaveInstanceState() 메소드를 사용하는 방법이다.
6. 인텐트를 사용하여 새로운 액티비티를 실행할 때, 액티비티 스택을 클리어할 수 있는 두가지 방법을 설명해보세요.
> 첫번째 접근으로는 FLAG_ACTIVITY_CLEAR_TOP 플래그를 사용하는 방법이다.
두번째 접근으로는 FLAG_ACTIVITY_CLEAR_TASK 와 FLAG_ACTIVITY_NEW_TASK 플래그를 를 동시에 사용하는 방법이다.
7. FLAG_ACTIVITY_CLEAR_TASK 와 FLAG_ACTIVITY_CLEAR_TOP 의 차이점은 무엇인가요 ?
> FLAG_ACTIVITY_CLEAR_TASK 는 호출된 클래스의 존재하는 모든 인스턴스들을 포함한 작업(Task)에 있는 모든 액티비티들을 클리어 시킬 때 사용한다. (액티비티 스택에 쌓인 모든 액티비티를 클리어 시키고, 한개의 액티비티를 실행할 때 자주 사용하게 된다)
FLAG_ACTIVITY_CLEAR_TOP 는 액티비티가 실행될 때 (set), 액티비티 스택에 이미 존재한다면, 그 아래 있는 모든 작업(Task)이 제거 되고, 현재 실행하는 작업(TASK) 이 작업 리스트(Task list)의 루트가 된다. 반면에 액티비티 스택에 존재하지 않는다면, 작업 리스트(Task list) 의 루트에 새로운 인스턴스가 생성된다. 보통 FLAG_ACTIVITY_NEW_TASK 와 함께 사용하는 것이 추천된다.
8. 컨텐츠 프로바이더(Content providers)에 대해서 설명해주세요
> 컨텐츠 프로바이더는 하나의 어플리케이션에서 요청시에 다른 어플리케이션으로 데이터를 제공한다. 어플리케이션의 데이터 보안으로 인해 구조화된 데이터 구조를 가지고 있도록 정의되어 있다. 컨텐츠 프로바이더는 기본적으로 다른 프로세스에서 다른 프로세스로 데이터를 제공할 수있는 인터페이스를 가지고 있다. 만약 컨텐츠 프로바이더를 이용하여 데이터 접근을 원한다면, Application Context 안에 있는 ContentResolver 오브젝트를 사용하여 클라이언트(요청하는 쪽)로서 커뮤니케이션한다 (요청 받는 쪽이 서버라고 보면 되겠다
9, 컨텐츠 프로바이더를 사용하여 데이터에 접근하는 방식을 간략하게 말해보세요.
> 먼저 Access permissions 를 획득했는데 확인해야한다. 그리고 컨텍스트 객체 안에 있는 ContentResolver 객체를 가져온다.
ContentResolver 의 query() 함수를 통해 데이터를 끌어온다(Retrieving). query() 함수는 Cursor 를 리턴하기 때문에, 커서를 사용하여 각각의 칼럼을 가져와서 데이터를 사용한다.
'Android > Interview Question' 카테고리의 다른 글
안드로이드 면접 질문 6 (0) | 2019.11.05 |
---|---|
안드로이드 면접 질문 5 (1) | 2019.11.05 |
안드로이드 면접 질문 4 (0) | 2019.11.05 |
안드로이드 면접 질문 3 (0) | 2019.11.05 |
안드로이드 면접 질문 1 (3) | 2019.10.29 |