如果我的活动在显示另一个活动时被破坏,我应该如何处理持久化 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?的主要内容,如果未能解决你的问题,请参考以下文章