안드로이드는 일반적으로 하나의 화면을 하나의 액티비티라고 생각할 수 있습니다.
앱을 구성하는 각 화면은 액티비티로 구현되며 이러한 액티비티끼리 전환하는 과정은 각각의 액티비티를 필요에 따라 띄우거나 닫는 과정과 같습니다.
따라서 액티비티에 대해 확실히 이해하는 것은 좋은 앱을 만드는 기초가 됩니다.
Intent 객체명 = new Intent(현재 액티비티명, 이동할 액티비티명);
putExtra("key값", "value값")
메서드를 이용하여 값을 저장하여 보낼 수 있으며,
전달을 받는 액티비티에서 Intent 객체명 = getIntent()
를 통해 전달 받은 메서드를 받을 수 있습니다.
< 값이 String일 때 >
객체명.getExtras().getString("key")
매개변수에 키값을 넣어 전달 받은 값을 받을 수 있습니다.
startActivity()
메서드에 인텐트 객체를 매개변수로 넣어 화면 전환을 할 수 있습니다.
액티비티가 전환되면서 현 액티비티에서 다른 액티비티로 값을 전달 받아 처리할 상황이 생기는데
이때 어떤 액티비티에서 온 값인지 확인하기 위해 아래와 같은 메서드를 사용한다.
2020년 5월 이전에는 를 이용하여 액티비티를 전환하며 결과를 받아왔지만 지금은 deprecated되었다.startActivityForResult
startActivityForResult(Intent intent, int requestCode)
그 이유는 사용에 있어서 오류와 불편함이 발생해서인데 이유는 차차 알아보도록하자.
새로운 API가 도입되면서 registerForActivityResult()
메서드를 사용한다.
사용방법은 아래와 같다.
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), PartActivity.class);
startActivity.launch(intent);
}
});
ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
}
});
ActivityResultLauncher
의 객체를 만들고, 그 객체를 원하는 곳에 launch(Intent intent)
를 호출하면 된다.
xml파일을 하나 만들고 매니페스트에 접근해준다.
내가 만든 액티비티가 추가되어 있는데 여기에 android:label="대화상자의 띄울 내용"
값이랑 android:theme="@style/Theme.AppCompat.Dialog
코드를 추가해준다.
theme를 통해 해당 액티비티가 대화상자로 사용할 수 있게끔 해준다.
<activity android:name=".PartActivity" android:label="메뉴 액티비티" android:theme="@style/Theme.AppCompat.Dialog" android:exported="false" /> <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>
<?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/btnPopUp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="15dp" android:text="메뉴화면 띄우기" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout>
<?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" android:layout_margin="10dp" tools:context=".PartActivity"> <Button android:id="@+id/btnBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="돌아가기" android:textStyle="bold" /> </LinearLayout>
package com.study.doit; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final int REQUEST_CODE_MENU = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnPopUp = findViewById(R.id.btnPopUp); btnPopUp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), PartActivity.class); startActivity.launch(intent); } }); } ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if(result.getResultCode() == Activity.RESULT_OK) { Toast.makeText(getApplicationContext(), "합격" , Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "탈락", Toast.LENGTH_SHORT).show(); } } }); }
package com.study.doit; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.LinearLayout; public class PartActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_part); Button btnBack = findViewById(R.id.btnBack); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("name", "Ma"); setResult(RESULT_OK, intent); finish(); } }); } }
서브 액티비티가 종료되면 메인 액티비티에 onActivityResult
setResult()
를 사용해서 resultCode
를 보내 액티비티에서 어떠한 응답을 보냈는지 판별할 수 있습니다.
RESULT_OK
를 통해 정상처리 됨을 알립니다.
응답을 받은 액티비티에서는 아래와 같은 코드로 응답에 따라 원하는 동작을 구현할 수 있습니다.
ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(resultCode != RESULT_OK) {
return;
}
switch(requestCode) {
case TEST_RESULT:
// 동작 구현
case TEST2_RESULT:
// 동작 구현
}
}
액티비티가 불러와지면 스택 구조로 액티비티가 쌓이고,
백키를 누르면 상위 스택이 삭제되고 그 아래에 있는 액티비티가 화면에 보여지게되는데 이때 스택에 쌓지않고 화면을 끝내기 위해 finish()
코드를 이용한다.