【问题标题】:Why doesn't my SplashActivity's initialization code get executed?为什么我的 SplashActivity 的初始化代码没有被执行?
【发布时间】:2019-06-13 15:47:37
【问题描述】:

我的应用程序有一些全局/静态数据结构需要在显示主 Activity 之前进行初始化,所以我将工作放入我的 SplashActivityonCreate 方法中,它只显示 2 秒的启动图像,开始另一个活动,并自行完成:

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 方法没有被调用(对吧?)。

我不知道如何重现这种情况,但它经常发生。有可能我将应用程序留在了后台,然后重新进入。但是应用级数据不应该公开吧?

【问题讨论】:

    标签: android memory-management android-lifecycle


    【解决方案1】:

    我可能将应用程序留在后台,然后重新进入。但是应用级数据不应该公开吧?

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

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

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

    【讨论】:

    • 是的,但是当应用程序终止并且用户返回时,将重新创建活动。 onCreate 应该被调用。
    • 当然。但是如果你已经finish()-ed 你的启动活动,它不在导航堆栈中并且不会被重新创建。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为什么不在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 也可以清除未使用的初始化变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 2016-05-16
        • 1970-01-01
        • 2018-03-01
        • 2020-07-02
        相关资源
        最近更新 更多