문제

이벤트 검색 애플리케이션을 작성하고 다른 화면에서 한 화면에서 검색 기준을 설정 한 다음 사용자는 세 번째 화면에서 검색 기준을 편집하고 4 번째 화면으로 이동할 수 있습니다.

위의 작업을 달성하기 위해 응용 프로그램 주변의 값을 기억하는 정적 객체를 사용하고 있으며 추가 일을 할 필요가 없습니다.

그러나 메모리가 낮은 메모리가 정적 객체를 삭제 한 경우 안드로이드에서 정적 객체 수명주기에 대해 두렵습니까 ???

Android가 멀티 태스킹을 지원함에 따라 사용자가 다른 응용 프로그램으로 전환하고 사용자가 다시 돌아 오면 애플리케이션이 미친 행동을 시작하면 멀티 작업이있을 때 정적 객체가 제거됩니까 ??? 어떤 아이디어 ?? 또한 싱글 톤 방법을 통해 정적 물체를 유지하는 것이 좋습니다.

도움이 되었습니까?

해결책

약간의 배경으로 시작하겠습니다. 응용 프로그램을 시작하면 어떻게됩니까?
OS는 프로세스를 시작하고 고유 한 프로세스 ID를 할당하고 프로세스 테이블을 할당합니다. 프로세스는 DVM (Dalvik VM)의 인스턴스를 시작합니다. 각 응용 프로그램은 DVM 내부에서 실행됩니다.
DVM은 클래스로드 언 로딩, 인스턴스 라이프 사이클, GC 등을 관리합니다.

정적 변수의 수명 : 클래스가 JVM에 의해로드되고 클래스가 언로드되면 죽을 때 정적 변수가 존재합니다.

따라서 Android 애플리케이션을 작성하고 정적 변수를 초기화하면 다음 중 하나가 발생할 때까지 JVM에 남아 있습니다.
1. 수업은 언로드됩니다
2. JVM이 종료됩니다
3. 프로세스가 죽습니다

정적 변수의 값은 다른 응용 프로그램의 다른 활동으로 전환 할 때 지속되며 위의 세 가지 중 어느 것도 발생하지 않습니다. 위의 세 가지 중 하나라도 발생하면 정적은 그 값을 잃게됩니다.

몇 줄의 코드로 이것을 테스트 할 수 있습니다.

  1. 활동의 onecreate에서 초기화되지 않은 정적 인쇄 -> NULL을 인쇄해야합니다.
  2. 정적을 초기화하십시오. 인쇄 -> 값은 null이 아닙니다
  3. 뒤로 버튼을 누르고 홈 화면으로 이동하십시오. 참고 : 홈 화면은 또 다른 활동입니다.
  4. 활동을 다시 시작합니다 -> 정적 변수는 널이 아닙니다.
  5. DDMS에서 신청 프로세스를 죽입니다 (장치 창의 중지 버튼).
  6. 활동을 다시 시작하십시오 -> 정적은 널 값을 갖습니다.

도움이되기를 바랍니다.

다른 팁

싱글 톤 패턴은 정적 변수를 사용하는 것을 기반으로하므로 실제로는 같은 위치에 있습니다. 정적 접근 방식은 대부분의 시간에 작동 할 수 있지만, 어떤 경우에는 메모리가 가득 차 있고 응용 프로그램이 다음 화면으로 이동하기 전에 다른 활동이 전경을 잡는 경우가 발생할 수 있습니다. 그러나 Android는 상태간에 지속되는 값의 몇 가지 옵션을 제공하거나 다음과 같은 것과 같은 전송 옵션을 제공합니다.

  • 의도를 사용하면 검색 기준을 활동에서 활동으로 전달할 수 있습니다 (웹 HTTP 요청과 유사)
  • 응용 프로그램 환경 설정을 사용하여 값을 저장하고 필요한 활동에서 검색 할 수 있습니다.
  • SQLITE 데이터베이스를 사용하여 테이블에서 유지하고 나중에 검색 할 수 있습니다.
  • 재시작시 재시작 상태를 저장하면 필드가 이전에 선택한 값으로 채워 지도록하는 경우 onsaveinstancestate () 활동 방법을 구현할 수 있습니다. 이는 상태의 활동 지속성간에 권장되지 않습니다.

선호도, 의도 및 SQLITE 데이터베이스 사용에 대한 코드 예제를 얻을 수 있습니다. Aegis-Shield 소스 코드 트리 Google 코드 또는 기타 오픈 소스 Android 응용 프로그램에서.

일부 연구 후에는 싱글 톤을 저장하기 위해 응용 프로그램을 사용하여 아이디어를 재현 할 준비가되지 않는 한 다음과 같은 아이디어가 아닙니다.

응용 프로그램 객체에 데이터를 저장하지 마십시오

그래서 받아 들여진 답변 기술적으로 정확하며 모든 정보를 제공하지는 않습니다.

위의 링크에서 알 수 있듯이 해당 모델을 실제로 고수하려면 NULL을 확인하고 가능한 경우 데이터를 재현 할 준비가되어 있어야합니다.

@r1k0이 바로 여기에 있습니다. 클래스의 정적 필드에 데이터를 저장하는 것은 신청 프로세스에서 자체적으로 지속되지 않습니다. Android는 메모리가 필요할 때 프로세스 (앱 실행)를 정기적으로 죽입니다.

안드로이드 문서에 따라 : 메모리에서 활동 상태와 방출,

시스템은 활동을 직접 죽이지 않습니다. 대신, 활동이 실행되는 프로세스를 죽여서 활동뿐만 아니라 프로세스에서 실행되는 모든 것을 파괴합니다.

아래 방법을 사용하여 원시화 상태와 직렬화 가능한 객체 및 소포 가능한 물체를 저장하고 복원 할 수 있습니다. 이들은 정상 활동 수명주기 동안 자동으로 호출됩니다.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

따라서 정적 변수 만있는 클래스가있는 경우 각 필드의 상태를 OnSaveInstancestate ()에 저장하고 onrestoreInstancestate ()에서 복원 할 수 있습니다. Android가 앱이 실행되는 프로세스를 죽이면 변수의 상태가 저장되고 Android가 앱을 복원하면 이전과 동일한 상태에서 메모리에서 값이 복원됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top