Android_4대 구성 요소의 Activity(1)
6197 단어 Android
정상적인 상황에서 활동의 주기는 다음과 같다.
onCreate()
활동 생명주기의 시작에 우리는 일반적으로 이 단계에서 초기화 작업을 한다. 예를 들어 레이아웃, 창 설정 등이다.
onReStart()
이벤트가 백그라운드에서 프론트 데스크톱으로 돌아갈 때의 시작 단계, 예를 들어 이벤트 A가 열리면 HOME 키가 데스크톱으로 돌아가고 이 앱으로 돌아갈 때 호출하기;
onStart()
이 때 활동은 이미 보이지만 사용자와 상호작용할 수 없습니다.
onResume()
이때 활동은 백스테이지에서 프론트 데스크톱으로 넘어가서 사용자와 상호작용을 할 수 있다. 온스타트()와onResume() 두 상태일 때 활동은 이미 볼 수 있지만 온스타트()는 백스테이지에서 실행되고 온리sume()는 프론트 데스크톱에서 실행된다.
onPause()
멈추고 있고 프로그램은 아직 프론트 데스크에 있기 때문에 시간 소모 조작을 하기에 적합하지 않다. 왜냐하면 이렇게 하면 사용자가 카드를 느낄 수 있기 때문이다.
onStop()
활동이 곧 멈추기 때문에 약간의 중량급 일을 할 수 있지만 마찬가지로 시간을 너무 소모해서는 안 된다.
onDestroy()
활동은 곧 소각될 것이다. 이것은 활동의 종점이다. 우리는 이 활동에서 자원을 방출할 수 있다.
질문1: onStart(), onResume(), onPause(), onStop()의 공통점
이 두 쌍은 같은 조작을 한 것 같지만 실제적으로 평가 기준이 다르다. 온스타트()와onPause()는 활동이 보이는지 안 보이는지로 만들어진 리셋이고, 온리스무()와onStop()는 활동이 프론트에서 실행되는지 여부로 만들어진 리셋으로 실제 운용하는 과정에서 큰 차이가 없다.
질문 2: 활동 A –> 활동 B의 경험
A.onPause–>B.onCreate()–>B.onStart()–>B.onResume()–>A.onStop();
2. 비정상적인 생명주기의 시스템 설정으로 인해
우리는 이런 상황을 고려하여 이벤트 A는 로컬에서 사진 한 장을 꺼내야 한다. 해상도에 따라 대응하는 선택이 있다. 화면이 세로로 되어 있을 때 우리는 사진 한 장을 꺼내서 표시한다. 이것은 화면이 회전하면 무슨 일이 일어날까?실제로 시스템이 일부 시스템 설정에 변화가 있음을 감지하면 이 활동은 소각되고 다시 생성됩니다. 그러나 소각되기 전에 활동은 onSaveInstanceState () 함수를 제공하여 데이터를 저장하도록 합니다. 활동을 다시 만들 때 (복구) 함수는 onRestoreInstanceState () 함수를 호출하여 데이터를 복구합니다.이로부터 두 가지 문제가 발생할 수 있다. 한 시스템이 어느 시기에 이 두 함수를 호출할 수 있습니까?2. 우리는 어떤 데이터를 저장해야 합니까?
질문 1: onSaveInstanceState(), onRestoreInstanceState()는 언제 호출됩니까?
onSaveInstanceState () 는 시스템 설정이 바뀔 때 호출됩니다. 예를 들어 화면의 회전, 키보드의 팝업 등입니다. 이때 우리는 버블을 이용하여 우리가 저장하고자 하는 데이터를 저장할 수 있습니다. 데이터 저장은 문제없습니다. 데이터를 어떻게 꺼내는지 다시 봅시다.내 활동이 on Restore Instance State () 를 호출해야 하는지 어떻게 알았을까. 실제로 우리 시스템은 지능적이다. 이 소각될 활동이 다시 나타날 수 있는지, 가능하면 이 함수를 호출할 수 있는지 판정할 것이다.예를 들어 우리가 화면을 돌릴 때 현재 이벤트를 삭제했지만, 회전이 끝난 후에 이 이벤트를 표시해야 합니다. 이것은 시스템이 onRestore InstanceState () 함수를 호출하는 것입니다.그리고 예를 들어 우리가 백으로 이 활동에서 물러나는 것은 단지 물러나는 것일 뿐이다.
문제2: 어떤 데이터를 저장해야 하나요?
활동이 자원 설정의 변화로 인해 활동 재건을 초래할 때 실례가 재건되었지만 이전의 모든 것이 사라진 것은 아니다. 사실상 우리 시스템은 위탁 메커니즘(층층이 위탁 저장)을 통해 View의 일부 데이터를 저장하고 재건 후에 자동으로 복원한다. 우리가 보존해야 하는 것은 우리가 정의한 구성원 변수이다.
이 활동의 재건은 메모리를 너무 소모하는 것이 아닙니까? 우리는 어떻게 불필요한 재건을 피할 수 있습니까?Android는 우리가 이 소원을 실현할 수 있도록 configChanges 속성을 제공합니다.키보드 팝업이 꺼질 때 변경 활동이 다시 재구성되지 않기 때문에 onSaveInstanceState () 와 onRestroeInstanceState () 방법이 없습니다. 그러나 onConfigurationChanged () 방법이 호출됩니다.
<activity
android:configChanges="keyboardHidden">
activity>
일반적으로 사용되는 configChanges 속성:
android:configChanges="orientation | screenSize" //
android:configChanges="keyboardHidden" //
3. 이상한 생명주기의 의외의 상황
위에서 논의한 것은 시스템 설정이 바뀔 때 활동 생명주기에 미치는 영향인데 이런 영향은 제어할 수 있다.다음은 2와 다른 상황일 뿐이고 그가 겪는 생명주기는 2와 같다. 인용의 원인만 다르고 발생을 절대 피할 수 있는 방안은 없다.이런 상황은 시스템 메모리 부족으로 인해 우선순위가 낮은 활동이 죽고 생명주기는 2에서 기술한 것을 참조할 수 있다.
4. 시작 모드
launch Mode라는 개념은 더 이상 군더더기할 필요가 없을 것이다.이벤트의launchMode를 토론하기 전에 이벤트 창고의 개념을 대충 알아봅시다.활성 작업 스택은 TaskAffinity(작업 종속성)에 의해 결정되며, 기본적으로 APP의 활성 작업 스택의 이름은 적용된 패키지 이름입니다.일반적으로 하나의 APP는 하나의 작업 스택으로만 활동을 관리한다는 점을 이해할 수 있습니다.자, 다음은 4중 시동 모드에 대해 말씀드리겠습니다.
1. 표준 모드
표준 모드는 기본 모드입니다. 이런 모드는 표준 철두바입니다. 우리가 이벤트를 시작하지 않았을 때 나는 아무것도 상관하지 않고 새로운 실례를 만들어서 창고 위에 넣습니다. 우리는 이 때 작업 창고가 이렇다고 가정합니다. ABCD(D는 창고 위에 있다).이벤트 B를 시작합니다. 퀘스트 창고는 이렇습니다. (ABCDB), B (ABCDBB) 를 시작합니다.
2.singleTop 스택 상단 단일 모드
누군가가 창고 꼭대기 복용 모드가 되었지만 본인은 창고 꼭대기 단일 모드가 더욱 적절하다고 생각합니다. 저는 이벤트 A를 시작하려고 합니다. 현재 퀘스트 창고의 창고 꼭대기가 A인지 확인해 보겠습니다.A의 경우 A의 인스턴스를 생성하거나 주기를 재실행하지 않으며 onNew Intent () 함수를 호출합니다.A가 아닌 경우 A가 다른 위치에 있든 없든 재구성하여 A를 생성합니다.상황1: ABCD – > D – > ABCD를 시작합니다.상황2: ABCD – > C – > ABCDC 부팅;
3. singleTask 스택의 단일 모드
마찬가지로 창고 내 복용 모드라고 할 수 있다.우리는 두 가지 판정 조건이 필요합니다. 하나는 활동 A에 필요한 퀘스트 창고가 존재하는지, 다른 하나는 퀘스트 창고에 A가 존재하는지 여부입니다.우리는 A를 시작합니다. 우선 원하는 작업 창고가 있는지 확인합니다.1 퀘스트 창고가 존재하지 않으면 퀘스트 창고를 만들고 A를 새로 만든 창고에 넣는다.2.1 퀘스트 창고가 존재하고 퀘스트 창고에 A의 실례가 없으며 A를 생성하여 이 창고에 넣는다.2.2 퀘스트 창고가 존재하고 퀘스트 창고에 A의 실례가 있으며 A 위의 모든 활동을 이 창고 꼭대기에 팝업하여 onNew Intent () 방법을 호출한다.일반적으로 같은 앱 아래에서 우리는 스택의 존재 여부를 고려할 필요가 없고 2.1과 2.2의 상황만 판단하면 된다.
4. singleInstance 단일 인스턴스 모드
SingleTask 는 활성 A로 설정되어 있으므로 작업 스택에 개별적으로 있어야 합니다.스택에 A가 있는 인스턴스는 재사용되고 A가 없는 경우 새 스택을 만들고 A가 만들어진 인스턴스는 새로 만들어진 스택에 배치됩니다.
5. 특별한 상황
A가 B를 적용한 활동 C를 시작했을 때 활동 C의 allowTaskReparenting 속성이true일 경우C를 처음 시작했을 때, 응용 프로그램 B가 시작되지 않았기 때문에, 활동 C는 A를 응용한 작업 창고에 있습니다.Apply B가 시작되면 Apply A의 작업 스택에서 Apply B의 작업 스택으로 활동 C가 검색됩니다.
6. 시작 모드를 정의하는 방법
우리는 먼저 등록 파일에 쓰는 방법을 이야기하는데, 보통singleTop을 많이 쓴다.
<activity
android:launchMode="singleTop">
activity>
5. Flags
Activity의 Flags의 역할은 주로 두 가지가 있는데 그것이 바로 시작 모드 설정, 활동 운행 상태 설정이다. 하나의 Intent는 하나의 flag를 설정할 수도 있고 몇 개를 선택하여 조합할 수도 있다.
1. FLAG_ACTIVITY_SINGLE_TOP
이것은 명세서 파일의 singleTop 설정과 일치합니다.
2. FLAG_ACTIVITY_NEW_TASK
기본적으로 startActivity () 에서 새 활동 A를 시작하면, 활동 A는 호출자와 같은 창고에 있습니다.그런데 만약에 저희가 A를 FALG 로 설정했다면...ACTIVITY_NEW_TASK, 처음 실행하면 호출자와 다른 창고를 만들고 A를 만든 실례를 창고에 넣습니다. 처음 실행하지 않으면 실례와 창고를 다시 만들지 않습니다.
3. FLAG_ACTIVITY_CLEAR_TOP
이 모드를 설정한 경우 인스턴스 A에 스택 메모리가 있으면 새 인스턴스가 작성되지 않고 해당 스택의 모든 Activity가 스택에서 아웃됩니다.목록 파일에서 A의 launchMode가 기본이고 A가 FLAG 를 설정하지 않았다면ACTIVITY_SINGLE_TOP, 활동 A가 제거되고 다시 생성됩니다.목록 파일에서 A를 활성화하는 launchMode가 기본이고 A를 활성화하면 FLAGACTIVITY_SINGLE_TOP, 이미 존재하는 활동 A에 Intent를 보내고 onNew Intent () 함수를 호출합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.