상세 컨텐츠

본문 제목

[Android] Activity 와 Stack Flag

Android 개발

by mobile 2012. 8. 11. 16:34

본문

반응형

▶ Activity와 Stack Flag

액티비티는 Activity Stack 이라는 것으로 관리되는데, 이 스택은 액티비티를 차곡차곡 쌓아두었다가 가장 상위에 있던 액티비티가 없어지면 이전의 액티비티를 다시 실행하도록 도와줍니다.


[Reference]

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NO_HISTORY

FLAG_ACTIVITY_CLEAR_TOP


▶ FLAG_ACTIVITY_SINGLE_TOP

액티비티를 생성할 때 이미 생성된 액티비티가 있으면 그 액티비티를 그대로 사용하라는 플래그 입니다.

- 이미 만들어져 있는 액티비티를 다시 띄울 때의 인텐드 처리는 어떻게 할까요?

액티비티가 이미 메모리 상의 객체로 만들어져 있는 경우에는 액티비티를 다시 띄우더라도 onCreate() 메소드가 호출되지 않으므로 onNewIntent() 메소드를 재정의해 사용해야 합니다. onNewIntent() 메소드는 액티비티가 이미 객체로 만들어져 있을 때, 호출하는 액티비티로부터 전달되는 인텐드를 받아서 처리할 수 있도록 자동 호출됩니다.


[Reference]

public void onNewIntent(Intent intent)


▶ FLAG_ACTIVITY_NO_HISTORY

이 플래그로 설정하면 처음 이후에 실행된 액티비티는 액티비티 스택에 추가되지 않습니다. 즉, 플래그가 설정되어 있지 않은 경우에는 이전에 실행되었던 액티비티가 스택에 추가되므로 [Back] 키를 누르면 이전의 액티비티가 보이게 되지만 이 플래그를 사용하면 항상 맨 처음에 실행되었던 액티비티가 바로 보이게 됩니다.


▶ FLAG_ACTIVITY_CLEAR_TOP

이 액티비티 위에 있는 다른 액티비티를 모두 종료시키게 됩니다. 이 플래그는 홈 화면과 같이 다른 액티비티보다 항상 우선하는 액티비티를 만들 때 유용하게 사용할 수 있습니다. 이 플래그는 홈 화면과 같이 다른 액티비티보다 항상 우선하는 액티비티를 만들 때 유용하게 사용할 수 있습니다. 만약 홈 화면이 여러 개 있는 것이 아니라 하나만 만들어지는 것으로 하고 싶을 때 FLAG_ACTIVITY_CLEAR_TOP 플래그와 함께 설정하면 항상 하나의 객체가 메모리 상에 존재 하면서 그 상위의 액티비티를 모두 종료 시킬수 있습니다.


▶ 예제

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;


public class SampleFlagIntentActivity extends Activity {

// 다른 activity를 띄우기 위한 요청 코드 정의

public static final int REQUEST_CODE_ANOTHER = 1001;


public static int startCount = 0;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


Button startBtn = (Button) findViewById(R.id.startBtn);

startBtn.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

// 또 다른 Activity를 띄우기 위한 Intent 객체 생성

Intent intent = new Intent(getBaseContext(),

AnotherActivity.class);

intent.putExtra("startCount", String.valueOf(startCount));

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP

| Intent.FLAG_ACTIVITY_CLEAR_TOP);


// Activity 띄우기

startActivityForResult(intent, REQUEST_CODE_ANOTHER);


startCount++;

}

});


startBtn.setBackgroundColor(0xffff0000);

}


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);


// 또 다른 Activity에서 보내온 응답인지 요청 코드로 확인

if (requestCode == REQUEST_CODE_ANOTHER) {

// toast message

Toast toast = Toast.makeText(getBaseContext(),

"onActivityResult called with code : " + resultCode,

Toast.LENGTH_LONG);

toast.show();


if (resultCode == 1) {

String name = data.getExtras().getString("name");

toast = Toast.makeText(getBaseContext(), "result name : "

+ name, Toast.LENGTH_LONG);

toast.show();

}

}

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}


import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;


public class AnotherActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.another);


Intent receivedIntent = getIntent();

String startCount = receivedIntent.getStringExtra("startCount");


Toast.makeText(getBaseContext(), "startCount : " + startCount,

Toast.LENGTH_LONG).show();


// Button instantiated

Button returnBtn = (Button) findViewById(R.id.returnBtn);

returnBtn.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

// create a result intent and put extra value for "name" key

Intent resultIntent = new Intent(getBaseContext(),

SampleFlagIntentActivity.class);

resultIntent.putExtra("name", "mike");

resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP

| Intent.FLAG_ACTIVITY_CLEAR_TOP);


// tell caller that we have succeeded and dispose this activity

setResult(RESULT_OK, resultIntent);

// finish();


startActivity(resultIntent);

}

});

}


public void onNewIntent(Intent newIntent) {

Intent receivedIntent = getIntent();

String startCount = receivedIntent.getStringExtra("startCount");


Toast.makeText(getBaseContext(),

"startCount at onNewIntent() : " + startCount,

Toast.LENGTH_LONG).show();

}

}


반응형

관련글 더보기

댓글 영역