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

2024-11-14 18:05:33

activity所在页面销毁时,我最常用的处理办法就是重写onSaveInstanceState(Bundle outState)。 (说实话,这是悬赏经验,也是开发中常见的问题。如个人说的有问题,请私信我,或者留言。) 这里,我以Andriod Studio一个小例子说明。

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

工具/原料

Andriod Studio2.23

百度经验没有提供代码编写格式,实在是……

需要注意的

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

这里以一个简单的demo举例

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切换。切换横屏后,再次点击查看。如下面的代码,如果没有重写:onSaveInstanceSt锾攒揉敫ate(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销毁当前的页面状态
猜你喜欢