Android - 使用静态字段是否是在 activity 重启后幸存下来的好习惯?

Android - Is using static fields a good practice for surviving activity restart?

最近我找到了一种在配置更改后幸存下来的方法。我所做的是将我想要保护的对象声明为静态字段。这是一个好习惯吗?

不是真的。您可能会导致内存泄漏,因为您的静态字段之一可以保存对当前上下文的引用,如果没有引用,它可能会被销毁。

保持配置更改的最佳方法是使用推荐的方法 - 捆绑包。如果您必须存储更大的东西 and/or 更持久 - 使用文件、SharedPreferences 或数据库。

使用静态可能导致空指针异常。因为当配置更改时,当前上下文被破坏,如果您访问这些上下文,则会抛出 nullPointer 异常。

因此 sharedPreferences 或数据库是存储数据的最佳选择。

希望对您有所帮助:)

保留 Activity 状态的方法之一是使用片段,尤其是在配置更改期间。

您可以通过在 activity 由于配置更改而重新启动时保留片段来减轻负担,而不是重新初始化您的 activity。

您标记为保留的 activity 片段不会被 Android 系统破坏,因为它在配置更改期间破坏了您的 activity。

您可以将此类片段添加到 activity 以保留有状态对象。

与使用"static"相比,这种方法是下面link所提倡的:

http://developer.android.com/guide/topics/resources/runtime-changes.html

这从来都不是一个好习惯。根据我自己的经验,我制作了一个充满静态变量的音乐播放器应用程序,它的 ram 使用量飙升至超过 75 mb,远远超过任何其他同类应用程序。原因是,它存储变量的值,而 activity 被销毁。如果您在位图或任何其他重文件上有静态变量,它会导致内存泄漏,这对用户来说是不愉快的,因为并非所有设备都有足够的资源 (ram) 来跟上大量使用的应用程序。

静态变量也经常引发 NullPointerExceptions,因为它们也被许多其他活动使用,并且变量 null 可能会导致应用程序完全失败...

我建议您将数据存储在 SharedPreferences 中,只创建一个静态字段(如整数)并始终使用它从 SharedPrefrences 中检索值,它非常干净并减少了 NullPointers。此外,只有一个静态可以让您更好地控制您的应用程序...对我来说,更改 100 个静态字段而不是更改 1 个可以节省时间,因为它非常简单且内存效率高...

我希望,我可以帮助你一点!

我假设您不能出于某些(非常好的)原因将包放入 onSaveInstanceState 中。所以我认为你必须与保留片段进行比较。

如果您的 class 中有静态字段,例如:

static Object myStaticReference;

您将不再担心 Activity 或 Fragment 的 onDestroy、onCreate、onSaveInstanceState 的所有生命周期丛林混乱。这将大大减少代码行,并使一切更容易调试和理解。在任何情况下,您都不得在您的对象中引用视图、Activity、片段、上下文等。 例如,如果你有这样的东西:

public class MyObject {
    ArrayList metaData;
    Context cntx;
    public MyObject(Context cntx) {
         this.cntx=cntx;
    }
}

然后你仍然在生命周期丛林中,你将不得不传递(并重新传递)上下文的引用(以及你拥有的任何其他视图关系)任何时候你的 Activity 在 onCreate 中被重新创建如果有任何需要,仍然可以使用 onSaveInstanceState 进行管理。所以在这种情况下它就没用了。

对于保留片段(我想应该是另一种方式),事情也有所不同。即使 Activity 被重新创建,保留片段也会持续存在,但您必须管理这个额外的片段(好的部分是您不需要为此使用 UI)。