일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 제이쿼리연결
- 객체지향
- max apache
- 맥 mysql
- 블록 스코프
- 자바스크립트
- 한글잘림
- 비주얼스튜디오 코드
- max MySQL
- 기획자랑 사이좋게 지내고 싶다
- 자바스크립트 객체
- 한글입력 안됨
- 한글입력 잘림
- 자바스크립트 객체 만들기
- python GUI 사용하기
- 자바스크립트 class
- 맥 아파치
- 한글입력 오류
- 한글입력 씹힘
- 배열 분해 할당
- 닐 스미스 지음
- 황반석 옮김
- 자바스크립트 배열 할당
- python tkinter 인터페이스
- jquery 사용하기
- SwiftUI 기반의 iOS 프로그래밍
- 제이펍 출판
- 객체
- 생활코딩
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 제이쿼리연결
- 객체지향
- max apache
- 맥 mysql
- 블록 스코프
- 자바스크립트
- 한글잘림
- 비주얼스튜디오 코드
- max MySQL
- 기획자랑 사이좋게 지내고 싶다
- 자바스크립트 객체
- 한글입력 안됨
- 한글입력 잘림
- 자바스크립트 객체 만들기
- python GUI 사용하기
- 자바스크립트 class
- 맥 아파치
- 한글입력 오류
- 한글입력 씹힘
- 배열 분해 할당
- 닐 스미스 지음
- 황반석 옮김
- 자바스크립트 배열 할당
- python tkinter 인터페이스
- jquery 사용하기
- SwiftUI 기반의 iOS 프로그래밍
- 제이펍 출판
- 객체
- 생활코딩
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- Today
- Total
java,javascript,android,php,sql,공부용,메모용
안드로이드 플래그 Flag / FLAG_ACTIVITY_... / Android Studio / 안드로이드앱만들기 22 본문
안드로이드 플래그 Flag / FLAG_ACTIVITY_... / Android Studio / 안드로이드앱만들기 22
yy_dd2 2021. 3. 12. 17:46플래그와 부가데이터
- 플래그를 사용하려는 이유
문제 : startActivity() statActivityForResult() 메서드를 사용해 새 액티비티를 여러번 호출하면 동일한 액티비티가 메모리에 여러개 만들어진다 그럼 중복된 액티비티가 뜨게되는데 플래그(Flag)를 사용해 조정한다
- 액티비티의 처리 방식
액티비티 스택(Activity Srack) 으로 액티비티를 쌓아두었다가 상위 액티비티가 없어지면 이전 액티비티를 보이게 한다. 상위액티비티 아래 있는 액티비티는 계속 쌓이게되고 동일한 액티비티를 계속 띄우면 계속 동일한 액티비티가 차곡차곡 쌓이게된다
[ Flag ]
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_NO_HISTORY
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
- 이미 생성된 액티비티가 있으면 액티비티를 그대로 사용해라 (a 액티비티를 띄웠고 한번 더 a액티비티를 띄우면 2개의 액티비티가 아니라 처음에 띄웠던 액티비티를 사용하는것)
- 기존 액티비티를 사용하면 시스템에서 전달하는 인텐트의 객체(값)은 어떻게 전달할까?
- 새액티비티가 만들어져서 인텐트를 전달할때 : onCreate() 메서드 안에서 getIntent()메서드를 참조해서 액티비티 값을 전달 (액티비티가 재사용되면 onCreate()가 호출되지 않는다)
- onNewIntent() 메서드를 재정의하면 재사용 액티비티에서 인텐트값 전달 가능
public void onNewIntent(Intent intent)
FLAG_ACTIVITY_NO_HISTORY
- 이 플래그를 사용하면 처음에 사용한 액티비티 외에는 액티비티 스택에 쌓아두지 않는다
- 이벤트 알람, 사용자에게 한번만 보여주고 싶을때 유용하다
- 여러번 알람이 발생해도 그 화면을 한번만 보여주는 형태로 만들 수 있다
FLAG_ACTIVITY_CLEAR_TOP
- 액티비티 위에 있는 다른 액티비티를 모두 종료한다
- 홈 화면같이 항상 우선하는 액티비티를 만들때 유용하다
210317 플래그 내용추가
플래그에 대해서 좀 더 알아야 할 필요가 생겼다
안드로이드 앱 프로그래밍 미션7번이랑 8번을 하면
화면 2개를 만들어서 전환을 하라고 한뒤에 화면을 3개 더 만들어서 각각 전환하도록 했다
그래서 화면 a에서 b로가고 b에서 c로갔다가 c에서 b로가고 b에서 c로가면
화면이 자꾸 여러개가 생기는 문제가 발생했다
플래그를 활용해야 할거 같아서 좀 더 찾아봤다.
1) FLAG_ACTIVITY_SINGLE_TOP
[A] -> [B] -> [B] ==> [A] -> [B]
[A] -> [B] -> [C] -> [D] -> [D] ==> [A] -> [B] -> [C] -> [D]
2) FLAG_ACTIVITY_CLEAR_TOP
[A] (RootActivity)
[A] -> [B] -> [C] -> [D] -> [B] ==> [A] -> [B]
[A] -> [B] -> [A] ==> [A]
[A] -> [B] -> [B] ==> [A] - [B]
3) FLAG_ACTIVITY_REORDER_TO_FRONT
스택이 쌓이면 동일한 액티비티를 최상위로 올린다
최상위로 올라간 액티비티는 onResume()으로 재시작된다
(FLAG_ACTIVITY_CLEAR_TOP Flag 무시함)
[A] -> [B] -> [C] -> [A] ==> [B] -> [C] -> [A]
[A] -> [B] -> [C] -> [D] -> [B] ==> [A] -> [C] -> [D] -> [B]
[A] -> [B] -> [C] -> [C] ==> [A] -> [B] -> [C]
4) FLAG_ACTIVITY_NO_HISTORY
스택에서 [B] 에 "FLAG_ACTIVITY_NO_HISTORY" 속성을 적용하고
[B] -> [C] 화면을 호출 하면,
[C] 화면은 스택에서 제거 된다.
하지만 종료 시점은 [D] 화면이 onDestory() 되는 시점에
[C] 화면도 같이 onDestory() 된다.
1-1,1-2,-1-3을 같이 보고 이해하기
1-1) [B]에 속성 추가
[A] -> [B] -> [C] - [D]
1-2) [C]가 스택에서 제거됨 / [D]에서 백키누름
[A] -> [B] -> [C] -> [D]
1-3) ===> [A] -> [B]
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
// 플래그 지정
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// 플래그 추가
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
하고싶은거
A,B,C는 화면 액티비티
[A] -> [B] -> [C] -> [B] -> [C] -> [B] -> [A] -> [B] -> [C] 페이지로간다고하면
[C]에서는 [B]로 갈때 finsh()를 줘서 창이 닫히도록 했지만
[B]는 그렇게 하지 않았다 그래서 [C]는 닫히는데
문제는 [B]는 위에서 열어둔것처럼 4개의 화면이 남아있다
B 가 계속 생기는게 없이 C -> B -> A 하고 종료됐으면 좋겠음
- B가 1개만 생겼으면함
- FLAG_ACTIVITY_CLEAR_TOP
- 이 코드를 C화면의 버튼을 누르면 전달되는 인텐트로 작성하니 잘됨
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
intent.putExtra("name","고개관리에서 메뉴로");
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
setResult(RESULT_OK, intent);
startActivityForResult(intent, REQUEST_CODE_MENU);
finish();
}
});