4대 컴포넌트
컴포넌트간의 통신 역할을 해주는 것이 Intent(인텐트) 이다.
가장 흔히 많이 볼 수 있는 방법
App의 화면을 전환하는 방법
하나의 엑티비티에서 다른 엑티비티로의 화면 전환 시 사용
인텐트는 엑티비티 호출시 데이터를 전달 또는 데이터를 리턴 받을 수 있습니다.
명시적 인텐트는 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용.
주로 애플리케이션 내부에서 사용.
명시적 인텐트는 특정 컴포넌트나 엑티비티가 명확하게 실행되어야할 경우에 사용.
현재 엑티비티(A_Activity) 에서 다른 엑티비티(B_Activity)를 호출할 때 사용
인텐트의 동작과 데이터를 지정 했지만, 호출할 대상이 달라질 수 있는 경우(선택할 수 있는 경우)에는 암시적 인텐트를 사용.
- ex) 웹 브라우저를 실행 할 때 (Chrome, Safari, Edge) 중에서 어느것으로 실행 할 것 인가를 선택
설치된 애플리케이션들에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 콤포넌트를 찾아본 후 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거친다.
암시적 인텐트는 Intent의 Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다.
이때 여러 개가 호출 될 수 있다.
암시적 인텐트는 웹브라우저 호출, 이메일 전송, 전화 앱 등이 해당.
activity_main.xml
<?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>
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>
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(" ");
}
});
}
}
<?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>
MainActivity.java
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"/>
*/
MainActivity2.java
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"/>
*/
MainActivity3_spinner_test.java
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(" ");
}
});
}
}
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>