Android 애플리케이션 클래스 수명주기
내가 작업중인 Android 앱은 정적 변수에 경량 상태 (사용자 이름, GPS 위치 등)를 저장하도록 Application 클래스를 재정의합니다. 이 상태의 대부분은 시작 활동의 OnCreate에서 설정됩니다 (기본 설정에서 검색된 사용자 이름, 위치 리스너 실행). 시작 활동에 의존하여 Application 클래스를 초기화하는 것이 안전합니까? Launch 활동도 생성하지 않고 Application 클래스를 다시 생성 할 수있는 경우가 있습니까?
전화가 몇 시간 동안 잠든 후 앱을 다시 시작할 때 Application 클래스의 변수에 액세스하는 null 포인터 예외가 발생했기 때문에 질문이 발생했습니다 (전화가 잠자기 전에 앱이 포 그라운드에 남아있었습니다). 전화가 잠자고 전화를 켤 때 프로세스가 종료되고 Application 클래스가 다시 생성되고 스택의 최상위 활동이 재개되었지만 실행 활동이 실행되지 않았을 가능성이 있습니까? 초기화되지 않았습니까?
앱에서 설정 / 애플리케이션 관리 사용을 중지하도록 강제하여 이러한 종류의 시나리오를 테스트 해 보았습니다. 그러나 문제를 재현 할 수 없습니다. 다음 실행에서 Application 클래스가 생성되고 활동이 시작됩니다.
Application 클래스 인스턴스가 프로세스만큼 오래 존재하고 Application 클래스가 생성 될 때 애플리케이션을 "다시 시작"하는 것과 동일하다고 가정하는 것이 안전합니까? 새로운 활동 스택으로 시작합니까 (그리고 스택의 첫 번째 활동은 시작 활동입니다)?
아니요. 작업 스택을 그대로 유지 한 상태에서 전체 애플리케이션을 종료하고 다시 만들 수 있습니다. 이를 통해 시스템은이를 필요로하는 장치에서 메모리를 회수하는 동시에 최종 사용자에게 멀티 태스킹의 매끄러운 환상을 보여줍니다. 문서에서 :
백그라운드 활동 (사용자에게 표시되지 않고 일시 중지 된 활동)은 더 이상 중요하지 않으므로 시스템은 다른 포 그라운드 또는 가시적 프로세스에 대한 메모리를 회수하기 위해 해당 프로세스를 안전하게 종료 할 수 있습니다. 프로세스를 종료해야하는 경우 사용자가 액티비티로 다시 이동할 때 (화면에 다시 표시됨) onCreate (Bundle) 메서드가 이전에 onSaveInstanceState (Bundle)에서 제공 한 savedInstanceState와 함께 호출되어 사용자가 마지막으로 떠난 상태와 동일한 상태로 다시 시작할 수 있습니다.
즉, 프로세스 (응용 프로그램이 연결되어있는)를 종료 할 수 있지만 다시 시작할 수 있으며 개별 활동은 종료되기 전에 저장 한 내용에서 자신을 다시 생성 할 수있는 충분한 정보를 가져야합니다. 다른 활동에 의한 처리.
SharedPreference 또는 SQLite 데이터베이스에서 활동에 의한 초기화가 필요한 영구 공유 상태를 저장하거나 인 텐트 추가로 필요한 활동에 전달하는 것을 고려하십시오.
killing the process
실행중인 애플리케이션으로 시나리오를 테스트 할 수 있습니다 .
1 단계. 앱을 연 다음 Home
버튼을 눌러 백그라운드로 숨 깁니다.
2 단계. 호출 adb shell
3 단계. 명령 입력 su
(프로세스를 종료하려면 ROOT 권한을 얻어야 함)
4 단계 ps
(실행중인 모든 프로세스 ID를 나열하고 자신의 ID를 찾습니다)
5 단계 kill 1234
(애플리케이션이 프로세스 1234에서 실행되고 있다고 가정)
6 단계. 그런 다음 장치로 돌아가서 시작 아이콘을 다시 클릭합니다. 활동 스택의 마지막 활동이 다시 열린 것을 알 수 있습니다. onRestoreInstanceState()
활동에 대한 메서드가 호출 될 수도 있습니다 .
요컨대 : YourApplication.onCreate
일부 LaunchActivity가 아닌 에서 초기화하십시오.
문서는 확인 :
- 프로세스와 스레드
- API 가이드> 활동
시작 활동에 의존하여 Application 클래스를 초기화하는 것이 안전합니까?
예, 응용 프로그램이 더 오래 존재할 수 있다는 것을 기억하는 한 활동과 활동이 죽고 다시 생성 될 수 있습니다. Intent가 활동을 부활 시킬지 잘 모르겠습니다. LAUNCH 또는 VIEW (활동이 너무 무겁게 죽었을 때의 시나리오의 경우 앱에 바인딩 된 장기 실행 서비스가 있음)
Launch 활동도 작성하지 않고 Application 클래스를 다시 작성할 수있는 경우가 있습니까?
예, 마지막으로 보이는 활동이 LaunchActivity가 아닌 경우 Android 애플리케이션 수명주기 및 정적 사용
확인
전화가 잠자고 전화를 켤 때 프로세스가 종료되고 Application 클래스가 다시 생성되고 스택의 최상위 활동이 재개되었지만 실행 활동이 실행되지 않았을 가능성이 있습니까? 초기화되지 않았습니까?
여러 다른 활동이 A, B, C를 시작하고 전체 프로세스가 종료 된 경우 Android OS는 응용 프로그램 및 C 활동 만 만드는 데 적합하고 A와 B는 액세스시 다시 생성됩니다. 그들.
Application 클래스 인스턴스가 프로세스 동안 존재한다고 가정하는 것이 안전합니까?
예
그리고 Application 클래스가 생성 될 때 그것은 응용 프로그램을 "다시 시작"하는 것과 같습니다. 새로운 활동 스택으로 시작합니까 (그리고 스택의 첫 번째 활동은 시작 활동입니다)?
시작 활동을 다시 시작할 때 먼저 호출 될지 확실하지
않지만 마지막 활동, 즉 사용자가 볼 수 있어야합니다.
"앱을 다시 시작할 때 Application 클래스의 변수에 액세스 할 때 null 포인터 예외가 발생했습니다."
이 링크를 확인하십시오. http://www.developerphil.com/dont-store-data-in-the-application-object/
참조 URL : https://stackoverflow.com/questions/4585627/android-application-class-lifecycle
'developer tip' 카테고리의 다른 글
try-with-resource에 지역 변수가 필요한 이유는 무엇입니까? (0) | 2020.12.26 |
---|---|
Git : 한 번에 여러 브랜치를 리베이스하는 방법 (동일한 기본 커밋으로)? (0) | 2020.12.26 |
Android 앱을 MySQL 데이터베이스에 연결하는 방법은 무엇입니까? (0) | 2020.12.26 |
Haskell에서 복잡한 상태 유지 (0) | 2020.12.26 |
Android Java는 Java 8에서 람다 표현식을 지원합니까? (0) | 2020.12.26 |