为什么Android在屏幕旋转时会重新创建活动

17

有人知道Android在简单的方向更改时销毁并重新创建活动背后的设计理念吗?

如果允许活动自行重绘(如果它选择这样做)不是更好、更简单和更实用的设计吗?

顺便说一句,我很清楚如何禁用我的应用程序对方向更改的影响,但我真正不理解Android中这种设计的原因。


1
这是一个编程问题。Android爱好者更适合Android用户。我将把你的问题转到StackOverflow。 - Bryan Denny
最初想在这里发布,但不确定它是否合适。谢谢你澄清了这一点 :) - source.rar
3个回答

12

4
当一些副作用(例如悬挂的AsyncTasks、对话框不连续等)造成许多其他问题时,它并没有真正“帮助”。如果仅需要在屏幕上重新绘制/布局当前组件,则有没有简单的方法来确保这一点(而无需销毁和重新创建活动)? - source.rar
6
需要的不只是重新绘制。Android提供了在2种屏幕方向下使用不同资源(图像、字符串、主题、样式、布局等)的功能。手动重新加载这些资源将比处理对话框和异步任务更加繁琐。 - Romain Guy
2
嗯...摧毁并重新创建一个活动真的比允许应用程序重新加载所需的任何其他资源更加“轻量级”吗? - source.rar
1
@source.rar - 看起来Romain Guy是其推动力。否则为什么他会在注释中保护它? ;) - JBM
顺便提一下,发现另一个问题似乎也与方向有关。在这里发布了https://dev59.com/Lmw05IYBdhLWcg3w_Gyw - source.rar

0
这很简单。Android在方向更改时会销毁并重新创建活动,以便您(开发人员)可以选择继续使用先前的布局或使用和实现另一个布局。

1
你是对的,但是我认为推理完全是错的。文档关于 destroy 的说法是: [..] 可能是因为 activity 即将结束 [..] 或者因为系统暂时销毁此 Activity 实例以节省空间。 这并不排除方向变化,但它似乎很奇怪会像这样工作。到目前为止,我唯一能够触发“自然”的 destroy 的方式是旋转屏幕。对我来说,执行 pause,然后执行 resume 更合理。另外,“resume” 是一个错误的名称,但除此之外。 - pauluss86

0

不太确定为什么,我猜测是因为它需要重建屏幕上的活动。

OnCreate 接受一个变量 "Bundle savedInstanceState"。您可以在其中保存数据以实现更快的重新加载。

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mTextView = new TextView(this);

        if (savedInstanceState == null) {
            mTextView.setText("Welcome to HelloAndroid!");
        } else {
            mTextView.setText("Welcome back.");
        }

        setContentView(mTextView);
    }

    private TextView mTextView = null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接