Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 让一个活动在轮换时被破坏有什么好处?_Android_Rotation - Fatal编程技术网

Android 让一个活动在轮换时被破坏有什么好处?

Android 让一个活动在轮换时被破坏有什么好处?,android,rotation,Android,Rotation,我使用了两种方法: 让活动在旋转时被销毁 不要让活动在轮换时被破坏 我的方法几乎每次都是捕捉旋转事件,如果需要,调用setContentView并再次添加一些组件。如果没有,只需让它旋转,布局设计适应 到目前为止,我只看到了让它在结构非常复杂、非常动态的屏幕上被破坏的优势,每当我旋转并且没有破坏时,在重建屏幕时会显示一些闪烁 必须通过onSaveInstance、OnRestoreInstance传递状态的开销有时非常容易出错,而且在某种程度上非常耗时 我错过什么了吗 更新: 我没有在代码中执行

我使用了两种方法:

  • 让活动在旋转时被销毁
  • 不要让活动在轮换时被破坏
  • 我的方法几乎每次都是捕捉旋转事件,如果需要,调用setContentView并再次添加一些组件。如果没有,只需让它旋转,布局设计适应

    到目前为止,我只看到了让它在结构非常复杂、非常动态的屏幕上被破坏的优势,每当我旋转并且没有破坏时,在重建屏幕时会显示一些闪烁

    必须通过onSaveInstance、OnRestoreInstance传递状态的开销有时非常容易出错,而且在某种程度上非常耗时

    我错过什么了吗

    更新:

    我没有在代码中执行任何类型的if“Orientation.XPTO==…”。这是两种方法的逻辑(代码被重用):

    销毁时

    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
    ),您不能只处理与旋转相关的配置更改。您需要处理所有配置更改。否则,一旦用户将其设备放入坞中,将其从坞中移除,从设置中更改语言,连接或分离键盘,更改全局字体缩放等,您的应用程序将中断

    这反过来意味着在每次配置更改时,您需要:

    • 更新你