ANDROID/Android 앱 프로그래밍

[Android] 인텐트(Intent)

주 녕 2021. 5. 21. 19:35
728x90

모든 내용은 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가 가장 많이 사용되는 액션 중 하나임

728x90