Acitivity

유민국·2023년 6월 19일
0

Activity

현재 보이는 화면을 관리하는 실행 단위
애플리케이션을 실행하면 Activity가 실행되고 Activity가 관리하는 화면이 나타나게 된다.

생명 주기

Activity가 실행 : onCreate -> onStart -> onResume
다른 Activity의 화면이 보일 때 : onPause -> Activity 일시 정지
다시 Activity의 화면이 보일 때 : onResume -> Activity 다시 동작
Activity의 화면이 완전히 보이지 않게 될 때 : onPause -> onStop
Activity의 화면이 다시 보여지게 될 때 : onRestart -> onstart -> onResume -> Activitiy 다시 동작
Activity가 종료될 때 : onPause -> onStop -> onDestroy

onCreate : Activity 처음 실행시나 화면 회전 발생시에 대한 처리
onPause : 일시 정지되기 전에 대한 처리
onResume : 일시 정지 되고 난 후 다시 돌아올 때의 처리
onDestroy : Activity가 종료되기 전에 필요한 처리

  1. onCreate
    액티비티가 처음 실행 될 때 자동으로 호출된다.
    액티비티가 관리할 View들을 생성하고 View들에 대한 초기작을 수행한다.
    화면 회전이 발생 했을 때의 처리도 수행한다.

  2. onStart
    액티비티가 처음 생성될 때 onCreate 다음으로 호출된다.
    액티비가 보이지 않는 상태가 되었다가 다시 보이게 될 때 onRestart 다음에 호출된다

  3. onResume
    액티비티가 처음 생성될 때 onStart 다음으로 호출된다.
    다른 액티비티가 보여지고 다시 이 액티비티가 보여 질 때 호출된다.
    액티비티가 보여지지 않았다가 다시 보일 때 onStart 호출된다.

  4. onPause
    다른 액티비티가 눈에 보여질 때 호출
    현재 액티비티는 일시 정지된다.

  5. onStop
    현재 액티비티의 화면이 완전히 보이지 않게 될 때
    onPause 다음에 호출된다.

  6. onRestart
    onStop이 호출된 이후 다시 액티비티가 보여지는 상태가 될 때 호출된다.

  7. onDestroy()
    액티비티가 완전 종료될 때 호출

Intent

안드로이드 4대 구성 요소들을 실행하기 위해서는 Intent 라는 객체가 필요하다.
Intent는 실행하고자 하는 4대 구성 요소와 관련된 정보를 가지고 이다.
개발자는 실행하고자 하는 4대 구성 요소의 정보를 Intent에 담고 이를 안드로이드 OS에게 전달하면 안드로이드 OS에 의해 해당 구성 요소가 실행된다.

Intent에 데이터 세팅하기

Activity를 실행하기 위해 사용하는 Intent 객체에 데이터를 저장할 수 있다.
putExtra 메서드를 통해 데이터 저장이 가능하며 데이터가 저장된 Intent는 실행되는 Activity까지 전달된다.
이를 통해 Intent에 저장된 데이터를 추출할 수 있다.
Intent는 Activity를 종료하고 돌아갈 때도 전달 할 수 있다.

Intent에서 데이터 가져오기

전달된 Intent 에 저장된 데이터는 getXXXExtra 메서드를 통해 추출할 수 있다.
이 메서드는 자료형 별로 이름이 다르므로 자료형에 맞는 메서드를 사용해야 한다

getExtra
매개변수 : 기본 자료형에 관련한 메서드들의 데이터의 이름과 저장된 것이 없을 경우 사용할 기본값을 설정한다. 객체(String...)는 기본값을 설정하지 않으며 값이 없을 경우 null이 반환된다.

Back Stack

Activity에서 다른 Activity를 실행하면 이전 Activity는 Back Stack에 담겨 정지 상태가 되고 새로 실행된 Activity가 활동하게 된다.
새로 실행된 Activity가 제거 되면 Back Stack에 있던 Activity가 다시 활동하게 된다.

메서드

startActivityForResult
Activity에서 다른 Activity를 실행하고 다시 돌아왔을 때 어떤 처리가 필요하다면 Activity를 실행할 때 startActivity가 아닌 startActivityForResult 메서드를 사용한다.

ex) A에서 B를 실했시켰을 때
B 종료 후 A가 B엑티비티의 데이터가 필요할 경우
B를 종료하기 전에 A에게 전달하고자 하는 데이터들 혹은 작업의 결과를 담아 두면 B를 다시 시작할 때 그대로 다시 실행시킬 수 있다. 다만 원래 B는 사라자는 것이고 A에 저장된 데이터를 가지고 B를 다시 생성하는 것 뿐이다.

onActivityResult
startActivityForResult 메서드를 이용해 Activity를 실행하고 돌아오면(B가 종료되고 다시 B를 실행 했을 경우) 자동으로 onActivityResult 메서드가 호출된다.
여기에서 필요한 작업을 처리한다.

registerForActivityResult

안드로이드에서는 버전이 업데이트 되면서 더 이상 위의 두 메서드는 사용하지 않게 된다.

구글에서 추가로 제공하는 기능이다.
startActivityForResult 와 onActivityResult 메서드 조합 대신 사용한다.
다 수의 액티비티 실행을 분리해 관리할 수 있다는 장점을 가지고 있다.

// 계약 객체를 생성한다.
// 다른 Activity를 갔다 돌아 왔을 경우
val c1 = ActivityResultContracts.StartActivityForResult()
val fourthActivityLauncher = registerForActivityResult(c1){
    // FourthActivity를 갔다 돌아왔을때의 코드를 구현한다.
    textView.text = "FourthActivity를 갔다 돌아왔습니다\n"
}

Intent Filter

안드로이드의 4대 구성요소는 모두 AndroidManifest.xml 파일에 기록되어야 한다.
이 때 다른 애플리케이션이 실행할 수 있도록 하고자 한다면 Intent filter 를 이용해 이름을 설정해주면 된다.
애플리케이션이 단말기에 설치되면 안드로이드 OS는 지정된 Intent Filter 의 이름을 확인하여 정리하고 실행 요청을 받으면 이를 실행할 수 있다.

다른 앱에서 실행하기

// 다른 애플리케이션의 activity에 붙여준 이름을 지정하여 Intent를 생성한다
// Intent Filter의 Action name을 넣어준다.
val newIntent = Intent("com.test.android45_third_activity")
startActivity(newIntent)

exported 를 true로 해야 다른 앱에서 실행이 가능하다

<activity
    android:name=".ThirdActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="com.test.android45_third_activity"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Uri를 이용한 다른 앱 띄우기

// 위도와 경도를 문자열로 만들어준다.
// 독도 위도 경도
// val address = "geo:37.243243, 131.861601"

// 웹 사이트
val address = "https://developer.android.com"
val uri = Uri.parse(address)
val newIntent = Intent(Intent.ACTION_VIEW, uri)
startActivity(newIntent)

profile
안녕하세요 😊

0개의 댓글