▶ 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();
}
}
[Android] Activity 수명주기 (0) | 2012.08.12 |
---|---|
[Android] Parcelable 인터페이스 (0) | 2012.08.11 |
[Android]Intent 예제 (0) | 2012.08.11 |
[Android] 레이아웃 인플레이션 (Layout Inflation) 예제. (0) | 2012.08.10 |
[Android]RelativeLayout 예제 (0) | 2012.08.08 |
댓글 영역