플래그
플래그는 인텐트에 추가할 수 있는 옵션이라고 이해하면 쉽습니다.
다시 말해, 시스템이 인텐트를 해석한 후 무언가를 동작시킬 때 옵션에 따라 다른 동작을 하도록 만들 수 있습니다.
플래그는 인텐트 객체의 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 … 메소드를 사용합니다.
comment
개인적으로 Parcelable가 훨씬 어렵네요....
두번쨰 동영상에서 메뉴화면으로 전환하고, 전환된 메뉴 클래스에서 토스트메시지를 띄우도록 설정했는데 정말 똑같이 설정했는데 토스트메시지만 안뜨네요 ㅜㅜㅜ 왜 그러죠>>>??
Parcelable에서 데이터로 다시 만들때 인트값이 여러종류이면 어떠한 순서로 데이터가 인식이 되나요?
Serializable에 비해서 Parcelable 를 사용하는 것이 훨씬 복잡하네요.. 저는 그냥 Serializable 쓸듯 ㅠㅠ
Parcelable 에 대해서 설명이 거의 없고 그냥 따라치기만 해서 이해가 잘 안되네요
Parcelable은 어떻게 데이터를 전달할 수 있는 건가요? Creator와 Parcel을 내부적으로 사용하는 것 같은데 어떤 식으로 되는건지 감이 안오네요.
⭐️생각해보기⭐️
1. intent에 putSerializableExtra 메소드를 사용하여 전달할 수 있습니다.
2. 앱 내에 파일을 저장하고 그 파일 경로를 String으로 전달하면 어떨지..? 생각이 듭니다
3번쨰 영상에 대한 질문입니다.
마지막 running 하는 과정에서
정재곤 선생님 어플에서는 전달받은 이름 리스트 개수 :2 뜨고서
전달받은 SimpleData : Hello 라고 뜨는데
저는
전달받은 SimpleData : hello 라고만 뜹니다.(즉 만들어둔 Toast인 "전달받은 이름 리스트 개수 :2" 가 안뜹니다.)
똑같이 따라했는데 왜 다른 걸까요?
그전까지의 실행과정은 모두 동일했습니다.
Activity간의 데이터 전송은 intent로 하면 혹시 Activity 안에서 자바 코드간의 데이터전송은 어떻게 하나요?
startActivityForResult를 사용하면요.
requestCode를 입력하게 돼있자나요.
requestCode을 사용하는 이유가 엑티비티에서 인텐트를 보낼때 구분자로 이용하는걸로 알고 있습니다.
그래서 이걸 활용하면 서로다른 엑티비티에서 서로다른 인텐트를 전달 받았을때 활용하면 좋을 것 같다는 생각이 듭니다.
질문. 예를들어 MainActivity에서 MenuActivity로 인텐트를 보내면,
requestCode를 MainActivity에서 입력하게 돼있자나요.
그러면 MenuActivity에서 받은 requestCode를 MenuActivity에서 호출하려고 하는데
가능한가요?
생각ㅎ보기
1. 강의에서 배운대로 Parcel을 implement한 class 객체로 ArrayList를 형변환하여 전달하면 될 것 같습니다.
2. 시도해보지 않아서 가능한지 불가능한지 잘 모르겠지만, 불가능하다면 아무래도 서버로 전달하거나 클라이언트에 저장한 후 다시 액티비티에서 가져와야 하지 않을까요..?