android
11. 안드로이드 intent
코코넛딩
2023. 11. 23. 15:43
챗 지피티와 구글 번역기로 공부한 내용이라 틀린 내용이 있을 수 있습니다. 댓글 남겨주세요.
Intent 사용사례
- Intent는 메시징 객체로, 다른 앱 구성 요소로부터 작업을 요청하는 데 사용할 수 있다.
- 사용 사례
- 액티비티 시작
- startActivity()에 Intent를 전달한다.
- Intent는 시작할 액티비티를 설명하고 모든 필수 데이터를 담는다.
- 액티비티가 완료되었을 때 결과를 수신하려면 startActivityForResult()를 호출한다.
- 액티비티는 결과를 onActivityResult() 콜백에서 별도의 Intent 객체로 수신한다.
- 서비스 시작
- Service : 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성요소이다.
- 서비스를 시작하여 일회성 작업을 수행하도록하려면 Intent를 startService()에 전달하면 된다.
- Intent는 시작할 서비스를 설명하고 모든 필수 데이터를 담고 있다.
- 브로드 캐스트 전달
- 브로드 캐스트 : 모든 앱이 수신할 수 있는 메시지이다. 시스템은 시스템이 부팅될 때 또는 기기가 충전을 시작할 때 등 시스템 이벤트에 대한 다양한 브로드 캐스트를 전달한다.
- Intent를 sendBroadcast() 또는 sendOrderedBroadcast()에 전달하면 다른 앱에 브로드 캐스트를 전달할 수 있다.
- 액티비티 시작
인텐트 유형
- 인텐트의 두가지 유형
- 명시적 인텐트
- 인텐트를 충족하는 앱을 지정한다.
- 이를 위해 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성요소 클래스 이름을 제공한다.
- 일반적으로 앱안에서 구성요소를 시작할 때 쓴다.
- 새로운 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것등이 여기에 해당된다.
- 암시적 인텐트
- 특정 구성 요소의 이름을 대지 않는다.
- 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성요소가 이를 처리할 수 있도록 해준다.
- 명시적 인텐트

