안드로이드 면접 정리
1. intent
- intent의 정의 : 비동기식 메시지 객체
- activity끼리 서로 호출하기 위해 필요한 통신 장치
=> startActivity(Context packageContext, Class<> class)
: context는 보통 this(액티비티 구현하는 컨텍스트), 호출할 액티비티 클래스
- Bundle타입 Extra를 활용하여 액티비티간 인수와 리턴값을 전달함
: Map형태로 name-value 값을 저장한다.
-> intent.putExtra(String name, int value)
-> intent.getIntExtra(String name)
혹은 Bundle bundle = intent.getExtras();
String data = bundle.getString("data");
1-1. Pending Intent
: 일반 Intent와의 차이점
-> 다른 컴포넌트에게 작업을 요청하는 인텐트를 사전에 생성시킴
-> 특정 시점에 자신이 아닌 다른 컴포넌트가 펜딩인텐트를 사용하여 다른 컴포넌트에게 작업을 요청시키는데 사용됨
===> 예시 : 사용자가 notification을 통해 앱을 동작할 때 실행되는 인텐트를 생성할때 사용
(사용자가 상태바에 있는 notification을 클릭하면 앱이 실행됨 -> 이 때 호출될 액티비티 지정)
-- 서비스는 백그라운드에서 이루어지기 때문에
MyFirebaseMessagingService가 onMessageReceived() 함수를 통해 메시지를 받아서 사용자 디바이스에 notification을 띄운다.
이 때 전달할 정보를 intent를 생성하여 Bundle타입으로 저장하고,
해당 intent를 PendingIntent에 설정하여 전달
-> PendingIntent.getActivity(this, 0, intent)
Intent intent1 = new Intent(this,VideoChatActivity.class);
Bundle bundle = new Bundle();
bundle.putString("pushId",pushId);
intent1.putExtras(bundle);
intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 0 /* Request code */, intent1,
PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,channelId)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.suhwa_logo))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent1);
2. Component
- 안드로이드 4대 컴포넌트 : Activity, Service, Broadcast receiver, Content provider
- 각 컴포넌트들은 독립적
- 인텐트를 통하여 다른 컴포넌트를 활성화시킬 수 있다.
=> Manifest.xml 파일에 호출되는 액티비티가 명시되어 있어야 한다.
3. Acticity
- 안드로이드에서 화면을 관리하며 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트
- 액티비티 실행 과정
1. 부모 액티비티에서 자식 액티비티를 생성 및 호출
2. 액티비티 매니저 서비스가 해당 앱 프로세스에서 인텐트를 복사해온 후,
Manifest 파일에서 해당 인텐트에 명시되어있는 액티비티를 찾음
3. 찾은 액티비티를 실행하고 다시 해당 앱 프로세스에 인텐트를 복사하여 넘겨줌
4. 자식 액티비티 내의 onCreate 메소드 내에서 setContentView 메소드에 레이아웃의 아이디를 넘겨 해당 액티비티의 화면을 구성하게 함
- 액티비티의 3가지 상태 : 실행(running), 일시중지(resume), 중지(stopped)
실행 : 포커스를 가지고 있어 사용자에게 보이는 상태
일시중지 : 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태
중지 : 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태
3-1. 액티비티 스택
- Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리하며, stack형태의 연속된 activity로 이루어진다.
- 동일한 액티비티를 여러번 실행하면 동일한 액티비티가 중복으로 쌓이게되어 리소스 낭비 발생할 수 있음
- flag를 사용하여 task내 액티비티의 흐름을 제어할 수 있다.
=> intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
* 플래그 종류
1. FLAG_ACTIVITY_SINGLE_TOP
- 액티비티를 생성할 때 스택 최상위에 이미 생성된 액티비티가 있으면 해당 액티비티를 그대로 사용함
- 이미 생성된 액티비티를 재호출할 경우 onCreate() 메서드는 호출되지 않음
=> onNewIntent() 메서드를 재정의하여 재호출시 수행할 기능을 넣어야 한다.
2. FLAG_ACTIVITY_NO_HISTORY
- 처음 이후에 실행된 액티비티는 스택에 추가되지 않음
- 즉, back키를 눌렀을 때 이전에 실행되었던 액티비티들이 모두 보이지 않고 맨 처음 실행된 액티비티만 보인다.
3. FLAG_ACTIVITY_CLEAR_TOP
- 호출하는 액티비티가 스택에 존재하는 경우 해당 액티비티 위에 존재하는 다른 액티비티를 모두 삭제시킴
-- 다른 액티비티에서 액티비티 종료시켜주는 방법도 있음
if(액티비티명.activity!=null){ //액티비티가 살아 있다면
액티비티명 activity = (액티비티명)액티비티명.activity;
activity.finish();
}
4. Service
- 백그라운드에서 필요한 작업시 사용할 수 있는 컴포넌트
- startService() => 콜백 메서드(내부에서 자동으로 호출되는 메서드 : onStartCommand())
한번 시작된 서비스는 백그라운드에서 무기한으로 실행될 수 있음
작업 결과를 호출자에게 반환하지 않기 때문에 호출자와 상호작용하는 작업에는 적합하지 않음
작업 끝나면 자동으로 소멸
- bindService() => 콜백 메서드(onBind())
Client-Server 인터페이스를 제공하여 구성요소와 서비스간 상호작용 가능
작업 결과를 호출자에게 전달 가능
ServiceConnection(서비스와의 연결 모니터링 역할) 구현해야함