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

Why doesn't my SplashActivity's initialization code get executed?

我的应用程序有一些 global/static 数据结构需要在显示主要 Activity 之前初始化,所以我将这些工作放在 SplashActivityonCreate 方法中,它只显示 2 秒的初始图像,开始另一个 activity,然后自行完成:

initializeGlobalData(); 

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent i = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(i);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            finish();
        }
    }, 2000);

现在,我的应用程序有时会因为空指针引用而莫名其妙地崩溃——一些全局数据结构没有被初始化。这只能意味着没有调用 SplashActivity 的 onCreate 方法(对吗?)。

我不知道如何重现这个,但它经常发生。有可能我将应用程序留在了后台,然后重新进入。但是应用层面的数据应该不会放出来吧?

Splash Activities 本质上是短暂的,不应依赖于任何全局数据结构。如果您需要这样,您需要创建一个应用程序 class 并在那里进行所有全局数据结构初始化。这些在应用程序的生命周期内不会超出范围。

It's possible I left the app in the background, and re-enter. But application level data should not be released, right?

这取决于你说"global/static data structures that need to be initialized"时的意思。

如果用户离开您的应用程序,预计 Android OS 可能会终止您的应用程序进程。发生这种情况时,任何仅存储在内存中的内容都将丢失。

一个常见的例子是一些 public static 您加载一次然后在整个应用程序中引用的值。当 OS 终止您的应用进程,然后用户 returns 访问您的应用时,该 public static 值将需要为 re-initialized.

为什么不直接在 Application class

中初始化它们
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 可以清除未使用的初始化变量。