Intent

J·2022년 9월 16일
1

Android_Study

목록 보기
5/5

📌 Intent

Android 애플리케이션 구성

4대 컴포넌트

    1. 액티비티(Activity)
    1. 서비스(Service)
    1. 브로드캐스트 리시버(Broadcast Receiver)
    1. 컨텐트 프로바이더(Content Provider)

컴포넌트간의 통신 역할을 해주는 것이 Intent(인텐트) 이다.

  • 4대 컴포넌트끼리 유기적으로 정보전달을 가능하게 해주는것이 인텐트.
  • 앱에서 무언가 작업을 수행하기 위해 사용하는 일종의 전달수단.
  • 각 컴포넌트들은 하나의 독립된 형태로 존재하며, 정해진 역할을 수행.
  • 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.

📌 명시적 인텐트

  • 가장 흔히 많이 볼 수 있는 방법

  • App의 화면을 전환하는 방법

  • 하나의 엑티비티에서 다른 엑티비티로의 화면 전환 시 사용

  • 인텐트는 엑티비티 호출시 데이터를 전달 또는 데이터를 리턴 받을 수 있습니다.

  • 명시적 인텐트는 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용.

  • 주로 애플리케이션 내부에서 사용.

  • 명시적 인텐트는 특정 컴포넌트나 엑티비티가 명확하게 실행되어야할 경우에 사용.

현재 엑티비티(A_Activity) 에서 다른 엑티비티(B_Activity)를 호출할 때 사용



📌 암시적 인텐트

  • 인텐트의 동작과 데이터를 지정 했지만, 호출할 대상이 달라질 수 있는 경우(선택할 수 있는 경우)에는 암시적 인텐트를 사용.
    - ex) 웹 브라우저를 실행 할 때 (Chrome, Safari, Edge) 중에서 어느것으로 실행 할 것 인가를 선택

  • 설치된 애플리케이션들에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 콤포넌트를 찾아본 후 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거친다.

  • 암시적 인텐트는 Intent의 Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다.

  • 이때 여러 개가 호출 될 수 있다.

  • 암시적 인텐트는 웹브라우저 호출, 이메일 전송, 전화 앱 등이 해당.



📍 Intent 코드 작성

1. 메인 화면 구성 (레이아웃)

activity_main.xml

  • INTENT 실행 버튼 -> 화면 전환 (activity_main.xml 에서 activity_main2.xml 로 넘어 간다.)
  • DATA 전달 버튼 -> MainActivity에서 데이터를 보내고, MainActivity2에서 데이터를 받는다.
  • WEB 버튼 -> 웹 브라우저 인텐트 호출
  • Spinner 버튼 -> 스피너(작성한 스피너 코드) 인텐트 호출
  • CALL 버튼 -> 전화걸기 인텐트 호출
  • EMAIL 버튼 -> 이메일 공유 인텐트 호출

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@color/yellow2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:orientation="vertical"
        android:gravity="center"
        >

        <Button
            android:id="@+id/btn1"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="Intent 실행" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="data 전달" />

        <Button
            android:id="@+id/btn3"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="web" />

        <Button
            android:id="@+id/btn4"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="spinner" />

        <Button
            android:id="@+id/btn5"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="call" />

        <Button
            android:id="@+id/btn6"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:text="email"
            />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>



2. 화면 전환 및 DATA 전달 화면 작성 (레이아웃)

activity_main2.xml

  • 화면 전환 시 나타날 화면 구현

  • MainActivity에서 데이터를 보내면 MainActivity2에서 데이터를 받아서 화면에 출력할 화면 구현

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:orientation="vertical"
        android:gravity="center">

        <TextView
            android:id="@+id/txtview1"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:background="@drawable/asdf0"
            android:text="Intent_test"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            />

        <TextView
            android:id="@+id/txtview2"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:background="@drawable/asdf0"
            android:hint="No Data"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>



3. Spinner 화면 작성 (레이아웃)

activity_main3.xml

  • spinner 화면 레이아웃

package com.example.intent_test;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity3_spinner_test extends AppCompatActivity {

    TextView textView;
    Spinner spinner;
    String[] items = {"AAAA", "SSSS", "DDDD", "QQQQ", "PPPP"};


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

        textView = findViewById(R.id.textview0);
        spinner = findViewById(R.id.spinner0);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_spinner_item, items);         //(MainActivity, simple_spinner_item 레이아웃, items 배열)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {      //(adapter, view 객체, view index값, id값)
                textView.setText(items[position]);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                textView.setText(" ");
            }
        });
    }
}



* 레이아웃에서 사용한 테두리, 배경 설정 레이아웃

  • [drawable] -> asdf0.xml 파일
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:radius="10dp"/>
    <stroke
        android:width="1dp"
        android:color="@color/black" /> <!-- 선 -->
</shape>



4. 인텐트 호출 코드 작성 (JAVA)

