Android WebViewActivity最小化应用返回时被关闭的问题咨询
问题根因
WebViewActivity最小化后被系统直接销毁,核心原因来自清单文件中的android:noHistory="true"配置。
该属性的系统逻辑为:只要Activity离开前台栈顶位置,系统就会立即将其从任务栈中移除并销毁,不会保留任何页面状态。应用最小化时WebViewActivity已经不再处于前台,因此会被直接清理,切回应用时自然回退到上一个栈内的Activity。
修复操作
1. 调整清单文件配置
直接删除WebViewActivity节点下的android:noHistory="true"属性即可,修改后的配置如下:
<activity android:name=".ui.WebViewActivity" android:screenOrientation="portrait" />
注意:
noHistory属性一般仅适用于一次性展示的引导页、临时弹窗类页面,这类页面不需要保留任何访问状态,不适合用于需要保留浏览进度的WebView页面。如果当初配置该属性是为了避免用户从WebView返回时重复进入页面,不需要依赖该属性,通过WebView的返回键逻辑控制即可实现。
2. 补充WebView状态保存逻辑
即使移除了noHistory,当系统内存不足时仍可能销毁后台的Activity,为了避免切回后WebView白屏、丢失浏览进度,需要补充状态保存与恢复逻辑,修改后的Activity代码如下:
class WebViewActivity : AppCompatActivity() { private lateinit var webView: WebView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_web_view) webView = findViewById<WebView>(R.id.offerWebView) webView.settings.javaScriptEnabled = true // 检测到有保存的页面状态时,优先恢复WebView内容,不重新加载 if (savedInstanceState != null) { webView.restoreState(savedInstanceState) } else { // 仅在无历史状态时加载传入的目标url webView.loadUrl(intent.getStringExtra("url").orEmpty()) } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 将WebView当前的浏览状态存入Bundle webView.onSaveInstanceState(outState) } override fun onBackPressed() { // 优先回退WebView内的浏览历史,无历史记录时再关闭当前Activity if (webView.canGoBack()) { webView.goBack() } else { super.onBackPressed() } } }
内容的提问来源于stack exchange,提问作者DoctorWho
相关产品推荐
相关产品推荐

