[Android] 인텐트(Intent)
모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다.
인텐트(Intent)
앞에서 본 인텐트는 작업을 수행하기 위해 사용되는 명령 or 데이터를 전달하는 기능
→ 인텐트를 만든 후 startActivity()나 startActivityForResult() 메서드를 호출하면서 전달하는 방법으로 인텐트를 시스템에 전달
→ 시스템은 그 인텐트 안에 들어있는 명령을 확인하고 이미 만든 액티비티 or 단말에 설치되어 있는 다른 앱들의 액티비티를 띄운 것
인텐트의 역할
앱 구성 요소 간에 작업 수행을 위한 정보 전달
다른 앱 구성 요소에 인텐트를 전달할 수 있는 대표적인 메서드 4가지
- startActivity() or startActivityForResult() : 액티비티를 화면에 띄울 때
- startService() or bindService() : 서비스를 시작할 때
- broadcastIntent() : 인텐트 객체를 브로드캐스팅 방식으로 전송할 때
인텐트의 사용방식
- Intent()
- Intent(Intent o)
- Intent(String action [,Uri uri])
- Intent(Context packageContext, Class<?> cls>
- Intent(String action, Uri uri, Context packageContext, Class<?> cls)
클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 명확히 알 수 있는 경우는 '명시적 인텐트(Explicit Intent)'라고 하며, 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우에는 '암시적 인텐트(Implicit Intent)'라고 함. 암시적 인텐트는 MIME 타입에 따라 시스템에서 적절한 앱의 액티비티를 찾은 후 띄우는 방식을 사용하게 됨
[ 기본 구성 요소 ]
액션(Action), 데이터(Data)
- 액션(Action) : 수행할 기능
- 데이터(Data) : 액션이 수행될 대상의 데이터
인텐트 객체를 만들 때, ACTION_VIEW(액션)와 함께 웹페이지 주소(데이터)를 전달
→ 단말 안에 설치되어 있던 웹브라우저 화면이 뜨면서 해당 웹페이지를 보여줌
< 인텐트에 데이터를 넣는 방법 >
putExtra() 메서드 사용
intent.putExtra(키(key), 값(value)) → 키(key)와 값(value)를 쌍으로 넣어야 함
이 값을 확인할 때는 키(key)값으로 데이터 값을 가져와야 함
[ 타입(Type) ]
MIME type - 인텐트에 넣으려고 하는 데이터의 종류
인텐트에 포함되어 있는 데이터는 그 포맷이 어떤 것인가를 시스템이 확인한 후 적절한 액티비티를 자동으로 찾아 띄워주기도 함
ex) "https://"로 시작하는 문자열 - 웹페이지 주소를 나타내는 URL이라고 인식
* 보통은 데이터만으로도 구별이 가능하지만, 명시적으로 지정할 필요가 있는 경우도 있음
[ 범주(Category) ]
액션이 실행되는 데 필요한 추가적인 정보를 제공함
[ 컴포넌트(Component) ]
액티비티와 같은 독립적인 구성 요소
인텐트에 사용될 컴포넌트 클래스의 이름을 명시적으로 지정하고, 보통 이 정보는 인텐트의 다른 정보를 통해 결정되는 정보임.
이 속성이 지정될 경우, 지정된 컴포넌트가 실행되도록 함
새로운 액티비티를 정의하고 그 액티비티의 클래스 객체를 인텐트에 전달하여 실행하는 방법도 컴포넌트를 지정하는 방식과 같음
[ 부가 데이터(Extra Data) ]
인텐트는 추가적인 정보를 넣을 수 있도록 번들(Bundle) 객체를 담고 있음
→ 이 객체를 통해 인텐트 안에 더 많은 정보를 넣어 다른 앱 구성 요소에 전달 할 수 있음
public class PhoneActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phone);
editText = findViewById(R.id.editTextPhone);
Button button = findViewById(R.id.buttonPhone);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String data = editText.getText().toString();
data = "tel:"+data; // Mime 타입을 맞추기 위해 문자열 데이터 조작
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(data)); // 전화걸기 화면을 보여줄 인텐트 객체
startActivity(intent); // 액티비티 띄우기
}
});
}
}
이 예시에서 사용한 것 처럼 인텐트(Intent) 클래스에는 다양한 액션 정보가 있음
그 중에서도 ACTION_MAIN, ACTION_EDIT가 가장 많이 사용되는 액션 중 하나임