2014-04-02 2 views
1

전역 변수를 유지 관리하기 위해 Application 클래스가 확장되었습니다. 애플리케이션이 백그라운드에 놓여 있고 어떤 시점에서 OS가 리소스를 확보하려고 할 때 이러한 변수는 어떻게됩니까? onTrimMemory() 호출을 무시하면 모든 변수가 보존된다는 의미입니까? 어떤 상태를 재구성해야하는 활동과는 달리Android의 응용 프로그램 클래스 수명주기

감사합니다,

답변

1

게리 전역 변수를 유지하기 위해, 응용 프로그램 클래스는

당신은 또한 고전적인 자바 정적 데이터 멤버를 사용하는 환영

을 확장됩니다.

응용 프로그램이 백그라운드에서 실행될 때 어떤 시점에서 OS가 리소스를 확보하려고합니까?

"OS가 해제하려고하는"유일한 "리소스"는 전체 프로세스입니다. 정적 데이터 멤버 또는 사용자 정의 Application 또는 ContentProvider 인스턴스와 같은 다른 싱글 톤은 Android가 프로세스를 종료 할 때까지 메모리에 남아 있습니다.

onTrimMemory() 호출이 무시되면 모든 변수가 보존된다는 의미입니까?

예, Android가 프로세스를 종료 할 때까지 예.

+0

Application 개체의 onCreate()가 다시 호출됩니다. 메모리 부족으로 인해 전체 프로세스가 종료되고이 Application 개체에 저장된 모든 전역 변수가 해제되는 경우 여야합니다. 필자의 경우 ActivityA (시작 활동)는 Application 개체에 저장된 전역을 초기화 한 다음 ActivityB를 시작합니다. 내 앱이 잠시 백그라운드에서 작동하면 OS는 Application 개체의 onCreate()를 호출 한 다음 ActivityB의 onCreate()를 호출합니다. ActivityB는이 경우 호출되지 않는 ActivityA에 의해 일반적으로 초기화되는 전역에 의존합니다. –

+0

@GaryKipnis : 따라서 문제는 "ActivityA (시작 활동)에서 전역을 초기화"하는 것입니다. 정적 데이터 멤버와'Application' 객체는 캐시가 될 뿐이며 더 이상 의미가 없습니다. 이상적으로, ActivityB는 처음 사용할 때 게으르게 초기화되기 때문에 이러한 것들을 초기화 할 수 있습니다. ActivityB가 자체적으로 초기화 할 수없는 작업이있는 경우이 작업을 감지하고 사용자를 ActivityA로 다시 라우팅하거나 작업을 엉망으로 만들어 ActivityA로 사용자를 되돌려 보내야합니다. – CommonsWare

+0

Application 개체의 onCreate() 후에 ActivityA가 실행되었는지 확인하기 위해 모든 내 액티비티에 체크를 추가했습니다. 그렇지 않으면 응용 프로그램 실행시 평소대로 ActivityA를 시작하여 모든 것을 초기화합니다. 그리고 응용 프로그램 개체 변수를 "캐시"로 사용하고 있지만 일부 초기화 작업이 여전히 필요하며 ActivityA가이 작업을위한 편리한 장소였습니다. 많은 앱이이를 수행하는 것을 보아라. 앱이 잠깐 배경에 있다면, 포 그라운드로 가져올 때 모든 것을 효과적으로 다시 시작하고 다시 초기화 할 것이다. –

관련 문제