Android(Java) - Activity - 멀티 액티비티 활용과 액티비티 라이프 싸이클의 이해

반응형

 

예제 파일 다운로드

  • 멀티 액티비티 테스트 앱은 깃허브에서 다운로드 하실 수 있습니다.

https://github.com/luvris2/Android-MultiActivityTest-App

 

GitHub - luvris2/Android-MultiActivityTest-App

Contribute to luvris2/Android-MultiActivityTest-App development by creating an account on GitHub.

github.com


액티비티 (Activity)

  • 안드로이드에서 액티비티는 앱의 화면을 뜻함
  • 기능을 담당하는 Java 파일과 UI를 담당하는 xml 파일이 존재
  • 하나의 Java파일에 하나의 xml파일이 연결되어 하나의 화면을 구성

액티비티간의 이동 소스 코드

  • 인텐트 객체를 파라미터와 함께 생성
    • 첫번째 매개변수는 현재 액티비티, this 사용
    • 두번째 매개변수는 다른 액티비티, class 사용
  • startActivity( 인텐트 객체 ) : 지정한 액티비티로 이동
    • 단, 이동 전의 액티비티는 소멸되지 않기 때문에(onDestroy) 리소스 관리에 신경써서 구성
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);

세 개의 액티비티를 이동하는 앱 만들기

+ 액티비티 라이프 사이클을 함께 로그로 표기하여 리소스 관리를 좀 더 쉽게 이해해봅시다.

 

기능 설계

1. 첫번째 액티비티

  • 버튼을 누르면 두번째 액티비티로 이동
  • onResume, onPause, onDestroy 상태 돌입시 로그 출력

2. 두번째 액티비티

  • 뒤로가기 (백) 버튼을 누르면 액티비티간 이동을 선택 (첫번째/세번째)
    • 기존의 뒤로가기 버튼의 기능을 재정의, 즉 액티비티가 종료되지 않음
  • onResume, onPause, onDestroy 상태 돌입시 로그 출력

3. 세번째 액티비티

  • 아무런 기능을 구현하지 않고 뒤로가기 버튼으로 액티비티를 종료하여 액티비티 라이프 사이클 로그 확인해보기
  • onResume, onPause, onDestroy 상태 돌입시 로그 출력

레이아웃 UI 설계

1. 첫번째 액티비티

 

2. 두번째 액티비티

 

3. 세번째 액티비티


코드 설계 (Android Studio)

  • MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = findViewById(R.id.button);

        // 버튼 클릭 이벤트
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 두번째 액티비티로 이동
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MyMultiple", "Main : onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MyMultiple", "Main : onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MyMultiple", "Main : onDestroy");
    }
}

 

  • SeconndActivity.java
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // 뒤로 가기 버튼 이벤트
    @Override
    public void onBackPressed() {
        //super.onBackPressed(); 기존의 뒤로가기 기능 비활성화
        
        // 대화상자 출력
        AlertDialog.Builder alert = new AlertDialog.Builder(SecondActivity.this);
        alert.setTitle("액티비티 이동");
        alert.setMessage("몇번째 액티비티로 이동하시겠습니까?");

        // 대화상자 '세번째' 이벤트, 세번째 액티비티로 이동
        alert.setPositiveButton("세번째", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent intentToThird = new Intent(SecondActivity.this, ThirdActivity.class);
                startActivity(intentToThird);
            }
        });

        // 대화상자 '첫번째' 이벤트, 첫번째 액티비티로 이동
        alert.setNegativeButton("첫번째", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent intentToFirst = new Intent(SecondActivity.this, MainActivity.class);
                startActivity(intentToFirst);
            }
        });
        // 대화상자 버튼을 누르지 않으면 화면이 넘어가지 않게 설정
        alert.setCancelable(false);
        // 대화상자 화면에 표시
        alert.show();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MyMultiple", "Second : onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MyMultiple", "Second : onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MyMultiple", "Second : onDestroy");
    }
}

 

  • ThirdActivity.java
public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
    }

    // 세번째 액티비티는 로그만 기록
    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MyMultiple", "Third : onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MyMultiple", "Third : onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MyMultiple", "Third : onDestroy");
    }
}

실행 화면

  • 순서대로 실행 진행
  • 액티비티 화면과 로그 화면 같이 출력
  • 편의상 로그는 축약해서 표현

 

1. 앱 실행

  • 리소스
    • 1. 첫번째 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onResume 상태
MyMultiple: Main : onResume

2. 버튼을 클릭하여 두번째 액티비티로 이동

  • 리소스
    • 1. 첫번째 액티비티
    • 2. 두번째 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onPause 상태
    • 두번째 액티비티는 onResume 상태
MyMultiple: Main : onPause
MyMultiple: Second : onResume

3. 뒤로가기 버튼을 눌러서 세번째 액티비티로 이동

  • 리소스
    • 1. 첫번째 액티비티
    • 2. 두번째 액티비티
    • 3. 세번재 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onPause 상태
    • 두번째 액티비티는 onPause 상태
    • 세번째 액티비티는 onResume 상태
// 현재 행동으로 남겨진 로그, 첫번재 액티비티는 아직 onPause 상태
MyMultiple: Second : onPause
MyMultiple: Third : onResume

4. 뒤로가기 버튼을 이용하여 세번째 액티비티 종료

  • 리소스
    • 1. 첫번째 액티비티
    • 2. 두번째 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onPause 상태
    • 두번째 액티비티는 onResume 상태
    • 세번재 액티비티는 onPause 상태되고 다른 액티비티가 onResume 상태가 되면 onDestroy 상태로 전환
// 현재 행동으로 남겨진 로그, 첫번재 액티비티는 아직 onPause 상태
MyMultiple: Third : onPause
MyMultiple: Second : onResume
MyMultiple: Third : onDestroy

5. 뒤로가기 버튼을 이용하여 첫번째 액티비티로 이동

  • 리소스
    • 1. 첫번째 액티비티
    • 2. 두번째 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onResume 상태
    • 두번째 액티비티는 onPause 상태
MyMultiple: Second : onPause
MyMultiple: Main : onResume

6. 뒤로가기 버튼을 이용하여 첫번째 액티비티 종료

  • 리소스
    • 1. 두번째 액티비티
  • 액티비티 라이프 사이클
    • 첫번째 액티비티는 onPause 상태되고 다른 액티비티가 onResume 상태가 되면 onDestroy 상태로 전환
    • 두번째 액티비티는 onResume 상태
MyMultiple: Main : onPause
MyMultiple: Second : onResume
MyMultiple: Main : onDestroy

참고 : 액티비티 라이프 사이클

안드로이드 액티비티 라이프 사이클의 각각의 메소드는 아래의 포스팅에서 좀 더 자세히 확인하실 수 있습니다.

https://luvris2.tistory.com/257

 

안드로이드 액티비티 라이프 사이클 (활동 수명 주기)

활동 수명 주기 (Activity Life Cycle) 단계 간에 전환하기 위해 활동 클래스는 6가지 콜백으로 구성된 핵심 집합 활동이 새로운 상태에 들어가면 시스템은 각 콜백을 호출 종류 : onCreate(), onStart(), onRes

luvris2.tistory.com

 

반응형