Android 让一个活动在轮换时被破坏有什么好处?
我使用了两种方法:Android 让一个活动在轮换时被破坏有什么好处?,android,rotation,Android,Rotation,我使用了两种方法: 让活动在旋转时被销毁 不要让活动在轮换时被破坏 我的方法几乎每次都是捕捉旋转事件,如果需要,调用setContentView并再次添加一些组件。如果没有,只需让它旋转,布局设计适应 到目前为止,我只看到了让它在结构非常复杂、非常动态的屏幕上被破坏的优势,每当我旋转并且没有破坏时,在重建屏幕时会显示一些闪烁 必须通过onSaveInstance、OnRestoreInstance传递状态的开销有时非常容易出错,而且在某种程度上非常耗时 我错过什么了吗 更新: 我没有在代码中执行
onCreate -> DrawUI() setContentView and add views -> fill() add content
未销毁时:
onCreate -> DrawUI() setContentView and add views -> fill() add content
onRotation -> DrawUI() setContentView and add views -> fill() add content
当在旋转后调用setContentView时,它将为设备方向选择正确的布局(请查看Google的Reto Meier的回答)
DrawUI和fill必须具有纵向和横向布局的逻辑,因为活动可以在两个方向中的每一个方向上创建。您的活动将被销毁,以便您有机会为新方向重新配置自己 从developer.android.com: 当屏幕改变方向时,系统将销毁并重新创建 由于屏幕配置已更改,前台活动已停止 您的活动可能需要加载其他资源(例如 布局) 例如,在横向模式下,您可能需要完全不同的布局,或者可能希望加载不会出现拉伸的图形。这样做的最佳方式是允许再次创建活动,这将允许对布局文件的链接更改为对方向更友好的布局 有关更多信息以及如何处理方向更改,请参见 如果要禁用娱乐,可以添加
android:configChanges="orientation"
到AndroidManifest.xml中的活动元素。这样您的活动就不会被重新加载
onSaveInstance
和onRestoreInstance
应仅用于传递会话信息,例如TextField
中的当前文本,并且不能在创建后再次加载任何通用文本。有时,当您为使用不同的布局时,它非常有用(横向/纵向)。并使用不同类型的视图,例如纵向中的ListView
和横向中的GridView
。如果重新启动活动,需要恢复大数据集、重新建立网络连接或执行其他密集操作,然后使用saveInstanceState上的()
可能会导致您注意到的症状:
onSaveInstanceState()
回调不是为承载大型对象而设计的
要在运行时配置更改期间保留对象:
重写onretainonconfigurationinstance()
方法以返回要保留的对象。
再次创建活动时,请调用getLastNonConfigurationInstance()
以恢复对象
但是:
虽然可以返回任何对象,但决不能传递与活动关联的对象,例如可绘制的、适配器、视图或与上下文关联的任何其他对象。如果传递,将泄漏原始活动实例的所有视图和资源。(资源泄漏意味着您的应用程序将保留这些资源,并且无法对其进行垃圾收集,因此可能会丢失大量内存。)
除非您能够顺利地传递对象
(s),否则我个人认为自己处理配置更改更有利,这意味着不要破坏
如果您的目标API为13或更高:您必须在configChanges
中包含screenSize
。从API 13开始,屏幕大小也会随着方向的变化而变化,您需要对此进行说明。在13之前,您的活动将自行处理此问题
android:configChanges=“方向|屏幕大小”
我猜您没有考虑创建android布局的标准方法。如果我错了,请纠正我。您是否使用两个分别带有-port,-land的res文件夹来告诉android系统在运行时根据方向选择加载不同的资产和布局
这可以为您提供管理不同方向布局的线索
这是安卓。请检查“陆地”和“港口”
希望这对你有帮助
我错过什么了吗
是的。您假设您的备选方案不太容易出错
通过不经历销毁和重新创建周期,您必须确保您正在为每一个可能的配置更改处理每一个资源的更改
不要让活动在轮换时被破坏
除非您使用的是android:screenOrientation
将您的活动强制为单一方向(例如,scape
),您不能只处理与旋转相关的配置更改。您需要处理所有配置更改。否则,一旦用户将其设备放入坞中,将其从坞中移除,从设置中更改语言,连接或分离键盘,更改全局字体缩放等,您的应用程序将中断
这反过来意味着在每次配置更改时,您需要:
- 更新你