본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-10 안드로이드 스튜디오 (액티비티 생명주기1)

반응형

안드로이드 4대 컨포넌트 

 

Activity

Activity는 사용자와 어플리케이션간의 상호작용을 하는 화면을 의미하며 모든 어플리케이션은 하나 이상의 Activity가 존재한다. Activity는 생명주기 관련 메서드들을 재정의 하여 원하는 기능을 넣어서 사용자와 상호작용 할수 있다.

Service

Service는 사용자와 직접적으로 상호작용 하지는 않으며 대체적으로 개발자가 백그라운드에서 필요한 작업을 처리하기 위해 Service를 사용한다. 서비스는 메인스레드에서 동작하기 때문에 Service내부에서 별도의 스레드를 생성하여 작업을 처리해 주어야 한다.

BroadcastReceiver

BroadcastReceiver는 안드로이드 시스템으로 부터 발생하는 이벤트와 정보들을 받아 처리해 준다. 예를 들어 시스템 부팅, 배터리 부족, 네트워크 끊김 등을 알려주는 것이 Broadcast인데 어플리케이션 필터를 통해 받을수 있다.

ContentProvider

ContentProvider는 데이터를 관리하거나 다른 어플리케이션에 데이터를 제공하는 요소이다. 데이터를 저장하기 위해 SQLite나 파일등을 이용할수 있다.

Intent

4대 컴퍼넌트 요소간의 메시지 전달기능을 한다. 명시적인텐트와 암시적인텐트가 존재한다. 명시적인텐트는 특정 클래스를 지정하여 동작한다. 묵시적인텐트는 특정 클래시를 지정하지 않기 때문에 여러 개의 연관된 요소를 호출할 수 있다는 장점이 있다.

 


액티비티의 생명주기 

사용자가 어떤 작업을 하다가 전화가 오면 바뀌기도 하고 , 화면사이즈가 바뀌기도 한다 그러므로  적절히 대비해야하는데 개발자가 적절히 대비하기 위하여 몇가지 함수를 제공하는데 그것이 액티비티생명주기이다 !! 

 

실행과정에서 단순히 개발자가 확인을 위한 메소드 ( 나중에 오류를 잡을때 사용) 

Log.i  = info 정보를 저장

Log.e = error 에러

Log.w = waring 경고

Log.d = debug 디버그

Log.v = verbose 특별한내용없는  

( " 테그 " , " 내용 메시지 " )  

 

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("LifeCycle", "onRestart 호출됨");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("LifeCycle", "onStart 호출됨");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("LifeCycle", "onResume 호출됨");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("LifeCycle", "onPause 호출됨");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("LifeCycle", "onStop 호출됨");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("LifeCycle", "onDestroy 호출됨");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("LifeCycle", "onCreate 호출됨");

    }
}

위 코드처럼 액티비티의 실횅 과정에서 내가 알고싶은 내용을 로그로 적어놓구 나중에 확인 가능함 

(토스트 메시지를 사용할수도 있지만 토스트를 사용하면 사용자에게도 보이기때문에 로그를 사용함 ) 

로그캣에서 필터링
Log필터링
생성이 되고 실행을 했을때 
종료 눌럿을때 

이처럼 액티비티의 생명주기를 확인하기 위하여 Log를 사용해 Logcat에서 확인해보면 순서대로 실행이 되고 종료되는것을 볼 수 있는데 이것이 액티비티의 생명주기이다 ! 

 

대략적인 생명주기를 알았으니 여러 상황에서의 생명주기도 알아야 겠지? 

 

다이얼 로그와 같은 상황 

메인은 Pause 상태가 되고 다시 돌아갓을때 Resume으로 돌아온다 

 

다른액티비티로 채워진 상황 

위처럼 새로운 액티비티가 띄워질때에는 메인 액티비티는 스탑상태가 되고 다시 돌아오면 Restart 호출 되면서 시작한다

위에 메뉴바 내려온 상황

이렇게 위에서 메뉴바가 내려온 상황이라면 액티비티동작중으로 인식 

 

홈버튼 눌렸을때 상황 

이렇게 홈버튼을 눌러 나가게 될경우나 잠금버튼 눌러 화면을 잠그게 되면 모든 액티비티는 스탑상태가 되고 

다시 들어왔을땐 Restart로 시작되어 진행된다 

 

화면 가로로 전환될때 상황 

특별한 케이스인데 가로로 전환이 되면 새로운 가로 액티비티가 실행이 됨 그러므로 전 액티비티는 Destroy되고 가로액티비티가 onCreate 된다 그러므로 데이터 손실이 올수 있다 

 

이처럼 화면이 돌아갈때 Destroy 되버리기때문에 데이터 정보가 다 날라가는데 이것을 방지하는게 있다 

 

일단 가로의 액티비티를 만들어주고 

가로액티비티디자인을 해주고난뒤에 가로액티비티의 이름을 메인액티비티와 같이만들어줌 

그리고 난뒤에 매니패스트에 지정을 해준다 

매니패스트 지정이 끝낫으면 메인액티비티에서 화면이 전환될때 호출될 메소드를 오버라이딩 해준다 

자 이렇게 하고 로그캣을 보면 화면이 전환 되어도 아까처럼 Destroy 되지 않괴 Configuration이 실행된걸 볼수 있다 

이렇게 하게 되면 세로에서 가로로 화면이 전환 되어도 액티비티를 Destroy 하지않고  Configuration되어 데이터 손실을 막을수 있다 

 

#java삭제#안드로이드삭제#이클립스 자바삭제#자바삭제#코딩삭제#코딩공부삭제#안드로이드스튜디오#액티비티생명주기삭제#

 

 

반응형