Java “如何仅在应用程序启动时显示启动屏幕”;新鲜的;?

Java “如何仅在应用程序启动时显示启动屏幕”;新鲜的;?,java,android,xml,splash-screen,Java,Android,Xml,Splash Screen,我只想在应用程序生命周期中显示一次启动屏幕。这是我的密码: SplashScreenActivity.java: final int welcomeScreenDisplay = 3000; Thread welcomeThread = new Thread() { int wait = 0; @Override public void run() { try { super.run(); while

我只想在应用程序生命周期中显示一次启动屏幕。这是我的密码:

SplashScreenActivity.java:

final int welcomeScreenDisplay = 3000;

Thread welcomeThread = new Thread() {

    int wait = 0;

    @Override
    public void run() {
        try {
            super.run();

            while (wait < welcomeScreenDisplay) {
                sleep(1000);
                wait += 1000;
            }
        } catch (Exception e) {
            System.out.println("EXc=" + e);
        } finally {

            // Start other Activity
            startActivity(new Intent(SplashScreenActivity.this,
                    MainActiviey.class));
            finish();
        }
    }
};
welcomeThread.start();
final int WelcomeScreen Display=3000;
线程welcomeThread=新线程(){
int wait=0;
@凌驾
公开募捐{
试一试{
super.run();
while(等待
舱单:

    <activity android:name=".SplashScreenActivity" android:label="test"
    android:noHistory="true"
        android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden|keyboard">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MainActiviey" android:label="test"
         android:screenOrientation="portrait"
        android:configChanges="orientation|keyboardHidden|keyboard">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

问题是,如果我按下hardware HOME按钮隐藏应用程序,然后在应用程序列表中再次打开应用程序。它将再次显示启动屏幕(而不是显示
main活动
)。
是否可以仅在应用程序启动“刷新”(onresume()时不显示)时显示启动屏幕?谢谢

是的,这是可能的。用于存储一个标志,该标志表示您的飞溅已经显示。在启动屏幕的
onCreate()
方法中选中它,如果它存在,则启动下一个活动。

您不能对两个活动有此意图:

  <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

但是,他必须确保在应用程序终止时取消设置标志,这并不总是可以控制的……我认为,作者所说的“应用程序生命周期”意味着启动屏幕只能在安装后显示一次。很难确定应用程序何时终止,没错。但在那之后再次显示闪屏将提供糟糕的用户体验。用户不知道Android何时决定终止应用程序,从他的persective来看,这个闪屏会随机出现。这不是很烦人吗?我同意你的观点,闪屏通常很烦人而且不必要(除非它们掩盖了一些必要的背景负载)。不幸的是,在这种情况下,我认为询问者的意思是在每次应用程序启动“新鲜”(即未恢复)时显示启动屏幕的惯例。LouieGeetoo是对的。我想在每次应用程序启动“刷新”时启动屏幕显示一次,我不明白你为什么要这样做,但无论如何。。。您可以尝试使用:在活动的实例中保留
isShown
标志,并保存在
onSaveInstanceState()
中。从理论上讲,它应该可以做到。谢谢khr2003。它们不一样。.SplashScreenActivity的意图过滤器是“android.intent.category.LAUNCHER”,而.MainActiviey的意图过滤器是“android.intent.category.DEFAUL”。android:noHistory=“true”不工作。
android:noHistory="true"  
public class SplashActivity extends AppCompatActivity {

Handler handler;
private final int SPLASH_DISPLAY_LENGTH = 2000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    SplashStart();

}

private void SplashStart() {
    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    }, SPLASH_DISPLAY_LENGTH);
}


@Override
protected void onResume() {
    super.onResume();

    }
}