아래의 글은 BOOSTER 서포터즈로 활동했던 zhfpt***님이
작성한 부스트코스 후기입니다.
여러분들의 성원에 더 노력하는 부스트코스가 되겠습니다.
감사합니다.
******************************************
1)링크: https://blog.naver.com/zhfptm12/221812443421
2)작성날짜: 20/02/17
시스템에서 이해할 수 있는 객체로 만든 것이 인텐트인데, 이 인텐트 안에는 여러 가지 정보가 들어갈 수 있습니다.
어떤 정보를 넣느냐에 따라 시스템이 해석하는 방법이 달라지게 됩니다.
만약 다른 화면으로 데이터를 전달하고 싶다면 인텐트 안에 넣어서 전달할 수도 있습니다.
인텐트에 설정하는 플래그에 대해 알아보고, 인텐트에 부가 데이터로 넣어 전달하는 Parcelable에 대해서도 알아봅시다.
플래그
플래그는 인텐트에 추가할 수 있는 옵션이라고 이해하면 쉽습니다.
가장 많이 사용되는 플래그는 다음과 같은 세 개의 플래그입니다.
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_SINGLE_TOP 플래그에 대해서 설명하자면, 동일한 액티비티가 계속 호출되는 상황에서 사용됩니다.
예를 들면,
SMS 문자를 수신했을 때 그 내용을 받아 처리하는 것이 브로드캐스트 수신자(BroadcastReceiver)입니다.
이 브로드캐스트 수신자(BroadcastReceiver)에서 액티비티를 띄우고 그 안에서 수신한 문자를 보여주려 한다면 문자가 도착할 때마다 액티비티가 뜨게 될 겁니다
따라서 화면에 뜬 액티비티를 바로바로 없애주지 않으면 여러 개의 액티비티가 층층이 쌓이는 문제가 발생하게 됩니다.
Intent.FLAG_ACTIVITY_SINGLE_TOP 플래그는 동일한 액티비티가 이미 메모리에 만들어져 있다면 추가로 만들지 않고 그 액티비티를 화면에 띄워주는 역할을 합니다.
Intent.FLAG_ACTIVITY_CLEAR_TOP 플래그는 원하는 액티비티가 이미 메모리에 만들어져 있고 그 이후에 다른 액티비티가 만들어진 경우 원하는 액티비티를 찾아 다시 띄울 때 그 이후에 만들어진 다른 액티비티들은 없애주는 역할을 합니다.
부가 데이터
메인 액티비티에서 메뉴 액티비티를 띄워주고 싶다면 인텐트를 사용합니다.
그리고 이 인텐트는 새로 화면에 보이는 메뉴 액티비티까지 전달됩니다.
인텐트가 메뉴 액티비티까지 전달되므로 메뉴 액티비티에서는 전달받은 인텐트 안에 들어있는 데이터를 꺼내어 사용할 수 있습니다.
부가 데이터는 시스템에서 건드리지 않고 전달만 되며 인텐트 안에 번들(Bundle) 객체가 들어가 있어 그 안에 데이터를 넣을 때는 put …, 문자열을 가져올 때는 get … 메서드를 사용합니다.
액티비티 A에서 액티비티 B를 실행하고 다시 액티비티 A로 돌아오는 과정을 정리해보면 다음과 같습니다.
1. 액티비티 A에서는 인텐트 객체를 만들고 put … 메서드를 이용해 부가 데이터를 넣어줍니다.
2. 그리고 startActivityForResult 메서드를 호출합니다.
3. 액티비티 B가 실행된 후 setResult 메서드를 호출하면서 인텐트를 전달하고 finish 메서드를 호출하면 액티비티 A로 돌아옵니다.
4. 액티비티 B에서도 인텐트 안에 부가 데이터를 넣어 전달할 수 있는데 이 인텐트는 액티비티 A의 onActivityResult 메서드가 호출되면서 전달받을 수 있습니다.
Serializable과 Parcelable
put... 과 get... 메서드를 이용해 인텐트에 넣을 수 있는 부가 데이터의 자료형(Type)은 기본 자료형입니다.
그런데 여러 개의 속성이 들어가 있는 객체의 정보들을 전달하고 싶을 때는 불편합니다.
이럴 때 Serializable 객체를 부가 데이터로 넣을 수 있습니다.
그리고 Serializable보다 좀 더 메모리 용량을 작게 차지하는 Parcelable 객체를 만들어 전달할 수도 있습니다.
ArrayList와 같은 객체들은 이미 Serializable 인터페이스를 구현하고 있으므로 그대로 부가 데이터로 추가할 수 있습니다.
이외에 직접 정의한 객체들은 Parcelable 인터페이스를 구현한 후 추가해 줄 수 있습니다.
<생각해보기>
1. ArrayList 안에 사람 이름을 여러 개 넣은 후 다른 액티비티로 전달하려면 어떻게 해야 할까요?
- ArrayList 객체들은 Serializable 인터페이스를 구현하고 있으므로 배운 대로 putExtra로 추가할 수 있습니다.
2. 사진 이미지와 같이 용량이 큰 파일도 인텐트 안에 부가 데이터로 넣을 수 있을까요? 만약에 안된다면 다른 액티비티로 이 사진을 전달할 방법이 있을까요?
- Paecelabel 인터페이스를 재정의해서 사용한다면 가능할 것 같습니다.
[출처] [부스트 코스] 안드로이드 - 부가 데이터 03주 차|작성자 zhfptm12