일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 멤버변수
- ar vr 차이
- 안드로이드 os 구조
- 자바 다형성
- 플러터 설치 2022
- rxjava disposable
- android retrofit login
- jvm이란
- 스택 큐 차이
- Rxjava Observable
- rxjava hot observable
- 2022 플러터 설치
- jvm 작동 원리
- 안드로이드 유닛 테스트 예시
- 안드로이드 라이선스
- 2022 플러터 안드로이드 스튜디오
- ANR이란
- 안드로이드 레트로핏 사용법
- android ar 개발
- 안드로이드 라이선스 종류
- 서비스 쓰레드 차이
- rxjava cold observable
- 서비스 vs 쓰레드
- 클래스
- 안드로이드 유닛 테스트
- 큐 자바 코드
- 안드로이드 유닛테스트란
- 안드로이드 레트로핏 crud
- 객체
- 스택 자바 코드
- Today
- Total
나만을 위한 블로그
[Android] 플래그란? 내가 자주 쓰는 플래그 정리 본문
※ 이 글은 내가 자주 쓰는 플래그들을 적어두고 각각 어떤 기능을 하는지 정리하기 위해 쓰는 글이다. 모든 플래그들을 다루진 않는다.
※ 이 글에선 인텐트 플래그와 플래그라는 말을 혼용해서 사용한다. 둘 다 같은 단어라고 보면 된다.
안드로이드 앱 개발을 하다보면 때로는 특정 액티비티의 시작을 제어할 수 있어야 한다. 글 작성 버튼을 누르면 이전 액티비티를 다시 나오게 해야 한다고 가정하자. 이 때 플래그를 설정하지 않으면 같은 액티비티가 하나 더 생겨서 백버튼을 누르면 같은 액티비티를 2번 봐야 하는 일이 생길 수 있다.
이런 일을 방지하기 위해 존재하는 게 플래그다. 인텐트 플래그라고도 불리는 플래그를 쓰면, 액티비티 스택에 어떤 액티비티가 무슨 액티비티의 위에 있건 아래에 있건 상관없이 원하는 액티비티를 불러올 수도 있고, 액티비티 스택에 들어있는 액티비티들을 전부 지운 다음 호출하는 액티비티부터 스택에 채우도록 할 수도 있다. 즉 디테일을 잡기 위해 가장 먼저 고려할 수 있는 기능 중 하나다.
예시를 통해 보자. 먼저 인텐트를 통해 액티비티를 불러오는 기본적인 방법은 아래와 같다.
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
이 코드는 아래 순서로 실행된다.
- 새 SecondActivity 인스턴스(객체)가 생성된다.
- 이 인스턴스가 현재 태스크 스택의 최상단에 올라간다.
- 액티비티가 시작되면서(onStart()) 포그라운드에 나타난다.
이 때 인텐트 플래그를 써서 액티비티 실행을 내 맘대로 조정할 수 있다.
플래그 사용법은 Intent intent = new Intent(Intent.플래그이름); 형식으로 쓰면 된다.
호출하는 액티비티와 호출되는 액티비티가 무엇인지, StartActivityForResult()를 쓴 경우에 처리를 어떻게 할 것인지 등을 미리 생각하고 사용하면 더 좋다.
플래그의 종류는 정말 많다. 각 플래그 별 어떤 행동을 하는지는 디벨로퍼를 참고하자. 우측에 플래그 목록들이 나와 있으니 내게 필요한 플래그들을 찾아서 어떤 기능을 하는 플래그인지 알아보면 좋다.
플래그는 설명만 들으면 뭔 소린지 못 알아먹겠는 경우가 있으므로 일단 써보고 어떻게 동작하는지 확인하는 게 가장 베스트라고 생각한다.
https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_CLEAR_TASK
영어 울렁증이 있다면 구글링만 해도 어떤 플래그가 어떤 기능을 하는지 자세히 적어놓은 분들이 많다. 그 분들의 글들을 참고하자.
플래그를 사용하는 법은 매니페스트에서 사용하는 법, 자바 파일(클래스) 안에서 사용하는 법 2개가 있다.
매니페스트에서 쓰는 인텐트는 android:launchMode를 통해 쓸 수 있고, 종류는 4개가 있다.
1. standard : 액티비티 스택 중 어느 곳에나 위치할 수 있고 여러 액티비티 인스턴스를 만들 수 있다.
2. singleTop : standard와 같지만 호출한 액티비티와 현재 액티비티 스택 최상위에 있는 액티비티가 같은 경우 최상위 액티비티를 다시 가져와 재활용한다.
3. singleTask : 하나의 액티비티 인스턴스만 생성 가능하다. 다른 액티비티 실행 시 같은 태스크 안에서 실행 가능함
4. singleInstance : 루트 액티비티로만 존재하며 하나의 액티비티 인스턴스만 생성 가능, 태스크 안에 이 속성을 쓰는 액티비티 하나만 속할 수 있어서, 다른 액티비티를 실행하면 새로운 태스크가 생성되어 그 태스크 안에 포함된다.
다음은 자바 클래스 안에서 사용하는 플래그들이다. 인텐트에 플래그를 붙이는 방법은 크게 2가지가 있다.
intent.addFlags();
intent.setFlags();
setFlags()를 쓰면 기존 플래그를 없애고 인자로 넣은 플래그를 실행시킨다. 굴러온 돌이 박힌 돌 빼는 거라고 생각하면 된다.
addFlags()를 쓰면 기존 플래그를 없애지 않고 인자로 넣은 플래그를 새로 추가시켜 실행한다.
1. FLAG_ACTIVITY_CLEAR_TOP
인텐트 플래그를 통해 호출하는 액티비티가 액티비티 스택에 이미 존재할 경우 호출하는 액티비티를 스택의 최상위로 올리면서 그 위에 있던 액티비티들은 전부 삭제하는 플래그다.
위 이미지처럼 ABCDE 액티비티가 있는 상태에서 C를 호출하게 되면 ABC만 남게 되고 D, E는 사라진다.
꽤 자주 쓰는 플래그다.
2. FLAG_ACTIVITY_FORWARD_RESULT
startActivityForResult(intent, 숫자);를 써서 다른 액티비티를 호출할 경우, 호출하는 액티비티가 아니라 다른 액티비티로 이동해서 결과값을 받고 싶은 경우가 있다.
위 이미지처럼 A에서 startActivityForResult()를 사용해 B 액티비티로 이동한 뒤, B에서 C 액티비티를 호출했다고 가정한다. 그리고 이 상태에서 C 액티비티에서 작업을 한 이후 A 액티비티로 이동해야 한다.
그럼 중간에 껴있는 B 액티비티를 거쳐야 한다. A -> B -> C 형태로 이동해 값을 처리했으니 C -> B -> A 형태로 값이 다시 돌아와야 하는 것이다.
단순한 값을 옮기는 거면 몰라도 여러 개의 값을 옮기는 경우에는 매우 번거롭고 귀찮다. 이 경우를 위해 안드로이드는 이 인텐트 플래그를 제공한다.
위 이미지를 보면 B가 C를 호출하기 위해 startActivity()를 호출한 걸 볼 수 있다. 이 때 인텐트에 지금 설명중인 플래그를 붙인다. 그 후 C 액티비티에선 setResult()를 통해 결과값을 정의한 후, finish()로 액티비티를 죽인다.
이렇게 하면 B 액티비티에선 단순히 finish()를 통해 액티비티를 종료시키기만 하면 된다.
startActivityForResult()를 통해 B 액티비티를 호출했던 A 액티비티에선 onActivityResult() 콜백으로 결과값을 받아 처리하면 C 액티비티에서 정의한 값을 받을 수 있다.
3. FLAG_ACTIVITY_NO_ANIMATION
액티비티 전환 시 화면이 바뀌는 효과(애니메이션)를 볼 수 있다. 이 효과를 없애주는 플래그다.
사용 시 애니메이션 없이 화면만 딱딱 바뀐다.
4. FLAG_ACTIVITY_REORDER_TO_FRONT
이 플래그를 쓰면 호출하는 액티비티가 스택에 있을 경우 액티비티 스택의 최상위로 올려준다.
위 이미지처럼 ABCDE 순서로 액티비티 스택이 만들어져 있는 상태에서 C 액티비티를 호출하면 ABDEC 형태로 정렬된다. 자주 쓰진 않는다.
5. FLAG_ACTIVITY_SINGLE_TOP
이 플래그를 쓰면 호출되는 액티비티가 스택 최상위에 존재할 경우 해당 액티비티를 다시 만들지 않고 기존에 있던 액티비티를 가져와 재활용한다.
ABC가 있는 경우 C를 호출하면 기존과 동일하게 ABC가 나오게 된다. CLEAR_TOP처럼 자주 쓰는 플래그다.
내가 자주 쓰는 플래그는 이 정도다. 이것 말고도 플래그 종류는 엄청 많으니 적절한 곳에 적절한 플래그를 쓰면 좋을 것 같다.