但是,如果我的应用程序被暂停或停止,然后重新启动或恢复怎么办?我在 pageradapter 中的所有页面的膨胀是否都会被删除?我必须重新充气所有页面吗?
如果你的意思是应用程序Activity
,当它暂停时,这意味着它现在不是焦点Activity
。所有的状态都还在。这基本上意味着您不能接受任何前台事件,直到onResume()
. 如果操作系统决定调用 ,onSaveInstanceState()
您实际上可以存储诸如实例变量的值之类的东西,或者只是为新实例读取的标志。你不能在这里存储复杂的东西。所以像Thread
orCursor
实例这样的东西是不合适的。基本上任何不是“数据”的东西。
如果活动被破坏甚至进程被杀死,那么是的,您将需要重新绑定并重新充气所有内容。然而,它的美妙之处在于,在大多数情况下,您不必做任何特别的事情。只有在您可能已经写入捆绑包的情况下,您onSaveInstanceState()
才需要做一些额外的工作。
我的内部状态是否已恢复,即我的变量、sqlLite db、文件内容的值。
如果转换仅在 onPause 和 onResume 之间进行,则可以。一切都应该没问题。如果有销毁或进程终止,活动将重新启动,onCreate()
并且必须根据Bundle savedInstanceState
. 稍后我将介绍 sqlite 和文件。
我的小部件中的值是否已恢复,即文本框中的字符。
通常如果他们有saveEnabled(true)
(大多数人有)并且TextView
有一个 freezesText 属性,可以让他们记住最后设置的文本。但是,大多数情况下,如果您在onSaveInstanceState()
调用期间正确保存了状态,则很可能您不仅存储了 UI 状态,还存储了其他方式。在这种情况下,您最好在进行下一个时同步它们onCreate()
如果暂停或停止可能发生在 for 循环或代码块的中间,我如何防止损坏?
所以onPause()
并onStop()
发生在主 UI 线程上。如果您当前正在 UI 线程上运行代码,则它必须在这些其他回调发生之前完成。如果您在其他线程上运行,那么是的,您必须尝试在 UI 线程上完成任务的输出。它简化了很多。
另一方面,杀戮可能会发生。当我们谈论腐败时,这通常会影响程序内存之外的东西。就像您打开了文件句柄或打开了 sqlite 光标或打开了网络套接字一样。有了这个,你必须在使用它之前检查状态。
IE
- 在读取或写入目录之前确保目录确实存在
- 确保文件的内容以前被正确写入(简单的预期校验和通常在这里工作或版本元数据)。
- 在使用 sqlite 时使用事务,以确保您只将数据以完整的原子块写入表,这样您就没有表的行引用其他表中不存在的状态。
- 网络连接将被重置,并且您选择的网络协议之类的东西应该与您连接的应用程序一起为您进行完整性检查。
希望这会有所帮助,虽然它还没有完全完成,但它是一个很好的开始方法。