activity 장시간 백그라운드 회수 재구성

Android 시스템의 회수 메커니즘은 사용자가 주동적으로 조작하지 않은 상황에서activity(예를 들어 장시간 백엔드에서 실행)를 삭제하고 시스템이 activity를 회수하여 데이터를 잃어버리는 것을 피하기 위해 Android는 우리에게 onSaveInstanceState(Bundle outState)와onRestoreInstanceState(Bundle savedInstanceState)를 제공하여 데이터를 저장하고 복구하는 데 사용한다.
Activity 백그라운드가 회수된 후에 App을 다시 열면Acitivity는 공삼의 구조 함수를 실행하고 이 함수의 초기화 동작은 효력이 발생하며 Fragment에서 구조 함수를 실행하는 동시에 onAttach와 onCreate 방법을 실행하기 때문에 onAttach와 onCreate의 초기화는 효력이 발생한다.
1. onSaveInstanceState(Bundle out State)는 activity가 시스템에서 자동으로 회수되는 경우 onStop() 이전에 이 방법을 호출한다. 또한activity가 사용자가 자발적으로 소각하는 경우, 예를 들어 백반환 버튼을 누르거나finish 방법을 호출하면 onSaveInstanceState가 호출되지 않는다.
요약하면 onSaveInstanceState(Bundle outState)는 다음과 같은 상황에서 호출됩니다. 1. 사용자가 HOME 키를 눌렀을 때.2. 최근 응용 프로그램에서 다른 프로그램을 실행할 것을 선택할 때.3. 전원 버튼을 누르면(화면 표시를 끄면)4, 현재 activity에서 새로운 activity를 시작할 때.5. 화면 방향을 전환할 때(세로 화면을 가로로 자르든 가로 화면을 세로로 자르든 모두 호출한다). 
이러한 상황에서 이 방법의 호출 시기는 모두 onPause와 onStop 방법 사이에 있다. onPause -> onSaveInstanceState -> onStop.
2. on Restore Instance State(Bundle save Instance State) on Restore Instance State(Bundle saved Instance State)는 activity가 시스템에서 회수된 것이 확실하고 다시 activity를 만드는 경우에만 호출된다.
예를 들어 다섯 번째 상황에서 화면 방향을 전환할 때activity의 생명주기는 다음과 같다. onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume가 이곳에서 onRestoreInstanceState가 호출된 것은 화면 전환 시 원래의 activity가 시스템에 회수되었기 때문에 새로운 activity를 다시 만들었기 때문이다.(인터넷에 올라온 글에 의하면 가로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로 세로로
HOME 키를 누르면 데스크톱으로 돌아가고 아이콘을 누르면 원래 페이지로 돌아갈 때activity의 생명주기는 다음과 같다.onPause->onSaveInstanceState->onStop->onRestart->onStart->onResume는 activity가 시스템에서 회수되지 않았기 때문에onRestoreInstanceState가 호출되지 않았다.
onRestore InstanceState가 호출되면 페이지가 회수되고 onSaveInstanceState가 호출됩니다.
3. onCreate ()에도 Bundle 파라미터가 있는데 데이터를 복구할 수 있습니다. 이것은 onRestore InstanceState와 어떤 차이가 있습니까?
onSaveInstanceState가 반드시 호출되는 것은 아니기 때문에 onCreate () 의 버블 파라미터가 비어 있을 수 있습니다. onCreate () 를 사용하여 데이터를 복구하려면 반드시 비공식 판단을 해야 합니다.
onRestoreInstanceState의 Bundle 매개 변수는 빈 값이 아닙니다. 지난번 activity가 회수되어야만 호출될 수 있기 때문입니다.
그리고 onRestore InstanceState는 onStart () 이후에 호출됩니다.때때로 우리는 onCreate () 에서 초기화를 한 후에 데이터를 복원해야 하는데, onRestore InstanceState를 사용하면 비교적 편리할 것이다.다음은 공식 문서에서 onRestore InstanceState에 대한 설명입니다.
This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation.

1
이 설명의 마지막 구절이 무슨 뜻인지 주의해라. to allow subclasses to decide whether to use your default implementation.
이것은 onRestoreInstanceState 방법으로 데이터를 복구하면, 방법에서 부류의 onRestoreInstanceState 방법을 호출할지, 즉 슈퍼를 호출할지 여부를 결정할 수 있다는 것이다.onRestoreInstanceState(savedInstanceState);onCreate () 로 데이터를 복구하려면 슈퍼를 호출해야 합니다.onCreate(savedInstanceState);그렇지 않으면 다음과 같은 오류가 발생합니다.
E/AndroidRuntime(4964): android.util.SuperNotCalledException: Activity {com.example.test/com.example.test.SecondActivity} did not call through to super.onCreate()E/AndroidRuntime(4964): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)E/AndroidRuntime(4964): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2426)E/AndroidRuntime(4964): at android.app.ActivityThread.access$800(ActivityThread.java:153)E/AndroidRuntime(4964): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1345)E/AndroidRuntime(4964): at android.os.Handler.dispatchMessage(Handler.java:110)E/AndroidRuntime(4964): at android.os.Looper.loop(Looper.java:193)E/AndroidRuntime(4964): at android.app.ActivityThread.main(ActivityThread.java:5386)E/AndroidRuntime(4964): at java.lang.reflect.Method.invokeNative(Native Method)E/AndroidRuntime( 4964): at java.lang.reflect.Method.invoke(Method.java:515)E/AndroidRuntime(4964): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)E/AndroidRuntime(4964): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)E/AndroidRuntime(4964): at dalvik.system.NativeStart.main(Native Method)--------- beginning of/dev/log/main

좋은 웹페이지 즐겨찾기