W.A 저장소

서울대학교 교육 5일차 - 안드로이드 Activity & Activity 생명주기 본문

Programing

서울대학교 교육 5일차 - 안드로이드 Activity & Activity 생명주기

W.A 2010. 8. 13. 13:08
우선 Activity에 대해서 설명하기 전에 어플리케이션 하나가 어떤 식으로 동작을 하는지에 대해서 알아보겠다.

지금 저희가 공부하고 있는 android의 주가 되는 커널은 리눅스로 이루어져 있다. 그 리눅스에는 유저들을 관리하는 부분이 있는데 그 부분이 사실상 안드로이드os는 사용되지가 않는다.(왜냐하면 모바일 플랫폼이 모 하나의 핸드폰을 여러명이서 돌려쓰지는 않으니까.) 그래서 이 기능을 사용하게된 부분이 각 어플리케이션마다 고유의 ID를 부여하고 그 권한을 700으로 주고 사용을한다. 그래서 다른 어플리케이션은 읽기도 쓰기도 실행도 안된다는 것을 의미한다. 이러한 이유 때문에 우리가 힘들어하는 Intent가 쓰이게 되는것이다. 이 인텐트는 지금 여기서 논할 문제가 아니기에 넘어간다.



위에서 보이는 그림을 보면 하나의 어플리케이션이 실행되면은 우선 주가 되는 Main Thread가 하나 생성되어 그 쓰레드가 어플리케이션을 실행하게 됩니다.(MainThread는 저어기 보이는 가운데 큰 Thread를 이야기 한다. 지금 그림의 전체를 감싸고 있는것이 하나의 어플리케이션 or apk 패키지임)

그럼 하나의 어플리케이션이 실행이 되려면은 우선 최초의 진입점(보통 java에서는 main함수가 있지만 안드로이드에서는 시스템자체로 하여 main함수가 미리 작성이되어있다. 작성되어있는 형태는 대략적으로 밑의 코드와 같이 되어있다.)에서 메인스레드가 생성이 된다.

- main함수

위에서 생성된 메인쓰레드가 시스템콜을 하여 처음 시작될 엑티비티에 대한 메세지를 메시지 큐에 넣어준다. 그렇게 되면은 위의 루퍼(Looper / 메인쓰레드)가 위의 함수에서 보이는것과 같이 메세지를 꺼내와서 처리해준다. 이런 결과로 알 수 있듯이 다른 쓰레드에서는 엑티비티의 UI를 변경 할수가 없다. 변경하게 된다고 하면은 그 UI는 공유자원이 되기때문에 이곳저곳에서 서로 고치려고 들게되어 문제가 생길수 있기 때문이다. 그래서 이번에 제가 구현하려고 했던 점차적으로 UI를 바꾸는 부분을 할때 쓰레드를 하나 두어서 1초마다 이미지를 뿌려주는 것을 했다. 밑에서 간단하게 소스를 보이겠다.

for( int i = 0; i < 3; i++ ) {
   Message msg = new Message();
   try {
    Thread.sleep(DELAYTIME);
    msg.what = 0;
    msg.arg1 = i;
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   mHandler.sendMessage(msg);  // 서브스레드에서 1초마다 메세지를 전송.
}
지금 위의 소스는 쓰레드 내부의 모습이다. 이 소스의 밑 부분에서 진하게 쓰여진 부분을 보면 쓰레드는 DELAYTIME동안 대기하였다가 DELAYTIEM시간이 지나면 메시지를 세팅하고 메시지를 루퍼로 보내준다.

이 처럼 보낸 메시지는 사용자가 정의해둔 소스에 따라서 그 기능을 실행한다. 그 코드는 밑에서 보이겠다.

private Handler mHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   if( Logmsg ) Log.d(TAG, "In Wait_Game Thread" + " "+ msg.what + " " + msg.arg1 + " " + msg.arg2);
   
   switch( msg.what ) {
   case 0:
    switch( msg.arg1 ) {
    case 0:
     countdownImage.setImageResource(R.drawable.two);
     break;
    case 1:
     countdownImage.setImageResource(R.drawable.one);
     break;
    case 2:
     countdownImage.setImageResource(R.drawable.zero);
     break;
    }
    break;
   case 1:
    switch( msg.arg1 ) {
    case 0:
     countdownImage.setImageResource(R.drawable.left);
     break;
    case 1:
     countdownImage.setImageResource(R.drawable.right);
     break;
    case 2:
     countdownImage.setImageResource(R.drawable.up);
     break;
    case 3:
     countdownImage.setImageResource(R.drawable.down);
     break;
    case 4:
     countdownImage.setImageResource(R.drawable.front);
     break;
    case 5:
     countdownImage.setImageResource(R.drawable.behind);
     break;
    }
    break;
   case 2:
    if( msg.arg1 == 0 ) {
     countdownImage.setImageResource(R.drawable.end);
     break;
    }
   }
  }
 };


위의 소스와 이어지는 부분은 switch문 위쪽 부분이다. 위에서 보이는 것과 같이 메시지의 데이터에 따라서 각각의 UI변경하는 역활을 한다. 이와같은 방법을 사용하면서 외부쓰레드가 사용자에게 보이는 엑티비티의 UI변경을 할 수가 있는것이다.