일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- rxjava disposable
- 자바 다형성
- ANR이란
- 안드로이드 라이선스
- 스택 자바 코드
- 안드로이드 os 구조
- 멤버변수
- 안드로이드 라이선스 종류
- 서비스 쓰레드 차이
- 2022 플러터 설치
- 스택 큐 차이
- ar vr 차이
- 객체
- jvm이란
- android ar 개발
- Rxjava Observable
- 안드로이드 유닛테스트란
- 플러터 설치 2022
- 서비스 vs 쓰레드
- 큐 자바 코드
- rxjava hot observable
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 레트로핏 crud
- android retrofit login
- jvm 작동 원리
- rxjava cold observable
- 클래스
- 안드로이드 레트로핏 사용법
- 안드로이드 유닛 테스트
- 안드로이드 유닛 테스트 예시
- Today
- Total
나만을 위한 블로그
[Manifest-Android] 2. 인텐트 본문
인텐트는 안드로이드 4대 컴포넌트에 속하는 액티비티, 서비스, 브로드캐스트 리시버가 서로 통신할 수 있게 하는 메시징 객체 역할을 수행하는 요소다.
그러나 컨텐츠 프로바이더는 ContentResolver를 통해 URI 기반으로 접근할 수 있지만 인텐트를 통해 접근할 수 있다는 내용도 본 적이 있어서 이게 정말인지 찾아봤다.
https://developer.android.com/guide/topics/providers/content-provider-creating?hl=ko#Intents
콘텐츠 제공자 만들기 | App data and files | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 콘텐츠 제공자 만들기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 콘텐츠 제공자는 중앙 저장소로
developer.android.com
앱은 인텐트를 써서 간접적으로 컨텐츠 프로바이더에 접근 가능하다. 앱이 ContnetResolver 또는 ContentProvider 대신 액티비티를 시작하는 인텐트를 전송한다. 이는 프로바이더 자체 앱의 일부인 경우가 많다. 대상 액티비티가 담당하는 UI에서 데이터를 검색하고 표시하는 것이다
인텐트의 작업에 따라 대상 액티비티가 유저에게 프로바이더의 데이터를 수정하라는 메시지를 표시할 수도 있다...(중략)...인텐트 접근을 써서 데이터 무결성을 지원할 수 있다...(중략)
그러나 컨텐츠 프로바이더는 데이터 공유, 관리를 위해 존재하는 컴포넌트고 DB 테이블과 유사한 하나 이상의 테이블로 표시되는 데이터 접근 인터페이스다. 어떤 데이터를 어떻게 다룰지를 고려하는 컴포넌트고 인텐트는 액티비티, 서비스, 브로드캐스트 리시버가 상호작용을 시작하는 데 사용되기 때문에 데이터를 쿼리하거나 삽입할 수는 없다. 그래서 인텐트의 통신 대상에 컨텐츠 프로바이더를 포함시키지 않는 게 아닌가 싶다.
인텐트는 컴포넌트 간에 데이터를 전달할 수 있어서 컴포넌트 기반 아키텍처의 기본 요소고 명시적 / 암시적 2가지 유형이 있다.
명시적 인텐트는 아래 특징을 갖는다.
- 직접 이름을 명시해서 부를 컴포넌트를 지정
- 대상 컴포넌트를 알고 있는 경우에 사용됨
- 같은 앱 안에서 한 액티비티로부터 다른 액티비티로 전환할 경우 등
암시적 인텐트는 아래 특징을 갖는다.
- 컴포넌트를 지정하지 않고 실행할 작업만 선언
- action, category, data 기반으로 인텐트를 처리할 수 있는 컴포넌트를 결정
- 다른 앱, 시스템 컴포넌트가 처리할 수 있는 작업(URL 열기, 컨텐츠 공유)을 수행하려는 경우 사용
명시적 인텐트는 액티비티 전환, 리시버 / 서비스 호출 등 내부 앱 탐색에 쓰이고 암시적 인텐트는 외부 앱 또는 다른 컴포넌트에서 처리할 수 있는 동작에 쓰인다. SNS 공유 버튼을 눌렀을 때 핸드폰에 카톡, 인스타, 페이스북 등 여러 SNS 앱이 깔려 있으면 바텀시트로 그 앱들이 나오는데 이것이 암시적 인텐트의 영향으로 발생하는 일이다.
인텐트 필터
컴포넌트가 링크 열기, 브로드캐스트 처리 등 특정 인텐트에 응답할 수 있는 방법을 정의하는 요소다.
액티비티, 서비스, 브로드캐스트 리시버가 처리할 수 있는 인텐트 타입을 선언하는 필터 역할을 하며 매니페스트에 선언한다.
인텐트 필터엔 받을 인텐트를 정확하게 일치시키기 위한 action, category, data 타입이 포함될 수 있다.
암시적 인텐트가 전송되면 안드로이드는 인텐트 속성을 설치된 앱의 매니페스트에 정의된 인텐트 필터와 비교해서 실행할 컴포넌트를 결정한다. 일치하는 항목이 있으면 시스템은 그 컴포넌트를 시작하고 인텐트 객체를 해당 컴포넌트에 전달한다.
여러 컴포넌트가 인텐트와 일치하면 안드로이드는 유저에게 앱 선택 팝업을 띄워서 선택하게 한다.
PendingIntent
다른 앱 또는 시스템 컴포넌트가 앱 대신 나중에 미리 정의된 인텐트를 실행할 권한을 주는 특수한 인텐트다.
일반 인텐트의 래퍼 역할을 해서 앱 생명주기 이후에도 지속될 수 있게 하기 때문에 알림, 서비스와의 상호작용처럼 앱 생명주기가 끝난 후 시작돼야 하는 작업에 쓰인다.
생성하려면 PendingIntent.getActivity / Service / Broadcast() 라는 팩토리 메서드를 사용한다.
보안 관련해선 악성 앱이 기본 인텐트를 수정할 수 없게 항상 FLAG_IMMUTABLE 플래그(PendingIntent는 불변이어야 한다고 나타냄)를 설정하는 게 중요하다. 안드로이드 12(api 31) 이상부터 적용해야 하는 사항이다.
해당 플래그와 관련된 미디엄 포스팅은 아래를 참고한다.
https://valsamaras.medium.com/pending-intents-a-pentesters-view-92f305960f03
Pending Intents: A Pentester’s view
Few days ago I came across an interesting case of vulnerability posted at the AndroidInfoSec’s facebook page. Since there are not many…
valsamaras.medium.com
'스터디' 카테고리의 다른 글
[Manifest-Android] 6. 매니페스트 (0) | 2025.06.21 |
---|---|
[Manifest-Android] 5. Application (0) | 2025.06.13 |
[Manifest-Android] 4. Context (0) | 2025.06.13 |
[Manifest-Android] 3. 직렬화 / 역직렬화 (0) | 2025.06.13 |
[Manifest-Android] 1. 안드로이드 프레임워크 (0) | 2025.06.07 |