OnCreate onResume和onRestart问题

时间:2012-10-08 23:48:28

标签: android lifecycle

我有一个使用PagerAdapter的活动应用。在OnCreate事件中,我触发了PagerAdapter中所有7个页面的膨胀。各个页面都有标准小部件,一个页面有一个谷歌地图。在AVD测试时一切正常。

但是如果我的应用暂停或停止然后重新启动或恢复怎么办?页面转换器中所有页面的通胀是否会被删除?我是否必须再次重新填充所有页面?

更一般地......

我已经阅读了很多关于我的应用程序停止或暂停后会发生什么以及重启或恢复时应该做些什么的文章,但我还没有看到需要重建的内容和不需要的内容的精确说明要重建。我读到“这是一个刷新UI的好地方”,但我不确定这意味着什么。

乞讨问题可能是......

是我的内部状态恢复,即我的变量的值,sqlLite db,文件内容。

我的小部件中的值已恢复,即文本框中的字符。

如果在for循环或代码块中间发生暂停或停止,如何防止损坏?

谢谢, 加里

2 个答案:

答案 0 :(得分:2)

  

但是如果我的应用暂停或停止然后重新启动或恢复怎么办?   页面转换器中所有页面的通胀是否会被删除?做   我必须再次重新填充所有页面?

如果你的应用是Activity,那么当它被暂停时,这只意味着它现在不是焦点Activity。所有的州都还在那里。这基本上意味着在onResume()之前您不能接受任何前景事件。如果操作系统决定调用onSaveInstanceState(),您实际上可以存储实例变量的值或仅用于读取新实例的标志。你不能在这里存储复杂的东西。因此ThreadCursor个实例不合适。基本上任何不是“数据”的东西。

如果活动被破坏甚至进程被杀死,那么是的,您需要重新绑定并重新填充所有内容。然而,这种美丽,在大多数情况下,你不必做任何特别的事情。只有在您onSaveInstanceState()中写入捆绑包的情况下,您才需要做一些额外的工作。

  

是我的内部状态恢复,即我的变量的值,sqlLite db,文件内容。

如果转换只在onPause和onResume之间,那么是。一切都应该没问题。如果存在destroy或process kill,则活动将以onCreate()重新启动,并且必须根据Bundle savedInstanceState重置所有状态。我稍后会解决sqlite和文件问题。

  

我的小部件中的值已恢复,即文本框中的字符。

通常,如果他们有saveEnabled(true)(大多数人)和TextView,则会有一个freezesText属性,可以让他们记住最后一个文本集。但是,大多数情况下,如果在onSaveInstanceState()调用期间正确保存状态,则可能存储的状态不仅仅是用于UI,还有其他方式。在这种情况下,您可以在完成下一个onCreate()

时同步它们
  

如果暂停或停止可能发生,我怎样才能防止损坏?   for循环或代码块的中间?

因此主{i}}和onPause()出现在主UI线程上。如果您当前正在UI线程上运行代码,则必须在这些其他回调发生之前完成。如果您正在运行某个其他线程,那么是的,您必须尝试在UI线程上完成任务的输出。它简化了很多这方面的工作。

另一方面杀人,可能发生。当我们谈论腐败时,这通常会影响程序内存之外的事情。就像打开文件句柄或打开sqlite游标,或打开网络套接字一样。有了它,你必须在使用之前检查状态。

  • 确保目录在您阅读或写入之前确实存在
  • 确保文件内容已正确写入之前(简单的预期校验和通常在此处工作或版本元数据)。
  • 在使用sqlite时使用事务来确保只以完整的原子块将数据写入表中,这样就不会有表中的行引用其他表中不存在的状态。
  • 网络连接将被重置,您选择的网络协议之类的内容应该与您一起进行健全性检查以及与之相关的应用程序。

希望这会有所帮助,虽然它还没有完全完成,但这是一个很好的开始方法。

答案 1 :(得分:0)

在暂停和停止状态下,所有对象都会被保留,您不必担心循环中断,除非完成时间超过5秒,这可能会产生ANR。

但是,在进入这些状态以重新发布不需要或可以轻松重新创建的对象时,这是一种很好的做法,特别是如果它们使用大量内存,并在重新绑定状态Resume或Restart时重新创建它们。

当您的应用程序进入销毁状态时,您的所有对象都将丢失。