如果我的活动在显示另一个活动时被破坏,我应该如何处理持久化 Android WebView?

Posted

技术标签:

【中文标题】如果我的活动在显示另一个活动时被破坏,我应该如何处理持久化 Android WebView?【英文标题】:How should I deal with persisting an Android WebView if my activity gets destroyed while showing another one? 【发布时间】:2011-01-31 06:27:29 【问题描述】:

我正在构建一个基于增强的 WebView(基于 PhoneGap)的 android 应用程序。我已经增强了 WebView,以便您可以从内部运行的 javascript 调用本机联系人选择器来选择电话号码(例如,可能由 Facebook 提供)。

我遇到的问题是本机联系人选择器在另一个进程的活动中运行,Android 文档说,当另一个活动打开时,我的活动可能会由于内存限制而被破坏。我实际上并没有在我的应用程序中看到这种情况发生,但如果发生了,那么我猜我的 WebView 的状态将被破坏,并且正在等待选择的联系人的代码将被终止。

在联系人选择器打开时,请求联系人的活动可能会被破坏,这似乎有点疯狂。有谁知道这是否真的发生?如果有,有没有办法保持 WebView 的状态?

谢谢,

-肖恩

【问题讨论】:

【参考方案1】:

有没有人知道是不是真的 发生了什么?

你看问题太简单了。

您有一个WebView。您打开联系人应用程序。当用户在联系人应用程序中时,一个电话打进来。在打电话时(使用蓝牙耳机),一条短信进来,所以用户从它的通知中打开它。当她还在打电话和发短信时,一条带有链接的文本进来了,所以她点击它并调出浏览器应用程序。

到这个时候,你的活动肯定会被破坏,除了一些最新的手机,它们可能有相当多的 RAM。

现在,这很常见吗?不会。不过,这也与联系人应用程序无关——如果用户按下 HOME,在未来的某个时间点,您的 Activity 也可能会被销毁以释放 RAM。

有没有办法保持状态 如果是 WebView?

这取决于您认为“WebView 的状态”是什么。如果您正在制作基于 PhoneGap 的应用程序,这确实是 PhoneGap 的工作。所以,你可以考虑问问他们。

没有办法持久化 DOM。有一些简单的方法可以保存 URL(请参阅onSaveInstanceState())。在这两者之间,您可能会认为“WebView 的状态”的一部分可能无法保存。

【讨论】:

【参考方案2】:

详细的答案有点复杂,但基本上可以归结为几点:

如果 Android 操作系统必须清理活动或服务,它知道如何优先处理应该先清理的活动。它根据他们当前是否在前台(最后一个)、正在执行代码、等待结果或只是在后台处于非活动状态(第一个)来执行此操作。您可以合理地确定,如果您的 WebView Activity 使用 startActivityForResult 启动了联系人选择器,它不会被杀死 如果一个活动被杀死,有一个完整的系统来保存数据,例如 onPause 方法(一旦你的活动离开前台就会触发),onSaveInstanceState 方法,当你的活动即将结束时调用.阅读这些以获取更多信息,以及屏幕方向更改时的 configurationChanged 方法。如果您至少还没有浏览过开发人员页面上的 Activity Lifecycle 文档,那么您必须这样做。 最后,我确信这个问题已经被多次解决,但措辞或情况略有不同。环顾四周,看看还能找到什么。

【讨论】:

以上是关于如果我的活动在显示另一个活动时被破坏,我应该如何处理持久化 Android WebView?的主要内容,如果未能解决你的问题,请参考以下文章

不要破坏android活动并且不应该在历史中

完成活动是不是会破坏从活动创建的线程?

从相机捕获图像并在活动中显示

从 Google Play 应用启动我的应用会破坏活动而不是恢复

从相机捕获图像并在活动中显示

如何将数组传递给另一个活动?