Android 12与Android 8中onSaveInstanceState()方法未触发问题咨询
为什么Android 12和Android 8设备都不调用onSaveInstanceState()方法?
我在测试Activity基础生命周期时遇到问题,Android 12和Android 8设备上都没有触发onSaveInstanceState()方法,相关代码、日志和配置如下:
MainActivity代码
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater).also { setContentView(it.root) } Log.d("AAAAA", "onCreate") binding.buttonSet.setOnClickListener { binding.tvData.text = "This is my meesage" } } override fun onStart() { Log.d("AAAAA", "onStart") super.onStart() } override fun onResume() { Log.d("AAAAA", "onResume") super.onResume() } override fun onPause() { Log.d("AAAAA", "onPause") super.onPause() } override fun onStop() { Log.d("AAAAA", "onStop") super.onStop() } override fun onDestroy() { Log.d("AAAAA", "onDestroy") super.onDestroy() } override fun onRestart() { Log.d("AAAAA", "onRestart") super.onRestart() } override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) { super.onSaveInstanceState(outState, outPersistentState) Log.d("AAAAA", "onSaveInstanceState") } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) Log.d("AAAAA", "onRestoreInstanceState") } }
Logcat日志
2022-07-16 11:37:30.344 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onCreate 2022-07-16 11:37:30.346 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStart 2022-07-16 11:37:30.346 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onRestoreInstanceState 2022-07-16 11:37:30.347 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onResume 2022-07-16 11:37:31.458 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onPause 2022-07-16 11:37:31.460 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStop 2022-07-16 11:37:31.461 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onDestroy 2022-07-16 11:37:31.518 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onCreate 2022-07-16 11:37:31.519 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStart 2022-07-16 11:37:31.520 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onRestoreInstanceState 2022-07-16 11:37:31.520 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onResume 2022-07-16 11:40:26.012 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onPause 2022-07-16 11:40:26.015 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStop 2022-07-16 11:40:26.016 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onDestroy 2022-07-16 11:40:26.076 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onCreate 2022-07-16 11:40:26.078 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStart 2022-07-16 11:40:26.078 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onRestoreInstanceState 2022-07-16 11:40:26.079 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onResume 2022-07-16 11:40:27.013 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onPause 2022-07-16 11:40:27.014 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStop 2022-07-16 11:40:27.015 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onDestroy 2022-07-16 11:40:27.067 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onCreate 2022-07-16 11:40:27.069 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onStart 2022-07-16 11:40:27.070 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onRestoreInstanceState 2022-07-16 11:40:27.070 29235-29235/com.elene.activitylifecycle23 D/AAAAA: onResume
Manifest配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.elene.activitylifecycle23"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ActivityLifecycle23" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
布局XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tvData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/buttonSet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.636" /> </androidx.constraintlayout.widget.ConstraintLayout>
问题原因及解决方法
你现在的核心问题是重写了错误的onSaveInstanceState重载方法。
你当前实现的是带两个参数的版本:
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) { super.onSaveInstanceState(outState, outPersistentState) Log.d("AAAAA", "onSaveInstanceState") }
这个方法是专门用于跨系统重启的持久化状态保存,需要在Manifest的Activity标签里添加android:persistableMode="persistAcrossReboots"属性才会被触发,而且仅在系统重启这类特殊场景下调用,不是常规生命周期里的状态保存方法。
正确的常规状态保存方法是只有一个Bundle参数的重载:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) Log.d("AAAAA", "onSaveInstanceState") }
另外还要注意,onSaveInstanceState的触发是有条件的:
- 只有当系统即将销毁Activity,但后续可能需要恢复这个实例时才会调用,比如横竖屏切换、App被后台系统回收、按下Home键切到后台(部分系统场景)
- 如果是手动按返回键关闭Activity,系统认为你不需要恢复这个实例,不会调用该方法
把代码改成单参数的重载后,在符合触发条件的场景下(比如横竖屏切换),就能看到该方法的日志输出了。
内容的提问来源于stack exchange,提问作者elenaovchinnikova
相关产品推荐
相关产品推荐

