为什么我的SplashActivity的初始化代码没有执行?

时间:2019-06-13 15:47:37

标签: android memory-management android-lifecycle

我的应用程序具有一些全局/静态数据结构,在显示主要Activity之前需要对其进行初始化,因此我将工作放入了onCreate的{​​{1}}方法中,该方法仅显示了2秒钟,开始另一个活动,并完成自身:

SplashActivity

现在,我的应用有时会由于空指针引用而神秘地崩溃-一些全局数据结构未初始化。这只能表示未调用SplashActivity的onCreate方法(对吗?)。

我不知道该如何重现,但它经常发生。我可能将应用程序留在了后台,然后重新输入。但是不应该发布应用程序级别的数据,对吧?

3 个答案:

答案 0 :(得分:1)

飞溅活动本质上是短暂的,任何全球数据结构都不应依赖。如果需要,则需要创建一个Application类,并在那里进行所有全局数据结构初始化。这些在应用程序的生命周期内不会超出范围。

答案 1 :(得分:1)

  

我可能将应用程序留在后台,然后重新输入。但是不应该发布应用程序级别的数据,对吧?

这取决于您说“需要初始化的全局/静态数据结构”的意思。

如果用户离开了您的应用程序,则预计Android操作系统可能会终止您的应用程序进程。发生这种情况时,仅存储在内存中的所有内容都会丢失。

一个常见的例子是一些public static值,您只需加载一次,然后在整个应用程序中进行引用即可。当操作系统终止您的应用程序进程,然后用户返回到您的应用程序时,该public static值将需要重新初始化。

答案 2 :(得分:1)

为什么不只是在Application类中初始化它们

public class MyApplication extends Application {

    private int globalData = 0;

    public int getGlobalData() {
        return globalData;
    }

    public void setGlobalData(int globalData) {
        this.globalData = globalData ;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        setGlobalData(100)
    }
 }

更改清单文件中的应用程序标签-

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".MyApplication" .  // declare the application class
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

现在您可以在

之类的应用中的任何位置访问此文件
((MyApplication) getApplicationContext()).getGlobalData()

您的行为是因为,即使尚未关闭应用程序,该应用程序仍在后台运行,Android OS可以清除未使用的初始化变量。