如何保存activity销毁当前的页面状态

2026-04-08 05:36:50

1、 当Android程序中一个Activity A在运行时,这时在运行另一个新的Activity B,Activity A会执行onSaveInstanceState()方法。如果Activity B执行完后再找Activity A,会出现两种情况:Activity A被回收或者Activity A 没有被回收。被回收就要重新调用onCreate()方法,onCreate方法是带上了参数savedInstanceState;而没被回收的的就直接执行onResume(),跳过onCreate()了。

1、如下图所示的布局。当点击“设置”时,“请输入名字”所在的EditText就会变成"令狐冲"。下面是简单的布局文件。

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.ko.hello.MainActivity">    <TextView        android:id="@+id/tv_first"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="第一个Activity"        android:textSize="18sp"        />    <EditText        android:id="@+id/et_content"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入名字:"        />    <Button        android:id="@+id/btn_set"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="设置"        android:layout_marginBottom="10dp"        />    <Button        android:id="@+id/btn_view"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="查看"        /></LinearLayout>

如何保存activity销毁当前的页面状态

2、这时候,点击查看,就是“查看名字:令狐冲”。

如何保存activity销毁当前的页面状态

3、这里,用简单的横竖屏切换,模拟当前的Activity切换。切换横屏后,再次点击查看。如下面的代码,如果没有重写:onSaveInstanceState(Bundle outState)方法。就会变成:查看名字:null。

主要代码如下:

@BindView(R.id.tv_first)TextView tvFirst;@BindView(R.id.et_content)EditText etContent;@BindView(R.id.btn_set)Button btnSet;@BindView(R.id.btn_view)Button btnView;private String name;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    ButterKnife.bind(this);  /*  if (savedInstanceState != null) {        name = savedInstanceState.getString("name");        Log.v("===", "数据" + name);    }*/}/*@Overrideprotected void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);   outState.putString("name", name);}*/@Overrideprotected void onResume() {    super.onResume();    //如果是竖屏,切换成横屏    if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    }}@OnClick({R.id.btn_set, R.id.btn_view,R.id.tv_first})public void onClick(View view) {    switch (view.getId()) {        case R.id.btn_set:            name="令狐冲";            etContent.setText(name);            break;        case R.id.btn_view:            String viewName=name;            etContent.setText("查看名字:"+viewName);            break;        case R.id.tv_first:            startActivity(new Intent(MainActivity.this,SecondActivity.class));    }}

如何保存activity销毁当前的页面状态

4、如果将上面代码注释的地方取消掉,切换横屏后,再次点击查看,会出现:查看名字:令狐冲。

如何保存activity销毁当前的页面状态

5、如果想弄明白,一定要学会多看源码(说这句话,自己表示也要努力。)仔细看源码:

@Overrideprotected void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    Parcelable p = mFragments.saveAllState();    if (p != null) {        outState.putParcelable(FRAGMENTS_TAG, p);    }    if (mPendingFragmentActivityResults.size() > 0) {        outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG, mNextCandidateRequestIndex);        int[] requestCodes = new int[mPendingFragmentActivityResults.size()];        String[] fragmentWhos = new String[mPendingFragmentActivityResults.size()];        for (int i = 0; i < mPendingFragmentActivityResults.size(); i++) {            requestCodes[i] = mPendingFragmentActivityResults.keyAt(i);            fragmentWhos[i] = mPendingFragmentActivityResults.valueAt(i);        }        outState.putIntArray(ALLOCATED_REQUEST_INDICIES_TAG, requestCodes);        outState.putStringArray(REQUEST_FRAGMENT_WHO_TAG, fragmentWhos);    }}

注意:  Parcelable p = mFragments.saveAllState();

protected void onSaveInstanceState(Bundle outState) {    outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());    Parcelable p = mFragments.saveAllState();    if (p != null) {        outState.putParcelable(FRAGMENTS_TAG, p);    }    getApplication().dispatchActivitySaveInstanceState(this, outState);}

注意:saveHierarchyState());         Parcelable p = mFragments.saveAllState();

推荐有些分析源码的大神的书,或许可以为你学习源码带来很大的灵感和便利。

总之:对于activity销毁当前的页面状态,最常用就是重写onSaveInstanceState(Bundle outState) 。还有bundle,SharedPreferences等存储数据的要会使用。

如何保存activity销毁当前的页面状态

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