为什么我的 SplashActivity 的初始化代码没有被执行?
Why doesn't my SplashActivity's initialization code get executed?
我的应用程序有一些 global/static 数据结构需要在显示主要 Activity 之前初始化,所以我将这些工作放在 SplashActivity
的 onCreate
方法中,它只显示 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 可以清除未使用的初始化变量。
我的应用程序有一些 global/static 数据结构需要在显示主要 Activity 之前初始化,所以我将这些工作放在 SplashActivity
的 onCreate
方法中,它只显示 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 可以清除未使用的初始化变量。