Android에서, 화면은 Activity단위로 움직인다.

특정 Context에서 또다른 Activity를 실행시키고, 현재의 Activity를 종료 시키는 방법에 대해서 알아 보려고 한다. 

Context Class를 찾아 보면 startActivity라는 녀석이 있다. Context Class에 정의 되어 있기 때문에, Context의 SubClass인, Activity는 물론 Service Object에서도 특정 Activity를 실행 시킬 수 있다. 

public abstract void startActivity (Intent intent)

Since: API Level 1

Launch a new activity. You will not receive any information about when the activity exits.

Note that if this method is being called from outside of an Activity Context, then the Intent must include the FLAG_ACTIVITY_NEW_TASK launch flag. This is because, without being started from an existing Activity, there is no existing task in which to place the new activity and thus it needs to be placed in its own separate task.

This method throws ActivityNotFoundException if there was no Activity found to run the given Intent.

Parameters
intentThe description of the activity to start.
Throws
ActivityNotFoundException

startActivity()를 통해서, activity를 실행시키게 되면, 현재의 Activity 는 Pause상태에 접어 들게 된다. 

특정 Activity()를 종료 시키기 위해서는 Activity Class내의 finishXXX() Method들을 사용하면 된다. 
가장 기초적인것만 살펴보면, finish()가 있다. 

public void finish ()

Since: API Level 1

Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult().


finish() 가 호출되면, 현재 Activity가 Destroy 상태가 되며, (OnDestroy() 호출됨 )  이전 Activity 가 다시 Active상태가 된다 ( onResume() 호출됨 )

이런식으로 대강 Activity의 흐름이 흘러간다. 

나중에 finishActivity(Intent, int ) 와 같은 함수들이 쓸일이 생기면 그때 걔네들을 좀 살펴봐야 겠다.



우선, 시계를 출력하려면 당연히 Timer가 필요하다.

java.util.Timer Class 를 이용해서 일정한 주기로 Task를 실행할 수 있다.

Task는 Method를 넘겨주는게 아니라, 역시 TimerTask의 SubClassing 해서 구현한 다음 해당 Class의 Object를 넘겨줘야한다.

    @Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mCurTimeTextView = (TextView) findViewById(R.id.CurrentTimeTextView);

MainTimerTask timerTask = new MainTimerTask();

mTimer = new Timer();

mTimer.schedule(timerTask, 500, 1000);

}


Activity 가 생성될때, 불러지는 onCreate를 Override하여, TimerTask Object와 Timer Object를 만들고, timer의 schedule method를 통하여,
일정 주기로 Task가 호출 될 수 있게 한다.

2번째 Argument가 최초 실행 timing이고, 3번째 Argument가 실행 주기이다. 초단위로 시계를 보여줄것이기 때문에,
1초마다 호출되도록 프로그래밍 하였다.

private Handler mHandler = new Handler();

private Runnable mUpdateTimeTask = new Runnable() {

public void run() {

......

}

};

class MainTimerTask extends TimerTask {

public void run() {

mHandler.post(mUpdateTimeTask);

}

}


MainTimerTask Class구현부가, InnerClass 로 TimerTask를 SubClassing한 형태인데, 
Android에서는 MainThread이외에서는 UI Object를 제어 할 수 없기 때문에,
Handler를 통해서 MainThread에 Task를 넘겨 준다.

즉 시간을 Update하는 부분은 Runnable Object의 Run() Method이다.
Run() Method는 아래와 같이 구현한다.

Date rightNow = new Date();

SimpleDateFormat formatter = new SimpleDateFormat(

"hh:mm:ss dd.MM.yyyy");

String dateString = formatter.format(rightNow);

mCurTimeTextView.setText(dateString);


현재 시간을 가져오기 위해 java.util.Date Class를 사용했으며,
Date를 String으로 변환하기위해 java.text.SimpleDateFormat Class를 사용하였다.
SimpleDateFormat Class에 대한 자세한 사용법은 http://developer.android.com/reference/java/text/SimpleDateFormat.html 를 참고 하길 바란다.
formatter를 통해서 Date String을 만들고 해당 String을 TextView에 setTest로 setting함으로써 시간을 세팅할 수 있다.

이외에 유의 해야 할점은 Activity Life Cycle에 따른 Timer stop/start 이다.

onDestory/onPause 에서 Timer 를 정지 시키고, onResume에서 재 시작해주도록 아래와 같이 프로그래밍 한다.

@Override

protected void onDestroy() {

mTimer.cancel();

super.onDestroy();

}


@Override

protected void onPause() {

mTimer.cancel();

super.onPause();

}


@Override

protected void onResume() {

MainTimerTask timerTask = new MainTimerTask();

mTimer.schedule(timerTask, 500, 3000);

super.onResume();

}


간단한 프로그래밍이지만, Android Life Cycle/ MultiThread에서의 UI 제어등 알아두어야 할것이 꽤 있다.





+ Recent posts