어플리케이션은 화면들의 모음집이다. 안드로이드의 역할은 사용자의 요구에 맞춰서 적절하게 전환해주는 것이다.
가령 A라는 화면이 있고 특정 버튼을 누르면 B 화면으로 넘어가도록 구현한다고 가정해보자.
버튼을 누르면 Intent 객체에 현재 화면과 넘어가고자 하는 화면이 매개변수로 전달될 것이다.
따라서 화면 전환에 필요한 것이 바로 Intent라고 생각하면 된다.
액티비티, 서비스, 방송 수신자
명시적 인텐트, 암시적 인텐트
패키지를 실행하면 기본적으로 MainActivity가 존재할 것이다. 두 화면 간의 전환을 보이기 위해 또 다른 Activity를 생성해보자.
Activity의 이름은 SubActivity로 설정하자.
우리가 구현할 것은 버튼을 누르면 화면 전환이 이루어지는 것이다. 따라서 버튼을 만들고 해당 버튼에 Intent 객체를 추가할 것이다.
activity_main.xml 코드는 다음과 같다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_move"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Move"
android:background="#FFFFFF">
</Button>
</LinearLayout>
이제는 자바 코드에서 기능을 구현할 차례이다.
Button 객체를 만들어 xml 에서 만든 버튼과 연결하도록 하자
btn_move = (Button)findViewById(R.id.btn_move);
다음은 버튼을 클릭했을 때의 이벤트를 정의하는 함수이다.
btn_move.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent); // 액티비티 이동
}
});
Intent 객체를 생성하고, 생성자의 매개 변수로 현재 컴포넌트와 이동할 컴포넌트를 넣는다.
이 때 현재 컴포넌트는 .this, 이동할 컴포넌트는 .class다.
다음은 startActivity(); 함수에 intent 객체를 넣어주는 것이다.
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btn_move;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_move = (Button)findViewById(R.id.btn_move);
btn_move.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent); // 액티비티 이동
}
});
}
}
MainActivity 코드
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText ed_test;
private Button btn_move;
private String str;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test = (EditText) findViewById(R.id.ed_test);
btn_move = (Button) findViewById(R.id.btn_move);
btn_move.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
str = ed_test.getText().toString();
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("str", str);
startActivity(intent); // 액티비티 이동
}
});
}
}
SubActivity 코드
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class SubActivity extends AppCompatActivity {
private TextView tv_test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent = getIntent();
String str = intent.getStringExtra("str");
tv_test = (TextView) findViewById(R.id.tv_test);
tv_test.setText(str);
}
}
만약 getText() 메소드를 onClick 메소드가 아닌 onCreate() 메소드 안에 정의하였다면, getText()의 호출은 onCreate()가 호출 될 때, 즉 안드로이드 앱이 실행될 때 호출되기 때문에 사용자가 값을 입력하기도 전에 공백으로 초기화 된다.
따라서 입력이 끝나고 버튼을 눌렀을 때 getText()가 실행 될 수 있도록 onClick() 메소드 내에 정의하는 것이 맞다.
getText()는 String 형이 아니기 때문에 String으로 값을 넘겨준다면 toString() 메소드를 이용해 형변환을 해줄 필요가 있다.
putExtra()와 getStringExtra() 는 key 값을 통해 데이터를 주고 받는다.