반응형

플래그

플래그는 인텐트에 추가할 수 있는 옵션이라고 이해하면 쉽습니다.

다시 말해, 시스템이 인텐트를 해석한 후 무언가를 동작시킬 때 옵션에 따라 다른 동작을 하도록 만들 수 있습니다.

플래그는 인텐트 객체의 addFlags 메소드를 이용해 설정할 수 있으며 여러 개의 플래그를 | 기호로 붙여 한꺼번에 설정할 수도 있습니다.

가장 많이 사용되는 플래그는 다음과 같은 세 개의 플래그입니다.

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP

이 플래그는 나중에 브로드캐스트 수신자(BroadcastReceiver)에 대해 살펴볼 때 다시 볼 수 있습니다.

예를 들어, SMS 문자를 수신했을 때 그 내용을 받아 처리하는 것이 브로드캐스트 수신자(BroadcastReceiver)입니다.

이 브로드캐스트 수신자(BroadcastReceiver)에서 액티비티를 띄우고 그 안에서 수신한 문자를 보여주려 한다면 문자가 도착할 때마다 액티비티가 뜨게 될 겁니다

따라서 화면에 뜬 액티비티를 바로바로 없애주지 않으면 여러 개의 액티비티가 층층이 쌓이는 문제가 발생할 수 있는데 이것을 Intent.FLAG_ACTIVITY_SINGLE_TOP 으로 해결할 수 있습니다.

Intent.FLAG_ACTIVITY_SINGLE_TOP 플래그는 동일한 액티비티가 이미 메모리에 만들어져 있다면 추가로 만들지 않고 그 액티비티를 화면에 띄워주는 역할을 합니다.

Intent.FLAG_ACTIVITY_NEW_TASK 플래그는 액티비티들을 관리하는 태스크(TASK) 객체를 새로 만들도록 합니다.

나중에 살펴볼 브로드캐스트 수신자(BroadcastReceiver)나 서비스(Service)는 화면이 없기 때문에 새로운 화면을 띄워주려면 먼저 태스크(Task) 객체가 만들어져야 합니다.

따라서 이 플래그를 추가해주어야 합니다.

Intent.FLAG_ACTIVITY_CLEAR_TOP 플래그는 원하는 액티비티가 이미 메모리에 만들어져 있고 그 이후에 다른 액티비티가 만들어진 경우 원하는 액티비티를 찾아 다시 띄울 때 그 이후에 만들어진 다른 액티비티들은 없애주는 역할을 합니다.

이런 플래그들을 이해하려면 액티비티 스택(Activity Stack)에서 액티비티가 관리된다는 점을 이해해야 합니다.

여기에서는 플래그가 어떤 것인지 이해하기만 해도 충분합니다.

나중에 브로드캐스트 수신자(BroadcastReceiver) 부분에서 실제 코드로 연습해보기 바랍니다.


부가데이터

메인 액티비티에서 메뉴 액티비티를 띄워주고 싶다면 인텐트를 사용합니다.

그리고 이 인텐트는 새로 화면에 보이는 메뉴 액티비티까지 전달됩니다.

인텐트가 메뉴 액티비티까지 전달되므로 메뉴 액티비티에서는 전달받은 인텐트 안에 들어있는 데이터를 꺼내어 사용할 수 있습니다.

이렇게 인텐트는 시스템을 통해 다른 액티비티로 전달될 수 있는데 액티비티뿐만 아니라 다른 애플리케이션 구성요소로도 전달될 수 있습니다.

자주 사용되는 애플리케이션 구성요소로는 액티비티(Activity), 서비스(Service), 브로드캐스트 수신자(BroadcastReceiver) 등이 있으며 이 구성요소들 간에 데이터를 전달하는 데 인텐트가 사용되는 것입니다.

부가 데이터는 시스템에서 건드리지 않고 전달만 되며 인텐트 안에 번들(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)은 Boolean, Integer, Float, String과 같은 기본 자료형들입니다.

그런데 기본 자료형의 데이터만 넣을 수 있다면 Person 객체와 같이 여러 개의 속성이 들어가 있는 객체의 정보들을 전달하고 싶을 때는 일일이 그 속성들을 나누어 넣어야 하는 번거로움이 생길 것입니다.

이 때문에 Serializable 객체를 부가데이터로 넣을 수 있게 되어 있습니다.

그리고 Serializable보다 좀 더 메모리 용량을 적게 차지하는 Parcelable 객체를 만들어 전달할 수도 있습니다.

ArrayList와 같은 객체들은 이미 Serializable 인터페이스를 구현하고 있으므로 그대로 부가데이터로 추가할 수 있으며, 그 외에 Person과 같이 직접 정의하는 객체들은 Parcelable 인터페이스를 구현한 후 부가데이터로 추가하는 것을 권장합니다.

따라서 Parcelable 인터페이스를 구현하는 방법에 대해 알아두는 것이 좋습니다.


반응형

'안드로이드 개발 > 부스트코스(안드로이드 프로그래밍)' 카테고리의 다른 글

서비스  (0) 2019.03.10
엑티비티 수명주기  (0) 2019.03.09
인텐트(Intent)  (0) 2019.03.08
화면 구성과 화면 간 전환  (0) 2019.03.08
그리드뷰  (0) 2019.03.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기