안드로이드에서는 다른 액티비티를 화면에 띄우거나 기능을 동작시킬 때,
그리고 데이터를 전달할 때 인텐트를 사용했다.
시스템은 인텐트에 들어있는 명령을 확인하고 다른 액티비티, 혹은 다른 앱을 띄우는 것이다.
인텐트는 개발자가 만든 앱 구성 요소가 해야 할 일을 지정하는 역할을 한다.
인텐트는 android.content 패키지 안에 정의되어있다. 인텐트는 앱 구성 요소 간 작업 수행을 위한 정보를 전달한다.
다른 앱 구성 요소에 인텐트를 전달하는 메서드는 다음과 같다.
- startActivity() : 액티비티 시작
startActivityForResult()Deprecated -> ActivityResultLauncher 객체의 launch() + registerForActivityResult()- startService() : 서비스 시작
- bindService()
- broadcastIntent() : 인텐트 객체를 브로드캐스팅 방식으로 전송.
위 메서드들은 파라미터로 인텐트가 전달되고 전달된 파라미터는 앱 구성요소(액티비티, 서비스, 브로드캐스트 수신자)로 전달된다.
인텐트의 구성 요소는 액션과 데이터이다.
- 액션 : 수행할 기능, ACTION_VIEW, ACTION_EDIT 등이 있다. 만일 인텐트 객체의 ACTION_VIEW와 함께 웹 페이지 주소를 전달하면, 웹 브라우저가 해당 웹 페이지를 보여주게 된다.
- 데이터 : 수행될 대상의 데이터를 의미.
인텐트의 액션과 데이터를 이용한 예시 ACTION_DIAL tel:01012345678 - 전화걸기 ACTION_VIEW tel:01012345678 - 전화걸기. URI에 따라 다른 기능을 수행한다. ACTION_EDIT content://contacts/people/2 - 연락처 데이터베이스에 있는 정보 중 ID가 2인 정보를 편집한다. ACTION_VIEW content://contacts/people - 연락처 데이터베이스를 보여준다. |
인텐트의 데이터는 포맷이 어떤 것인가에 따라 시스템이 적절한 액티비티를 자동으로 띄워준다. 시스템이 MIME 타입으로 포맷을 구분한다.
인텐트의 생성자는 총 5가지가 있다. 인텐트 객체는 액션과 데이터를 인수로 해서 만들 수도 있고 다른 인텐트나 클래스 객체를 인수로 해서 만들수도 있다.
- Intent()
- Intent(Intent o)
- Intent(String action, Uri uri)
- Intent(Context packageContext, Class<?> class)
- Intent(String action, Uri uri, Context packageContext, Class class)
인텐트에 클래스 객체, 컴포넌트 이름을 지정해두면, 호출할 대상을 확실히 알 수 있으므로 명시적 인텐트(Explicit Intent)라고 한다. 액션과 데이터를 지정했지만 호출할 대상이 달라질 수 있는 경우는 암시적 인텐트(Implicit Intent)라고 한다. 암시적 인텐트가 바로 MIME타입에 따라 시스템이 적절한 앱의 액티비티를 띄우는 방식을 사용한다.
즉, 시스템이 인텐트를 이용해 요청된 정보를 처리할 수 있는 적절한 컴포넌트(액티비티같은 독립적은 구성 요소)를 찾아본 후 그 대상과 처리 결과를 사용자에게 보여주는 것이다.
암시적 인텐트는 액션, 데이터 이외에 여러 속성을 가진다.
- 범주(Category) : 액션이 실행될 때 필요한 추가적인 정보를 제공함. 예시로 CATEGORY_LAUNCHER는 최상위 앱인 런처에 이 앱을 보여주어야 하는 것을 의미한다.
- 타입(Type) : 인텐트의 데이터의 MIME타입을 명시적으로 지정하는 것. 보통은 데이터만으로도 구별이 가능하다.
- 컴포넌트(Component) : 인텐트에 사용될 컴포넌트 클래스 이름을 명시적으로 지정한다. 보통은 인텐트의 다른 정보들에 의해 결정된다. 이 속성이 지정될 경우, 지정된 컴포넌트가 실행되도록 한다. 인텐트에 액티비티 클래스 객체를 전달하여 실행하는 방법이 컴포넌트를 지정하는 것이다.
- 부가 데이터(Extra Data) : 인텐트에는 추가적인 정보를 담을 번들(Bundle) 객체를 담고 있는데, 이 객체를 통해 인텐트에 더 많은 정보를 넣어서 다른 앱 구성 요소에 전달할 수 있다.
인텐트를 이용하는 대표적인 두 가지 경우를 살펴보자. 첫번째는 인텐트에 액션과 데이터를 넣어 다른 앱의 액티비티를 띄우는 것과, 컴포넌트 이름을 이용해서 새로운 액티비티를 띄우는 경우를 확인해 보겠다.
인텐트에 액션과 데이터를 넣어 다른 앱의 액티비티를 띄우는 경우
우선 레이아웃 xml 파일에는 EditText와 Button을 하나씩 두었다.
그리고 데이터 바인딩을 이용해서 str이라는 문자열 변수를 두고,
EditText에서 입력한 값이 str에 업데이트 되도록 하였다.
- @{데이터바인딩 변수} : 해당 변수의 값을 사용하는 기능
- @={데이터바인딩 변수} : 해당 변수의 값을 업데이트 하는 기능
이라고 생각하면 된다. 입력모드는 전화번호 모드로 해 두었다.
버튼에는 onClick만 지정해 두었다.
바인딩 객체를 초기화 해주고
버튼 리스너 메서드만 적어두었다.
버튼을 눌렀을 때, 입력한 값을 받아온 후 str 문자열변수에 저장한다.
그리고 call이라는 변수로 내가 intent에 전달하는 데이터 값이 전화번호 MIME 타입이라는 것을 명시해준다.
후에 Intent 객체를 만들어서 ACTION_VIEW라는 액션과 Uri.parse() 메서드를 이용해서 데이터를 전달해주고
startActivity() 메서드로 인텐트를 실행시킨다.
비슷하게 개발할 때 쓸 수 있는 경우는 인스타그램 스토리 공유하기 기능이다.
공식 문서에서 제공하는 것이 Intent에 액션과 데이터로 공유할 사진의 uri를 넣어서 인스타그램
스토리에 띄우는 역할을 한다.
인텐트에 컴포넌트를 명시해서 액티비티를 띄우는 경우
인텐트에 컴포넌트를 명시하기 위해선 메인액티비티말고 다른 액티비티도 하나 필요하다.
MenuActivity라는 액티비티를 새로 생성하고, 인텐트로 실행시켜 보겠다.
launcher는 ActivityResultLauncher객체로 registerForActivityResult(Contract, Callback) 메서드를 이용해서 초기화 한 후 사용했다.
나머지는 크게 볼 게 없지만 메뉴 액티비티를 실행하는 코드가 신기하게 생겼다.
Intent를 하나 생성하고 ComponentName 객체를 하나 만들어준다.
ComponentName객체의 두 개의 파라미터는 첫 파라미터에는 패키지이름, 두번째 파라미터에는 클래스 이름을 넣는다.
그리고 이 intent를 실행한다.
데이터가 잘 넘어오는 것을 확인할 수 있다.
ComponentName객체의 유의사항은 첫번째 파라미터에만 패키지이름을 적는것이 아니라 두번째 파라미터에도 패키지이름을 적는다는 것이다.
Intent에서 액션은 ACTION_MAIN과 ACTION_EDIT이 많이 사용된다고 한다.
- ACTION_MAIN : 시작하는 액티비티를 지정한다.
- ACTION_EDIT : 데이터를 수정할 때 사용. 데이터의 uri값이 주어져야 한다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 태스크 관리 (0) | 2021.07.31 |
---|---|
[Android] 플래그와 부가 데이터 - feat. Parcelable과 양방향 데이터 바인딩 사용 (0) | 2021.07.31 |
[Android] 화면 여러개 만들어서 화면 전환하기 - onActivityResult, startActivityForResult Deprecated. registerForActivityResult 사용해보기 (0) | 2021.07.28 |
[Android] 레이아웃 인플레이션 (0) | 2021.07.28 |
[Android] Do It! 안드로이드 도전 04. SMS 입력 화면 만들고 글자의 수 표시하기 + 데이터 바인딩, 뷰 모델, 라이브 데이터로 풀어보기 (0) | 2021.07.27 |