카테고리 없음

안드로이드 면접 정리

hsdev 2019. 10. 9. 16:33

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(서비스와의 연결 모니터링 역할) 구현해야함