[ Do it! ] 안드로이드 앱 프로그래밍 - #3. 어플리케이션 구성하기 (4)

ma.caron_g·2022년 3월 27일
0

Do it! - Android Studio

목록 보기
10/18
post-thumbnail

액티비티로 만들어진 화면이 한 번 메모리에 만들어졌는데도 계속 startActivty() 또는 ActivityResultLauncher() 메서드가 반복적으로 호출되면 동일한 액비비티가 여러 개 만들어집니다. 이때, 플래그(Flag)라는 개념을 사용하여 액티비티가 동작하는 방식을 줄일 수 있습니다.

1. 플래그

1-1. 플래그란?

액티비티는 액티비티 스택(Activity Stack)이라는 것으로 관리되는데 이 스택은 액티비티를 차곡차곡 쌓아두었다가 가장 상위 액티비티가 없어지면 이전의 액티비티가 화면에 보이게 해줍니다.

스택 구조를 이용해 액티비티가 관리되기는 하지만 만약 동일한 액티비티를 여러 번 실행한다면 동일한 액티비티가 여러 개 스택에 들어가게 되고 동시에 데이터를 여러 번 접근하거나 리소스를 여러 번 사용하는 문제가 발생할 수 있습니다.

이러한 문제점을 해결할 수 있도록 해주는 것이 바로 플래그입니다.


1-2. 플래그 메서드

Reference설 명
FLAG_ACTIVITY_SINGLE_TOP액티비티를 생성할 때 이미 생성된 액티비티가 있으면 그 액티비를 그대로 사용하게 합니다
FLAG_ACTIVITY_NO_HISTORY처음 이후에 실행된 액티비티는 액티비티에 추가되지 않습니다
FLAG_ACTIVITY_CLEAR_TOP해당 액티비티 위에 있는 다른 액티비티를 모두 종료시킵니다

🚩 FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_SINGLE_TOP 를 사용하면 화면에 보이는 액티비티가 새로 만들어지지 않고 기존에 있는 것이 보인다면 시스템에서 전달하는 인텐트 객체를 어떻게 전달할까요?

새로운 액티비티를 띄워주는 액티비티를 부모 액티비티라고 부른다면, 부모 액티비티로부터 전달하는 인텐트는 새로 만들어진 인텐트의 onCreate() 메서드 안에서 getIntent() 메서드로 참조할 수 있습니다.
그런데 액티비티가 새로 만들어지지 않고 재사용된다면 액티비티의 onCreate() 메서드가 호출되지 않습니다.
이 경우에는 새로 띄워지는 액티비티에서 인텐트로 전달 받아 처리하는 방법이 따로 있어야 합니다.
그것은 바로 onNewIntent()메소드 입니다. onNewIntent 메소드를 재정의하면 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달 받을 수 있습니다.

🚩 FLAG_ACTIVITY_NO_HISTORY

플래그가 설정되어 있지 않은 경우에는 이전에 실행되었던 액티비티가 스택에 추가되므로 [Back] 키를 누르면 이전의 액티비티가 보이게 되지만 이 플래그를 사용하면 항상 맨 처음에 실행되었던 액티비티가 바로 보이게 됩니다.
이 플래그는 알람 이벤트가 발생하여 사용자에게 한 번 알림 화면을 보여주고 싶을 때 유용하게 사용할 수 있습니다.
알람은 한 번만 보여주면 되므로 여러 번 알람 이벤트가 발생하더라도 그 화면만 한 번 보여주는 형태로 만들 수 있습니다.

🚩 FLAG_ACTIVITY_CLEAR_TOP

홈 화면과 같은 다른 액티비티보다 항상 우선하는 액티비티를 만들 때 유용하게 사용할 수 있습니다.
만약 홈 화면이 여러 개 있는 것이 아니라 하나만 만들어지는 것으로 하고 싶을 때 FLAG_ACTIVITY_SINGLE_TOP 플래그와 함께 설정하면 하나의 객체가 메모리에 존재하면서 그 상위의 액티비티를 모두 종료시킬 수 있습니다.


2. 부가 데이터

2-1. Extra data

한 화면에서 다른 화면을 띄울 때 데이터를 전달해야 하는 경우도 생깁니다.

예를 들어, 로그인 화면에서 로그인 버튼을 눌러 로그인 과정을 진행할 때, 메뉴 화면을 띄우려면 메뉴 화면쪼으로 아이디나 이름을 전달해야할 수 있습니다.

이런 경우, 가장 간단한 방법은 별도의 클래스를 만든 다음 그 안에 클래스 변수(static 키워드를 이용해 선언한 변수)를 만들고 두 개의 화면에서 모두 그 변수를 참조하게 하는 방법입니다.

즉, 한 화면에서 그 변수에 값을 설정하고 다른 화면에서 그 변수의 값을 참조하도록 만들면 됩니다.

하지만 안드로이드는 다른 앱에서 여러분이 만든 화면을 띄울 수도 있기 때문에 변수를 공유하는 방식으로 데이터를 전달하는 것이 불가능할 수 있습니다.

따라서 기본적으로는 액티비티를 띄울 때 전달되는 인텐트 안에 부가 데이터(Extra data)를 넣어 전달하는 방법을 권장합니다.

인텐트 안에는 번들(Bundle) 객체가 존재하는데, 번들 객체는 해시테이블과 유사해서 putExtra()getOOOOExtra() 메서드로 데이터를 넣거나 빼낼 수 있습니다.
(OOOO는 타입명 ex. int / String)

기본적으로 기본 자료형(Primitive Data Type)을 넣었다 뺄 수 있지만 바이트 배열이나 Serializable객체도 넣었다 뺄 수 있습니다.

번들 객체 안에 넣은 데이터를 부가 데이터라고 합니다.

번들 안에 부가 데이터를 넣을 때는 키(Key)와 값(Value)을 쌍으로 다른 어플리케이션 구성요소로 만들어 전달합니다.

Intent putExtra(String name, String value)
Intent putExtra(String name, int value)
Intent putExtra(String name, boolean value)

String getStringExtra("키값")
int getIntExtra(String name, int defaultValue)
boolean putExtra(String name, boolean defalutValue)

getOOO()형태를 가진 메서드는 데이터 값이 없으면 디폴트로 설정한 defaultValue값을 리턴합니다.

전달하고 싶은 데이터가 기본 자료형이 아니라 객체(Object ) 자료형인 경우에는 객체 자료를 전달할 수 없습니다. 따라서 객체의 데이터들을 바이트 배열로 변환하여 전달하거나 또는 Serializable 인터페이스를 구현하는 객체를 만들어 직렬화한 후 전달할 수 있습니다.

profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글