Intent (2) - Explicit(명시적) intent
Explicit(명시적) intent?
활성화할 패키지명과 component 명을 정확히(명시적) 지칭하여 component 를 활성화.
일반적으로 본인의 앱 안에서 구성 요소를 시작할 때 쓰임.
(시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문)
예를 들어, 사용자 작업에 응답하여 새 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등이 여기에 해당.
Explicit intent 로 외부 패키지 활성화
아래와 같이 서로 다른 패키지의 activity 를 활성화 할 때 쓰임.
- com.parkho.intent1 패키지에서 com.parkho.intent2 의 TestActivity 를 실행
만약, 해당 option 이 없었다면 아무 패키지의 activity, service 를 임의로 실행시킬 수 있기 때문에 보안상 매우 취약하게 된다. (은행 관련 패키지 component 를 마음대로 실행할 수 있다고 생각해 보자!)
- "android:exported" option 을 true 로 하지 않고 호출하면 SecurityException 이 발생한다.
Explicit intent 전달
◼ Intent extra
Bundle 을 이용하여 intent 객체에 data 를 첨부할 수 있다.
첨부할 수 있는 data type 은 매우 다양하며 HashMap 을 이용한다.
보낼때 | 받을때 | Data type |
intent.putExtra("bool_data", true); | intent.getBooleanExtra("bool_data", false); | boolean |
intent.putExtra("int_data", 7); | intent.getIntExtra("int_data", 0); | integer |
intent.putExtra("string_data", "parkho"); | intent.getStringExtra("string_data"); | String |
◼ Intent data
Intent extra 가 data 자체를 전달한다면 intent data 는 URI 를 이용하여 데이터가 존재하는 위치 정보를 전달한다.
- URI (Uniform Resource Identifiers) : 자원을 나타내는 유일한 주소.
데이터 전달 시 용량이 클 경우(1M 가 넘는 데이터) intent extra 를 이용하는 것 보다 intent data 를 이용하는게 효율적이다.
◼ Intent data type
Intent data 전달 시 URI 의 data type(MIME type) 을 명시.
Data type 을 명시하여 intent 를 수신측에서 필요에따라 해당 type 에 맞는 루틴을 처리할 수 있도록 도와준다.
일반적으로 intent data 와 같이 사용하지만 type 만 명시할 수 있다.
Code
1. FirstActivity
2. SecondActivity
3 Manifest
위 예제는 하단 link 에서 확인할 수 있다.
https://github.com/parkho79/IntentSample