- 액티비티를 시작할 때 인텐트를 사용하는 법을 나타낸 그림이다.
- Intent 객체가 특정 액티비티 구성요소를 명시적으로 지정하면 시스템이 해당 구성 요소를 즉시 시작한다.
- 암시적 인텐트를 사용하면 시스템에서 시작할 적절한 구성요소를 찾습니다.
- 이때 인텐트의 내용을 기기에 있는 다른 여러 앱의 메니페스트 파일에서 선언된 인텐트 필터와 비교하는 방법을 사용합니다.
- 해당 인텐트와 일치하는 인텐트 필터가 있으면 시스템에서 해당 구성 요소를 시작하고 이를 Intent 객체를 전달한다.
- 호환되는 인텐트 필터가 여러개 인경우, 시스템에서 대화상자를 표시하여 사용자가 어느 앱을 사용할지 직접 선택할 수 있다.
인텐트 빌드
- Intent 객체에는 Android 시스템이 어느 구성 요소를 시작할지 판별하는 데 사용하는 정보가 담겨있다.
- 예를 들어 정확한 구성요소 이름 또는 인텐트를 수신해야하는 구성 요소 카테고리 등
- 또한 수신자 구성요소가 작업을 적절히 수행하기 위해 사용할 정보
- 예를 들어 수행할 작업 및 조치를 취할 데이터 위치 등
- Intent에 포함된 기본 사항
- 구성요소 이름
- 시작할 구성요소의 이름
- 선택항목이지만, 인텐트를 명시적으로 만들어주는 중요한 정보이다.
- Intent의 필드는 ComponentName 객체로 이것을 지정하려면 대상 구성 요소의 정규화된 이름(앱의 패키지까지 포함한 이름)을 사용해야 합니다.
- 구성요소 이름을 설정하려면 setComponent(), setClass(), setClassName() 또는 Intent 생성자를 사용한다.
- 작업
- 수행할 일반적인 작업을 나타내는 문자열이다.
- 이 작업은 대체로 나머지 인텐트의 구조를 결정한다. 특히 데이터와 엑스트라에 포함되는 정보가 결정된다.
- ACTION_VIEW
- 이 작업은 액티비티가 사용자에게 표시할 수 있는 어떤 정보를 가지고 있을 때 startActivity()가 있는 인텐트에서 사용한다.
- ACTION_SEND
- 공유 인텐트라고도 하며, 사용자가 다른 앱을 통해 공유할 수 있는 데이터를 가지고 있을 때 startActivity()가 있는 인텐트에서 사용합니다.
- 데이터
- 작업을 수행할 데이터는 해당 데이터의 MIME 유형을 참조하는 URI(Uri 객체) 입니다.
- MIME 타입
- 인터넷을 통한 파일 형식을 지정하는 표준 방식입니다.
- 파일의 종류를 정의하는 문자열
- MIME 타입이 지정되면 이를 처리할 수 있는 앱을 시스템이 자동으로 선택할 수 있습니다.
- 주로 HTTP 헤더, 이메일, Android 인텐트에서 사용됩니다.
- 예시
- image/jpeg
- audio/mp3
- text/plain : 일반 텍스트 파일
- MIME 타입
- URI는 특정 리소스를 가리키며, 해당 리소스를 처리할 수 있는 앱을 Android 시스템이 찾아 실행하게 됩니다.
- 제공된 데이터의 유형을 나타내는 것은 일반적으로 인텐트의 작업입니다.
- 예를 들어 인텐트가 ACTION_EDIT인 경우, 데이터에 편집할 문서의 URI가 들어있어야합니다.
- 인텐트를 생성할 때는 URI 외에 데이터 유형(데이터의 MIMIE 유형)을 지정하는 것이 중요한 경우가 많습니다.
- 예를 들어, 이미지를 표시할 수 있는 액티비티라면 오디오 파일은 재생하지 못할 것입니다.(URI 형식은 비슷할지라도)
- 데이터의 MIME 유형을 지정하면 Android 시스템이 인텐트를 수신하기 가장 좋은 구성요소를 찾는데 도움이 됩니다.
- 때로는 MIME 유형을 URI를 통해 추론할 수 있습니다. 특히 데이터가 content: URI일 때 추론하기 쉽습니다.
- content: URI는 데이터가 기기에 위치하고 ContentProvider가 제어한다는 것을 의미하며, 따라서 데이터 MIME 유형이 시스템에 표시 됩니다.
- 데이터 URI만 설정하려면 setData()를 호출하고 MIME 유형만 설정하려면 setType()을 호출하세요.
- 두가지 한번에 설정은 setDataAndType()을 사용하세요.
- 작업을 수행할 데이터는 해당 데이터의 MIME 유형을 참조하는 URI(Uri 객체) 입니다.
- 카테고리
- 인텐트를 처리해야 하는 구성 요소의 종류에 관한 추가 정보를 담은 문자열입니다.
- 카테고리는 없어도 된다.
- addCategory()
- 앱 구성 요소로 확인되는 방법에 영향을 미치지 않는 추가 정보도 담고 있을 수 있다.
- 엑스트라
- 요청한 작업을 수행하는 데 필요한 추가 정보가 담긴 키-값 쌍입니다.
- 몇몇 작업이 특정한 종류의 데이터 URI를 사용하는 것과 마찬가지로, 몇몇 작업은 특정한 엑스트라도 사용합니다.
- putExtra()로 엑스트라 데이터를 추가할 수 있다. 키 이름과 값, 이렇게 두가지 매개변수를 취한다.
- 값에 엑스트라 데이터를 포함한 Bundle 객체를 만든다음 값에 넣을 수도 있다.
- 엑스트라 키를 선언해야하는 경우(본인의 앱이 수신할 인텐트에 대하여), 앱의 패키지 이름을 접두어로 포함해야된다.
- const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
- 플래그
- Intent 클래스에서 정의되고, 인텐트에 대한 메타데이터와 같은 기능을 한다.
- 플래그는 시스템에 액티비티를 시작할 방법에 대한 지침을 줄수도 있고( 예를 들어 액티비티가 어느 작업에 소속되어야하는지 등) 액티비티를 시작한 다음에 어떻게 처리해야 하는지도 알려줄수 있다.( 예를 들어 액티비티가 최근 액티비티 목록에 소속되는지 여부)
- setFlag()
- 엑스트라
- 구성요소 이름
암시적 인텐트 수신
- 인텐트 필터
- 앱이 수신할 수 있는 암시적 인텐트가 어느 것인지 알리려면, <intent-filter> 요소를 사용하여 각 앱 구성 요소에 대해 하나 이상의 인텐트 필터를 메니페스트 파일에 선언한다.
- 각 인텐트 필터는 인텐트의 작업, 데이터 및 카테고리를 기반으로 어느 유형의 인텐트를 수락하는지 지정합니다.
- 시스템은 인텐트가 인텐트 필터 중 하나를 통과한 경우에만 암시적 인텐트를 앱 구성요소에 전달합니다.
- 다음 세가지 요소 중 하나 이상을 사용하여 허용할 인텐트 유형을 지정할 수 있습니다.
- <action>,<data>,<category>의 인스턴스를 두 개이상 포함하는 필터를 생성할 수 있다. 이렇게 하면 구성요소가 그러한 필터 요소의 모든 조합을 처리할 수 있는지 확인해야한다.
- <action>
- 액티비티, 서비스, 리시버가 반응할 수 있는 인텐트의 종류를 정의한다.
- name 속성은 인텐트의 액션을 식별하는 리터럴 문자열 값을 가진다.
- 예를 들어, android.intent.action.VIEW는 사용자에게 데이터를 표시할 때 사용되는 표준 액션입니다.
- 이 값은 액션을 나타내는 문자열이며, 자바 클래스 상수를 참조하는 것이 아닙니다.
- <data>
- 이 태그는 인텐트에 포함될 수 있는 데이터의 유형을 정의합니다.
- 데이터의 URI 구성요소(예:scheme, host, port, path)와 MIME(다목적 인터넷 메일 확장)유형을 정의합니다.
- 예를 들어, data 태그는 인텐트가 처리할 수 있는 특정 웹URL 또는 데이터 유형(예: 이미지, 비디오)을 지정할 수 있습니다.
- <category>
- 이 태그는 인텐트의 카테고리를 정의한다.
- name 속성은 인텐트가 속할 수 있는 카테고리의 리터럴 문자열 값을 가진다.
- <action>
PendingIntent
- PendingIntent 객체는 Intent 객체 주변을 감싸는 래퍼입니다.
- Intent와 다르게 동작한다. Intent는 즉시 실행되는 반면, PendingIntent는 나중에 실행될 수 있도록 미뤄두는 역할을 합니다.
- PendingIntent의 기본 목적
- 권한 위임
- PendingIntent는 다른 애플리케이션에게 당신의 애플리케이션을 대신하여 특정 Intent를 실행할 수 있는 권한을 부여한다.
- 즉, 다른 앱이나 안드로이드 시스템이 PendingIntent 안에 있는 Intent를 마치 자신의 앱 내에서 실행하는 것 처럼 할 수 있게 합니다.
- 나중에 실행
- PendingIntent는 지정된 시간에 또는 특정 상황에서 Intent를 실행하기 위해 사용됩니다.
- 예를 들어, 알림을 클릭했을 때 또는 특정 시간에 어떤 작업을 실행하도록 예약할 수 있다.
- 권한 위임
인텐트 확인
- 작업 테스트
- 허용된 인텐트 작업을 나타내기 위해 인텐트 필터는 0개 이상의 <action> 요소를 선언할 수 있습니다.
- 이 필터를 통과하려면 Intent에 지정된 작업이 필터에 나열된 작업 중 하나와 일치해야만 한다.
- 필터에 나열된 작업이 없는 경우, 인텐트가 일치될 대상이 아무것도 없으므로 모든 인텐트가 테스트에 실패합니다.
- 그러나 Intent가 작업을 지정하지 않는 경우 필터에 작업이 들어있지 않다면 인텐트가 테스트를 통과하게 됩니다.
- 카테고리 테스트
- 허용된 카테고리를 나타내기 위해 인텐트 필터는 0개 이상의 <category> 요소를 선언할 수 있다.
- 인텐트가 카테고리 테스트를 통과하려면 Intent 내의 모든 카테고리가 필터 내의 카테고리에 일치해야한다.
- 인텐트 필터가 Intent에서 지정된 것보다 더 많은 카테고리를 선언할 수 있지만, 그래도 Intent는 통과한다.
- 그러므로 카테고리가 없는 인텐트라면 필터에 어떤 카테고리가 선언되어 있든 이 테스트를 항상 통과하는 것이 옳다.
- 데이터 테스트
- 허용된 인텐트 데이터를 나타내기 위해 인텐트 필터는 0개 이상의 <data> 요소를 선언할 수 있습니다.
- 각 <data> 요소는 URI 구조와 데이터 유형(MIME 미디어 유형)을 나타낼 수 있습니다.
- URI의 각 부분은 별도의 특성(scheme, host, port, path)로 구성됩니다.
- <scheme>://<host>:<port>/<path>
- 이 URI 구성표는 서로 선형 종속성이 있습니다.
- scheme(구성표)가 지정되지 않으면 호스트가 무시됩니다.
- 호스트가 지정되지 않으면 포트가 무시됩니다.
- 구성표와 호스트가 둘다 지정도지 않으면 경로는 무시됩니다.
- 인텐트 안의 URI가 필터 안의 URI 사양에 비교되는 경우, 이것은 필터 내에 포함된 URI의 몇몇 부분에만 비교되는 것입니다.
- 필터가 구성표만 지정하는 경우, 해당 구성표가 있는 모든 URI가 필터와 일치합니다.
- 필터가 구성표와 권한은 지정하지만 경로는 지정하지 않는 경우, 같은 구성표와 권한이 있는 모든 URI가 경로와 관계없이 필터를 통화합니다.
- 필터가 구성표, 권한과 경로를 지정하는 경우 같은 구성표, 권한과 경로가 있는 URI만 해당 필터를 통과합니다.
- 경로 사양에는 경로 이름이 부분적으로만 일치하도록 요구하기 위해 와일드카드 별표(*)가 들어 있을 수 있습니다.
- 데이터 테스트는 인텐트 안의 URI와 MIME 유형 둘 모두를 필터 안에서 지정된 MIME 유형과 비교합니다. 다음은 규칙이다.
- URI도 MIME 유형도 들어있지 않은 인텐트는 필터가 URI나 MIME 유형을 전혀 지정하지 않은 경우에만 테스트를 통과합니다.
- URI는 들어있지만 MIME 유형은 없는 인텐트(URI로부터는 명시적이지도 않고 추론할 수도 없음)는 그 URI가 필터의 URI 형식과 일치하고, 필터가 인텐트와 마찬가지로 MIME 유형ㅇ르 지정하지 않는 경우에만 테스트를 통과합니다.
- MIME 유형은 들어있지만 URI는 없는 인텐트는 해당 필터가 같은 MIME 유형을 나열하지만 URI형식은 지정하지 않은 경우 에만 테스트를 통과한다.
- URI와 MIME 유형이 둘다 들어있는 인텐트(URI로부터는 명시적이지도 않고 추론할 수도 없음)는 해당 유형이 필터 내에 나열된 유형과 일치하는 경우에만 MIME 유형 부분의 테스트를 통과합니다. 이 인텐트는 URI가 필터내의 URI와 일치하는 경우나, scheme(content:) 또는 file: URI가 있고 필터가 URI를 지정하지 않은 경우에 URI 부분의 테스트를 통과합니다. 달리 말하면, 필터가 MIME 유형만 나열하는 경우, 구성요소가 content: 및 file: 데이터를 지원하는 것으로 간주됩니다.
- 인텐트가 URI 또는 MIME 유형을 지정하는 경우, <intent-filter>에 <data> 요소가 없으면 데이터 테스트를 통과하지 못합니다.
- 구성 요소가 파일 또는 컨텐츠 제공자로 부터 로컬 데이터를 가져올 수 잇다는 기대를 반영한 것 따라서 이런 필터는 데이터 유형만 나열할 수 있고 content: 및 file: 구성표를 명시적으로 지명하지 않아도 된다.
- 다음 예시는 <data> 요소가 구성 요소가 콘텐츠 제공자에서 이미지 데이터를 가져와 표시할 수 있다고 Anroid에 알리는 일반적인 사례이다.
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>