4장 인텐트

모래사우르스
|2024. 12. 3. 16:13

<인텐트>

인텐트는 앱 구성 요소 간에 작업 수행을 위한 정보를 전달하는 역할을 한다.

인텐트의 기본 구성 요소는 액션(Action)과 데이터(Data)이다.

액션과 데이터를 사용하는 대표적인 예

ACTION_DIAL : 주어진 전화번호를 이용해 전화걸기 화면을 보여줌

ACTION_VIEW : URL 유형에 따라 VIEW 액션이 다른 기능을 수행함. (전화걸기 화면 등)

ACTION_EDIT ~~/x : 전화번호부 DB 정보 중 ID가 x인 정보를 편집하기 위한 화면을 보여줌

ACTION_VIEW : 전화번호부 DB의 내용을 보여줌

 

인텐트 클래스에 정의된 액션은 많이 있는데, 그 중 ACTION_MAIN이랑 ACTION_EDIT을 가장 많이 사용한다고 함.

 

인텐트에 포함된 데이터의 포맷에 따라 적절한 액티비티를 자동으로 띄워주기도 한다.

ex) http처럼 특정 포맷을 사용하면 그 포맷은 등록된 MIME 타입으로 구분한다. (http로 시작 -> 웹페이지 주소로 인식)

 

인텐트 객체는 액션과 데이터뿐만 아니라 다른 인텐트나 클래스 객체를 인수로 하여 만들기도 한다.

 

  • 명시적 인텐트(Explicit Intent) : 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우
  • 암시적 인텐트(Implicit Intent) : 호출할 대상이 달라질 수 있는 경우 (MIME 타입에 따라 적절한 액티비티 찾아서 띄움)

<암시적 인텐트의 속성>

- 액션(Action)

- 데이터(Data)

- 범주(Category) : 액션이 실행되는 데 필요한 추가적인 정보 제공. ex) CATEGORY_LAUNCHER : 런처 화면에 이 앱을 보여줘야한다는 것을 의미.

- 타입(Type) : 데이터의 MIME 타입을 명시적으로 지정.

- 컴포넌트(Component) : 컴포넌트 클래스 이름을 명시적으로 지정.

- 부가 데이터(Extra Data) : 번들(Bundle) 객체를 통해 인텐트 안에 더 많은 정보를 넣어 다른 앱 구성 요소에 전달할 수 있음.

 

<인텐트에 액션과 데이터를 넣어 다른 앱의 액티비티 띄우기>

1. activity_main.xml 레이아웃을 적당히 만들어준다.

 

2. MainActivity 코드를 작성한다.

<MainActivity.java>

package com.example.chapter4_3;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editTextText);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String data = "tel:"+editText.getText().toString();

                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
                startActivity(intent);
            }
        });
    }
}

 

onClick 안의 코드를 보면

String data = "tel:"+editText.getText().toString();

먼저 읽어들인 전화번호에 "tel:"을 붙여서 전화번호임을 인지할 수 있는 문자열로 만들어준다.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));

인텐트를 만들어준다. Uri.pasre에 위에 만들어낸 문자열을 집어넣고 ACTION_VIEW를 사용하여 전화걸기 화면이 뜰 수 있게 만들어준다.

startActivity(intent);

마지막으로 액티비티를 띄우는 코드.

 

<실행화면>

 

xxx-xxxx-xxxx의 형태로 입력하면 전화걸기 창으로 넘어간다.

 

<컴포넌트 이름을 이용해 새로운 액티비티 띄우기>

(실행화면 없음)

1. activity_main.xml에 버튼을 추가한다.

 

2. 새 액티비티를 만든다.(MenuActivity)

(기억 안나면 https://sand-to-desert.tistory.com/73 - 새로운 액티비티 추가하기 참고.)

 

3. MainActivity에 추가 코드 입력

<MainActivity.java>

package com.example.chapter4_3;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 생략

        Button button2 = findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                ComponentName name = new ComponentName("org.techtown.samplecallintent",
                        "org.techtown.samplecallintent.MenuActivity");
                intent.setComponent(name);
                startActivityForResult(intent,101);
            }
        });
    }
}

 

onClick 안의 코드를 보면

Intent intent = new Intent();
ComponentName name = new ComponentName("org.techtown.samplecallintent",
                          "org.techtown.samplecallintent.MenuActivity");

컴포넌트 이름에는 두개의 파라미터가 있다. 각각 패키지 이름클래스 이름이 된다.

intent.setComponent(name);
startActivityForResult(intent,101);

인텐트 객체에 컴포넌트를 지정해준 다음, startActivityForResult 메서드로 액티비티를 띄운다.

 

이 후 실행시킨 뒤 버튼을 누르면 빈 화면(activity_menu)이 나타날 줄 알았는데 아무런 반응도 일어나지 않았다. 책에서도 실행 후의 변화가 어떠한지 적혀있지 않다.. 예제가 좀 미흡한 것 같다.

 

아무튼 이렇게 다른 화면을 띄울 수 있다고 한다.