MainActivity.java

  • 인텐트 호출을 통한 화면 전환 및 데이터 주고 받기
  • INTENT 실행 버튼 -> 화면 전환 (activity_main.xml 에서 activity_main2.xml 로 넘어 간다.)
  • DATA 전달 버튼 -> MainActivity에서 데이터를 보내고, MainActivity2에서 데이터를 받는다.
  • WEB 버튼 -> 웹 브라우저 인텐트 호출
  • Spinner 버튼 -> 스피너(작성한 스피너 코드) 인텐트 호출
  • CALL 버튼 -> 전화걸기 인텐트 호출
  • EMAIL 버튼 -> 이메일 공유 인텐트 호출
package com.example.intent_test;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    Button button1, button2, button3, button4, button5, button6;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		
    	//화면 이동(화면 전환)
        button1 = findViewById(R.id.btn1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, MainActivity2.class);     //Intent test
                startActivity(intent);
            }
        });


        //Data Send (인텐트에 put 해주는 형식)
        button2 = findViewById(R.id.btn2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, MainActivity2.class);     //(현재화면, 이동 후 화면)
                //MainActivity -> MainActivity2     데이터 전달
                intent.putExtra("ID", "데이터 전달 완료!!");             //문자열 넣기 : putExtra()   //문자열 빼기 : getStringExtra()
                startActivity(intent);
            }
        });


        //WEB 이동
        button3 = findViewById(R.id.btn3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.kr/"));
                startActivity(intent);
            }
        });

		//Spinner 실행
        button4 = findViewById(R.id.btn4);
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, MainActivity3_spinner_test.class);    //(현재화면, spinner 화면) 이동
                startActivity(intent);
            }
        });

		//전화 앱으로 전화 걸기 실행
        button5 = findViewById(R.id.btn5);
        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:010-1234-5678"));     //ACTION VIEW : 데이터 보여줌
                startActivity(intent);
            }
        });

		//이메일 공유 기능 실행
        button6 = findViewById(R.id.btn6);
        button6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");   //텍스트 파일 기본값
                intent.putExtra(Intent.EXTRA_EMAIL, "aaaa11@naver.com");   //EXTRA_EMAIL , 이메일 주소
                intent.putExtra(Intent.EXTRA_SUBJECT, "email 제목");  //EXTRA_SUBJECT, 이메일 제목
                intent.putExtra(Intent.EXTRA_TEXT, "email 내용"); //EXTRA_TEXT, 이메일 내용
                startActivity(Intent.createChooser(intent, "AAAA"));
            }
        });
    }
}


/*
AndroidManifest.xml 추가
        <activity android:name=".MainActivity2"/>
        <activity android:name=".MainActivity3_spinner_test"/>
*/



5. DATA 전달 받고 출력 코드 작성 (JAVA)

MainActivity2.java

  • MainActivity에서 데이터를 보내면 MainActivity2에서 데이터를 받아서 화면에 출력하는 기능 구현
package com.example.intent_test;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity2 extends AppCompatActivity {

    TextView textView;
    String result;

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

        //Data Receive
        Intent intent = getIntent();
        result = intent.getStringExtra("ID");           //전달 할 data 받음     //문자열 넣기 : putExtra()   //문자열 빼기 : getStringExtra()
        textView = findViewById(R.id.txtview2);
        textView.setText(result);
        setResult(RESULT_OK, intent);   //응답 전달 후
    }
}


/*
AndroidManifest.xml 추가
        <activity android:name=".MainActivity2"/>
        <activity android:name=".MainActivity3_spinner_test"/>
*/



5. Spinner 동작 코드 작성 (JAVA)

MainActivity3_spinner_test.java

  • spinner 기능이 동작하도록 자바 코드 작성
package com.example.intent_test;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity3_spinner_test extends AppCompatActivity {

    TextView textView;
    Spinner spinner;
    String[] items = {"AAAA", "SSSS", "DDDD", "QQQQ", "PPPP"};


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

        textView = findViewById(R.id.textview0);
        spinner = findViewById(R.id.spinner0);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_spinner_item, items);         //(MainActivity, simple_spinner_item 레이아웃, items 배열)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {      //(adapter, view 객체, view index값, id값)
                textView.setText(items[position]);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                textView.setText(" ");
            }
        });
    }
}



📍 Intent 사용 시 AndroidManifest.xml에 Activity 태그 사용하여 사용하는 엑티비티가 명시 되어있어야 한다.

  • AndroidManifest.xml 추가

    • Activity 태그 사용하여

      activity android:name=".MainActivity2"
      activity android:name=".MainActivity3_spinner_test"

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.intent_test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity2"/>
        <activity android:name=".MainActivity3_spinner_test"/>
    </application>

</manifest>



📌 완성




작성한 전체 소스코드 github : Android_Study/intent_test/

profile
Hello World!

0개의 댓글