일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안드로이드 유닛테스트란
- 자바 다형성
- rxjava hot observable
- jvm이란
- 안드로이드 유닛 테스트 예시
- 객체
- ar vr 차이
- 플러터 설치 2022
- 2022 플러터 안드로이드 스튜디오
- android ar 개발
- 클래스
- 큐 자바 코드
- Rxjava Observable
- 안드로이드 라이선스
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- rxjava cold observable
- 안드로이드 os 구조
- 안드로이드 유닛 테스트
- 서비스 쓰레드 차이
- 스택 자바 코드
- 안드로이드 라이선스 종류
- 멤버변수
- android retrofit login
- ANR이란
- 안드로이드 레트로핏 crud
- 2022 플러터 설치
- 서비스 vs 쓰레드
- rxjava disposable
- jvm 작동 원리
- Today
- Total
나만을 위한 블로그
[Android] onNewIntent()란? 본문
이 함수에 대한 안드로이드 디벨로퍼의 설명은 아래와 같다.
https://developer.android.com/reference/android/app/Activity#onNewIntent(android.content.Intent)
launchMode를 singleTop으로 설정한 액티비티에 대해 호출되거나, 클라이언트가 startActivity(intent)를 호출할 때 FLAG_ACTIVITY_SINGLE_TOP 플래그를 사용한 경우 호출된다. 두 경우 모두 액티비티가 시작되는 새 인스턴스 대신 액티비티 스택의 최상위에 있는 동안 액티비티가 재시작되면 onNewIntent()가 재시작하는 데 사용된 인텐트와 함께 기존 인스턴스에서 호출된다. 액티비티는 재개된 상태에서 새 인텐트를 받을 수 없다. 이 메서드 이후 onResume()이 호출될 걸로 예상할 수 있지만, 반드시 이 콜백이 완료된 직후는 아니다. 액티비티가 재개되면 일시 중지되고 새 인텐트가 전달된 후 onResume()이 전달된다. 액티비티가 재개된 상태가 아닌 경우 나중에 액티비티가 재활성화될 때 onResume()이 호출돼 새 인텐트가 즉시 전달될 수 있다. getIntent()는 여전히 원래 인텐트를 리턴한다. setIntent(intent)를 써서 새 인텐트로 업데이트할 수 있다
즉 onNewIntent()는 매니페스트에서 액티비티의 launchMode를 singleTop으로 설정하거나, FLAG_ACTIVITY_SINGLE_TOP 플래그를 썼을 경우, 액티비티 스택의 최상위 액티비티가 새로운 인텐트를 통해 재시작될 때 호출되는 메서드다.
이 메서드가 사용되는 이유는 무엇인가? 절대적인 건 아니지만 대개 아래의 이유로 사용된다.
- 인텐트 업데이트 : 실행 중이던 액티비티가 새 인텐트로 재시작될 때, 이 새로운 인텐트에 포함된 데이터를 처리하기 위해 사용된다. 딥링크나 푸시 알림을 통해 백그라운드에 있던 앱을 재실행할 때, singleTop으로 설정한 액티비티가 표시된 상태에서 백그라운드로 이동했다면 그 데이터를 처리하기 위해 onNewIntent()를 활용할 수 있다
- 액티비티 상태 유지 : singleTop 또는 singleTask로 launchMode를 설정한 경우, 해당 액티비티가 태스크 스택의 최상단에 있을 때 새 인텐트로 재시작된 경우 기존 액티비티 인스턴스가 재사용된다. 이 때 onNewIntent()를 통해 새 인텐트에 따라 액티비티 상태를 업데이트할 수 있다
이런 이유로 onNewIntent()를 활용하면면 앱은 새로운 인텐트의 데이터를 써서 원하는 작업을 수행할 수 있게 된다.
아래는 onNewIntent()에 대해 설명하는 다른 포스팅이다.
서비스에서 액티비티를 실행하는 경우도 있다. 이 때 액티비티를 새로 만들어 실행할 수도 있지만 이미 유저가 보고 있는 액티비티 위에 액티비티를 실행하는 경우가 생길 수도 있다. 동일한 액티비티가 2개 만들어지고 가장 위에 있는 액티비티만 보이는 상황이 되는 것이다. 이 때 맨 위의 액티비티를 finish()로 없애도 유저한텐 같은 액티비티가 다시 보인다. 플래그를 쓰면 같은 액티비티가 다시 호출될 경우 기존 액티비티를 그대로 사용할 수 있게 해 준다. 그런데 이미 만들어진 액티비티를 그대로 사용하기 때문에 onCreate()가 호출되지 않는다. onCreate()는 액티비티가 메모리에 처음 생성될 때 자동으로 호출되는데 액티비티가 이미 만들어져 있으니 호출되지 않는 것이다. 이 때 onNewIntent()가 호출된다. 이 메서드가 별도로 호출되는 이유는 인텐트를 전달받기 위해서다. onCreate()가 호출된 경우 이 안에서 getIntent()를 써서 전달받은 인텐트 객체를 확인할 수 있지만, onCreate()가 호출되지 않는 경우엔 onNewIntent() 안에서 인텐트 객체를 확인할 수 있다
https://medium.com/@dawn_kgh/android-%EB%B0%B1%EC%8A%A4%ED%83%9D-412cfb0960b
(중략)...singleTask도 기본적으로 같은 앱에선 같은 태스크에 백스택이 쌓이게 된다. 하지만 D 액티비티에서 singleTask로 선언된 C 액티비티 호출 시, 호출된 C 액티비티 위에 쌓인 스택들이 사라지고 호출된 C 액티비티에서 onNewIntent() 콜백이 호출된다...(중략)...이미 C 액티비티가 백그라운드에 살아 있는 경우 호출될 때 onNewIntent()가 호출된다. 백그라운드에 없다면 C 액티비티 인스턴스를 새로 생성한다
https://bb-library.tistory.com/260
안드로이드는 onCreate()에서 보통 인텐트를 받아 처리하곤 한다. 하지만 앱이 실행 중인 동안 새 인텐트가 도착한다면, onCreate()는 액티비티가 생성될 때 단 한 번만 호출되기 때문에 onCreate()에서 처리할 수 없다. 때문에 액티비티가 새로 생성되지 않고 사용 중인 상황에서 인텐트를 받기 위한 메서드가 onNewIntent()다
블로그들의 내용을 보면 디벨로퍼와 달리 launchMode가 singleTop, singleTask, singleInstance인 경우 특정 조건에 따라 onNewIntent()가 호출된다고 말하고 있다. 국내 블로그 뿐 아니라 스택오버플로우를 비롯한 외국 사이트를 찾아봐도 똑같다. 디벨로퍼의 내용이 누락돼 있는 것 같아서 찾아보니, 아래 디벨로퍼 링크에서 launchMode 별로 onNewIntent()가 호출된다는 내용을 찾았다.
onNewIntent()에 대한 내용을 정리하면 아래와 같다. 위 내용에 없는 내용들은 다른 블로그와 디벨로퍼를 참고해서 작성됐다.
- onNewIntent()는 onCreate()가 이미 호출된, 즉 이미 생성되어 백 스택에 들어간 액티비티가 다시 실행되거나 해당 액티비티가 태스크 최상단에 위치해 있을 경우 호출되는 메서드다
- 매니페스트에서 액티비티의 launchMode가 singleTop, singleTask, singleInstance인 경우 모두에 호출된다. 또는 인텐트에 FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP 플래그를 적용한 후, 해당 액티비티를 재실행한 경우에도 호출된다
- onCreate()가 이미 호출된 경우 새 인텐트를 받아서 처리하기 위해 onNewIntent()를 사용할 수 있다
- 딥링크를 통해 앱을 실행하거나, 푸시 알림을 눌러 앱을 실행해야 하는 경우 등에 사용할 수 있다
참고한 다른 사이트)
https://seosh817.tistory.com/14
'Android' 카테고리의 다른 글
[Android] BottomSheetDialogFragment 스크롤 시 내부 요소가 스크롤되게 하는 법 (0) | 2023.11.16 |
---|---|
[Android] 딥링크로 url을 받았을 때 쿼리 파라미터에 & 기호가 여러 개 포함된 경우 처리 방법 (0) | 2023.11.13 |
[Android] UseCase에서 invoke를 사용하는 이유 (with 클린 아키텍처) (0) | 2023.11.12 |
[Android] 폴더블 기기 펼침 여부 확인하는 방법 (Jetpack WindowManager) (0) | 2023.11.08 |
[Android] WebView Cache 전략 설정 방법 (0) | 2023.10.22 |