관리 메뉴

나만을 위한 블로그

[Android] onNewIntent()란? 본문

Android

[Android] onNewIntent()란?

참깨빵위에참깨빵 2023. 11. 13. 00:35
728x90
반응형

이 함수에 대한 안드로이드 디벨로퍼의 설명은 아래와 같다.

 

https://developer.android.com/reference/android/app/Activity#onNewIntent(android.content.Intent)

 

Activity  |  Android Developers

 

developer.android.com

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()에 대해 설명하는 다른 포스팅이다.

 

https://chebaum.tistory.com/5

 

안드로이드 프로그래밍 Intent(인텐트) 기초 사용법 - 기본자료형 외에도 직접만든class, ArrayList<T>

Android programming - Intent(인텐트) Intent(인텐트)란, 안드로이드 4대 컴포넌트(activity, service, broadcast receiver, content provider)가 서로 데이터를 주고 받기 위한 메세지 기능을 한다. 인텐트는 명시적인텐트

chebaum.tistory.com

서비스에서 액티비티를 실행하는 경우도 있다. 이 때 액티비티를 새로 만들어 실행할 수도 있지만 이미 유저가 보고 있는 액티비티 위에 액티비티를 실행하는 경우가 생길 수도 있다. 동일한 액티비티가 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

 

Android 백스택

안드로이드에는 여러가지 launchMode가 존재한다. 이 launchMode에 따라서 안드로이드의 Activity의 백스택의 쌓이는 방식이 다르다.

medium.com

(중략)...singleTask도 기본적으로 같은 앱에선 같은 태스크에 백스택이 쌓이게 된다. 하지만 D 액티비티에서 singleTask로 선언된 C 액티비티 호출 시, 호출된 C 액티비티 위에 쌓인 스택들이 사라지고 호출된 C 액티비티에서 onNewIntent() 콜백이 호출된다...(중략)...이미 C 액티비티가 백그라운드에 살아 있는 경우 호출될 때 onNewIntent()가 호출된다. 백그라운드에 없다면 C 액티비티 인스턴스를 새로 생성한다

 

https://bb-library.tistory.com/260

 

[안드로이드] FCM 서비스를 통해 메시지를 foreground, background에서 받을 경우 데이터 처리 방법 및

개요 파이어베이스의 FCM을 통해 안드로이드 애플리케이션으로 데이터를 전송함과 동시에 노티피케이션 클릭 시 특정 액티비티로 이동하는 방법을 설명한다. (FCM 세팅 방법 및 서버에서 FCM PUSH

bb-library.tistory.com

안드로이드는 onCreate()에서 보통 인텐트를 받아 처리하곤 한다. 하지만 앱이 실행 중인 동안 새 인텐트가 도착한다면, onCreate()는 액티비티가 생성될 때 단 한 번만 호출되기 때문에 onCreate()에서 처리할 수 없다. 때문에 액티비티가 새로 생성되지 않고 사용 중인 상황에서 인텐트를 받기 위한 메서드가 onNewIntent()다

 

블로그들의 내용을 보면 디벨로퍼와 달리 launchMode가 singleTop, singleTask, singleInstance인 경우 특정 조건에 따라 onNewIntent()가 호출된다고 말하고 있다. 국내 블로그 뿐 아니라 스택오버플로우를 비롯한 외국 사이트를 찾아봐도 똑같다. 디벨로퍼의 내용이 누락돼 있는 것 같아서 찾아보니, 아래 디벨로퍼 링크에서 launchMode 별로 onNewIntent()가 호출된다는 내용을 찾았다.

 

https://developer.android.com/guide/components/activities/tasks-and-back-stack?hl=ko#ManifestForTasks

 

작업 및 백 스택 이해  |  Android 개발자  |  Android Developers

일반적으로 앱에는 여러 활동이 포함됩니다. 각 활동은 사용자가 실행할 수 있는 특정 종류의 작업을 중심으로 설계되어야 하며 다른 활동을 시작할 수 있어야 합니다. 예를 들어 이메일 앱에는

developer.android.com

 

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] 안드로이드 Intent Flag 정리

Intent flag를 언제 사용하는가? 안드로이드에서 Activity를 호출하다보면 발생하는 Activity의 중복문제나 흐름을 제어해주고 싶을 때 Flag를 사용합니다. Task Task는 Stack 구조로 되어있으며 애플리케이

seosh817.tistory.com

 

반응형
Comments