Activity가 시스템에서 실수로 회수되었을 때 임시 데이터를 보존하는 방법 onSaveInstanceState(Bundle outState)

4362 단어 android
onSaveInstanceState(Bundle outState)는 메모리 부족으로 프로그램의 메모리 등을 회수할 때 관건적인 데이터를 저장하는 데 사용되며, 대응하는 복구 데이터 함수는 onRestoreInstanceState(Bundle savedInstanceState)이며, 함수 onCreate(Bundle savedInstanceState)에서도 데이터를 복구할 수 있다.onSaveInstanceState는 일반적으로 onPause() 다음에 호출되지만, 리턴 키 등을 누르면 프로그램이 현저하게 종료됩니다.데이터를 저장하고 복구할 때 하나의 버블 대상을 사용합니다. 맵과 같이 키 값에 대한 정보를 저장할 수 있습니다. 그러나 onSaveInstanceState가 호출되었음에도 불구하고 다시 프로그램에 들어가면 onRestoreInstanceState가 호출될 수 없습니다. 또한 onCreate의 버블 대상도null일 수 있습니다.프로그램이 백그라운드에서 실행될 때 메모리가 시스템에 회수되거나 가로로 전환되는 등 상황이 발생하고 다시 프로그램에 들어갈 때만 onCreate 함수에 있는 Bundle 대상은null이 아니며, 이전에 onSaveInstanceState 사용자가 넣은 데이터를 저장하고, onRestoreInstanceState 함수도onResume () 가 실행되기 전에 호출됩니다.onStop() 함수에 다음 코드 에뮬레이터를 추가하여 시스템에서 재확보할 수 있습니다.
4
   new Handler().post(new Runnable() {
        publicvoid run() {
           // TODO Auto-generated method stub
           Runtime.getRuntime().exit(1);
        }
      });
onSaveInstanceState 함수를 덮어쓸 때 부모 클래스 대응 함수, 즉 슈퍼를 호출하는 것을 기억하십시오.Ave Instance State () 는 부모 클래스의 이 함수의 역할은android가 제공하는 각view 클래스인 EditText 등의 데이터를 저장하는 것이기 때문이다.android의 각view 클래스는 자신의 데이터를 저장하는 함수를 제공한다. 예를 들어EditText에 텍스트를 입력하면 이 텍스트 데이터는 저장되고 이 저장 행위는 슈퍼에 있다.onSaveInstanceState () 에서 실행되며, 이 EditText는 레이아웃 속성에 id 속성을 추가해야 합니다. 그렇지 않으면 데이터를 저장할 수 없습니다.마찬가지로 onRestore InstanceState 함수를 덮어쓸 때도 슈퍼를 호출합니다.onRestoreInstanceState () 함수는 EditText 등android를 복구하는 View 클래스의 데이터에 대응합니다.
상기 내용은 가로세로 화면 전환 시 onSaveInstanceState를 호출한다고 언급했지만 이것도 조건이 있다. 프로그램이 핸드폰의 특정 설정을 가로세로 화면 전환 등 처리를 설정했을 때 manifest 파일에 activity 라벨에android:configChanges = "orientation|screenSize"(API 13 이후 이렇게 설정해야 함)그러면 가로 세로 화면 전환 시 onConfigurationChanged(Configuration newConfig) 함수만 호출되고 activity의 생명주기 함수는 호출되지 않기 때문에 onSaveInstanceState 함수도 호출되지 않습니다.
예: 시스템이 예기치 않게 활동을 회수한 경우임시 데이터 보존 onSaveInstanceState(Bundle outState)
public class MainActivity extends Activity
{
    private EditText et;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        //   :
        //MainActivity.this.getClass().getName().toString()----------.
        //MainActivity.this.getClass().getSimpleName().toString()----
        //
        Log.e(MainActivity.this.getClass().getSimpleName().toString(), "   ");
        et = (EditText) findViewById(R.id.et);
        if(savedInstanceState != null)
        {    
            String tempData = savedInstanceState.getString("key");//temp    
            et.setText(tempData);
            et.setSelection(tempData.length());
        }
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState)//state          n/v
    {
        super.onSaveInstanceState(outState);
        String tempData = et.getText().toString();
        outState.putString("key", tempData);
    }
}

【주의】:
API 21은 Activity에 새로운 속성을 추가했습니다.persist Across Reboots로 설정하면 Activity는 지속적인 능력을 가지게 됩니다. 또한 새로운 bundle에 협조해야 합니다. 그것이 바로Persistable Bundle입니다. 
onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
Same as  onCreate(android.os.Bundle)  but called for those activities created with the attribute  persistableMode  set to  persistAcrossReboots .
이곳의 지속화는 전통적인 의미와 달리Activity에서 다시 불러오는 onSaveInstanceState, onRestoreInstanceState와 onCreate 방법을 구체적으로 실현한다.
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)

public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)

public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)

Active Instance State와 On Restore Instance State 방법은 재난을 구제하는 방법입니다. 정상적인 Activity 생명 주기에 있지 않고, 가로세로 화면 전환, 홈 키 누르기 등 돌발적인 이상 상황만 촉발합니다. API 21 이후 Persistable Bundle 파라미터가 추가되어 시스템이 꺼진 후 데이터를 복구할 수 있습니다.
Manifest의 activity에서 속성만 설정하면 됩니다.
(이 슬라이드에는 API 21 이상에 있는 구멍이 있습니다. 위의 세 가지 방법을 사용할 경우 Manifest에서 이 속성을 설정해야 합니다. 그렇지 않으면 레이아웃 컨트롤이 표시되지 않으며 Activity가 정상적으로 작동하지 않으며 라이프 사이클 방법이 비정상적으로 호출됩니다.
android:persistableMode="persistAcrossReboots"

그리고 액티비티에서 상술한 세 가지 방법을 직접 사용하면 된다.

좋은 웹페이지 즐겨찾기