4. Activity와 Intent
Activity 라이프사이클
Activity는 안드로이드 애플리케이션의 기본 구성 요소 중 하나로, 화면을 구성하고 사용자와 상호작용하는 인터페이스를 제공합니다. Activity의 라이프사이클을 이해하는 것은 중요합니다. 안드로이드 시스템은 Activity의 상태 변화를 관리하고, 각 상태에 대해 특정 콜백 메서드를 호출합니다. 주요 라이프사이클 단계는 다음과 같습니다:
- onCreate(): Activity가 생성될 때 호출됩니다. 여기에서 초기화 작업(예: 레이아웃 설정, 데이터 바인딩)을 수행합니다.
- onStart(): Activity가 화면에 나타나기 시작할 때 호출됩니다.
- onResume(): Activity가 상호작용할 준비가 되었을 때 호출됩니다. Activity가 포그라운드에 있고 사용자와 상호작용할 수 있는 상태입니다.
- onPause(): 다른 Activity가 포그라운드로 나타날 때 호출됩니다. 사용자와 상호작용할 수 없는 상태지만, 여전히 보일 수 있습니다.
- onStop(): Activity가 더 이상 화면에 보이지 않을 때 호출됩니다.
- onDestroy(): Activity가 소멸될 때 호출됩니다.
- onRestart(): Activity가 중지되었다가 다시 시작될 때 호출됩니다.
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); // Activity가 화면에 나타나기 시작할 때 수행할 작업 } @Override protected void onResume() { super.onResume(); // Activity가 상호작용할 준비가 되었을 때 수행할 작업 } @Override protected void onPause() { super.onPause(); // 다른 Activity가 포그라운드로 나타날 때 수행할 작업 } @Override protected void onStop() { super.onStop(); // Activity가 더 이상 화면에 보이지 않을 때 수행할 작업 } @Override protected void onDestroy() { super.onDestroy(); // Activity가 소멸될 때 수행할 작업 } @Override protected void onRestart() { super.onRestart(); // Activity가 중지되었다가 다시 시작될 때 수행할 작업 } }
Intent와 Intent Filter
Intent는 안드로이드 컴포넌트 간의 런타임 바인딩을 가능하게 하는 메시징 객체입니다. 주로 Activity, Service, BroadcastReceiver를 시작하거나 데이터를 전달할 때 사용됩니다.
Intent
- 명시적 Intent: 특정 컴포넌트를 지정하여 실행합니다.
- 암시적 Intent: 수행할 작업을 지정하지만, 실행할 컴포넌트를 명시하지 않습니다. 시스템은 이 작업을 처리할 수 있는 적절한 컴포넌트를 찾습니다.
// 명시적 Intent 예제 Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); // 암시적 Intent 예제 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.example.com")); startActivity(intent);
Intent Filter
Intent Filter는 특정 Intent에 대해 애플리케이션의 컴포넌트를 등록하는 방법입니다. Intent Filter는 AndroidManifest.xml
파일에 정의됩니다.
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" android:host="www.example.com" /> </intent-filter> </activity>
Activity 간 데이터 전달
Activity 간에 데이터를 전달하기 위해 Intent를 사용할 수 있습니다. Intent는 putExtra()
메서드를 사용하여 데이터를 포함하고, 수신 Activity에서는 getIntent()
와 getExtras()
메서드를 사용하여 데이터를 가져옵니다.
// 데이터 전달 - 첫 번째 Activity Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("KEY_NAME", "Value"); startActivity(intent); // 데이터 수신 - 두 번째 Activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent = getIntent(); String value = intent.getStringExtra("KEY_NAME"); // 전달받은 데이터를 사용 }
Parcelable 및 Serializable
객체를 전달할 때는 Parcelable 또는 Serializable 인터페이스를 사용해야 합니다.
// Parcelable 예제 public class MyData implements Parcelable { private int id; private String name; protected MyData(Parcel in) { id = in.readInt(); name = in.readString(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } @Override public int describeContents() { return 0; } public static final Creator<MyData> CREATOR = new Creator<MyData>() { @Override public MyData createFromParcel(Parcel in) { return new MyData(in); } @Override public MyData[] newArray(int size) { return new MyData[size]; } }; } // 데이터 전달 - 첫 번째 Activity MyData data = new MyData(1, "Example"); Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("DATA_KEY", data); startActivity(intent); // 데이터 수신 - 두 번째 Activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent = getIntent(); MyData data = intent.getParcelableExtra("DATA_KEY"); // 전달받은 데이터를 사용 }
이로써 Activity와 Intent, 그리고 Activity 간의 데이터 전달 방법에 대해 설명을 마칩니다. 이러한 개념은 안드로이드 애플리케이션의 기본 구조와 흐름을 이해하는 데 필수적입니다.