안드로이드 액티비티의 라이프 사이클과 액티비티간 데이터 전달 예
안드로이드에서 2개의 액티비티를 사용하는 애플리케이션을 작성하고 액티비티간에 Intent 를 통한 데이터 전달을 테스트하고 액티비티의 라이프 사이클을 확인하기 위해 테스트용 애플리케이션을 작성해보려고 한다
안드로이드 디바이스는 화면도 작고 메모리도 일반 컴퓨터 처럼 넉넉한 것은 아니기 때문에 동시에 2개 이상의 액티비티를 실행할 수 없도록 되어 있다.
메인 액티비티가 실행되는 중에 다른 서브 액티비티를 호출하여 실행하는 경우에도 마찬가지로 메인 액티비티와 서브 액티비티가 동시에 실행될 수는 없으므로 서브 액티비티가 호출되어 실행될 때는 메인 액티비티가 정지되고 서브 액티비티가 실행되는데, 서브 액티비티를 종료하면 메인 액티비티가 다시 활성화되어 실행되는 구조로 되어 있다.
다음 그림은 안드로이드 레퍼런스 사이트에 있는 액티비티 라이프 사이클 순서도이다
https://developer.android.com/reference/android/app/Activity.html
위의 그림이 나타내는 라이프 사이클을 더 분명히 이해하기 위해 Android Studio 에서 다음과 같은 2개의 액티비티를 작성하고 메인 액티비티에서 서브 액티비티를 실행하고 서브 액티비티에서 버튼을 눌러 서브 액티비티를 종료하면 다시 메인 액티비티가 활성화되어 실행될 때 거치는 라이프 사이클 메소드의 실행 순서를 확인해보려고 한다
실행결과
메인 액티비티 실행시
Main.onCreate()Main.onStart()
Main.onResume()
메인 액티비티에서 서브 액티비티 실행시
(메인 액티비티 비활성화, 서브 액티비티 활성화)
Main.onPause()
Sub.onCreate()
Sub.onStart()
Sub.onResume()
Main.onStop()
서브 액티비티 종료시
(서브 액티비티 종료, 메인 액티비티 활성화)
Sub.onPause()
Main.onRestart()
Main.onStart()
Main.onResume()
Sub.onStop()
Sub.onDestroy()
AndroidManifest.xml (2개의 액티비티를 등록한다)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.duniv007.helloapp"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".LifecycleMainActivity" 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=".LifecycleSubActivity"></activity> </application> </manifest>
LifecycleMainActivity.java
package com.example.duniv007.helloapp; import android.content.Intent; import android.content.res.Resources; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; public class LifecycleMainActivity extends AppCompatActivity { TextView textView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("Lifecycle", "Main.onCreate()"); setContentView(R.layout.activity_lifecycle_main); textView2 = (TextView) findViewById(R.id.textView2); } // 메인 액티비티에서 버튼을 눌러 서브 액티비티를 실행한다 public void onClick(View view){ Intent intent = new Intent(getApplicationContext(), LifecycleSubActivity.class); intent.putExtra("num", 100); intent.putExtra("name", "홍길동"); startActivityForResult(intent, 1); } // 서브 액티비티로부터 전달된 인텐트가 도착하면 실행되는 메소드 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==RESULT_OK) { String msg = data.getStringExtra("msg"); textView2.setText("RequestCode:"+requestCode+" msg:" + msg); } } @Override protected void onStart() { super.onStart(); Log.d("Lifecycle", "Main.onStart()"); } @Override protected void onResume() { super.onResume(); Log.d("Lifecycle", "Main.onResume()"); } @Override protected void onPause() { super.onPause(); Log.d("Lifecycle", "Main.onPause()"); } @Override protected void onStop() { super.onStop(); Log.d("Lifecycle", "Main.onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Lifecycle", "Main.onDestroy()"); } @Override protected void onRestart() { super.onRestart(); Log.d("Lifecycle", "Main.onRestart()"); } }
LifecycleSubActivity.java ( 위의 메인 액티비티에서 호출할 서브 액티비티)
package com.example.duniv007.helloapp; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; public class LifecycleSubActivity extends AppCompatActivity { TextView textView3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("Lifecycle", "Sub.onCreate()"); setContentView(R.layout.activity_lifecycle_sub); textView3 = (TextView) findViewById(R.id.textView3); // 메인 액티비티에서 전달한 Intent를 수신한다 Intent intent = getIntent(); int num = intent.getIntExtra("num", 0); String name = intent.getStringExtra("name"); textView3.setText("num:"+num+" name:"+name); } public void onClick(View view){ // 메인 액티비티로 전달할 인텐트를 설정하고 현재 액티비티를 종료한다(메모리에서 제거) Intent intent = new Intent(getApplicationContext(), LifecycleMainActivity.class); intent.putExtra("msg", "메시지 잘 받았어요"); setResult(RESULT_OK, intent); // result code finish(); } @Override protected void onStart() { super.onStart(); Log.d("Lifecycle", "Sub.onStart()"); } @Override protected void onResume() { super.onResume(); Log.d("Lifecycle", "Sub.onResume()"); } @Override protected void onPause() { super.onPause(); Log.d("Lifecycle", "Sub.onPause()"); } @Override protected void onStop() { super.onStop(); Log.d("Lifecycle", "Sub.onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Lifecycle", "Sub.onDestroy()"); } @Override protected void onRestart() { super.onRestart(); Log.d("Lifecycle", "Sub.onRestart()"); } }