Java Android应用程序在启动屏幕时按home按钮几秒钟后打开

Java Android应用程序在启动屏幕时按home按钮几秒钟后打开,java,android,android-intent,android-activity,splash-screen,Java,Android,Android Intent,Android Activity,Splash Screen,我有一个问题,我似乎想不出原因 启动应用程序时,在完成并开始新活动之前,首先会显示一个启动屏幕2.5秒。如果在此期间按home(主页)或back(返回)按钮,应用程序将正常关闭。但是,几秒钟后(超过2.5秒),应用程序将打开并从启动屏幕后的活动开始 任何关于为什么会发生这种情况的帮助都将不胜感激 这里是启动屏幕的实现(但是我不相信这里有任何东西会导致这个问题,因为我尝试了不同的实现) 这是舱单 <?xml version="1.0" encoding="utf-8"?>

我有一个问题,我似乎想不出原因

启动应用程序时,在完成并开始新活动之前,首先会显示一个启动屏幕2.5秒。如果在此期间按home(主页)或back(返回)按钮,应用程序将正常关闭。但是,几秒钟后(超过2.5秒),应用程序将打开并从启动屏幕后的活动开始

任何关于为什么会发生这种情况的帮助都将不胜感激

这里是启动屏幕的实现(但是我不相信这里有任何东西会导致这个问题,因为我尝试了不同的实现)

这是舱单

<?xml version="1.0" encoding="utf-8"?>



之所以发生这种情况,是因为您正在创建一个新的
线程
,并且在您将应用程序置于后台后,该线程仍将处于活动状态。您可以使用
处理程序更改方法。如果您需要在启动屏幕位于后台时下一个
活动
不会启动,则必须在延迟开始之前存储当前时间

private static final long SPLASH_SCREEN_MS = 2500;

private long mTimeBeforeDelay;
private Handler mSplashHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    // Create a new Handler.
    mSplashHandler = new Handler();
}

@Override
protected void onResume() {
    super.onResume();
    // The first time mTimeBeforeDelay will be 0.
    long gapTime = System.currentTimeMillis() - mTimeBeforeDelay;
    if (gapTime > SPLASH_SCREEN_MS) {
        gapTime = SPLASH_SCREEN_MS;
    }
    mSplashHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
            startActivity(intent);
            SplashScreenActivity.this.finish();
        }
    }, gapTime);
    // Save the time before the delay.
    mTimeBeforeDelay = System.currentTimeMillis();
}

@Override
protected void onPause() {
    super.onPause();
    mSplashHandler.removeCallbacksAndMessages(null);
}

只需使用处理程序,而不是像这样使用线程睡眠

new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                startActivity(intent);
                SplashScreenActivity.this.finish();
            }
        }, SPLASH_DURATION);

只有在希望保存数据和内存时,才需要实现
onStop()
方法

好问题,恭喜。谢谢你的评论!我以前尝试过使用handler,但它并不能解决我遇到的问题。
private static final long SPLASH_SCREEN_MS = 2500;

private long mTimeBeforeDelay;
private Handler mSplashHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    // Create a new Handler.
    mSplashHandler = new Handler();
}

@Override
protected void onResume() {
    super.onResume();
    // The first time mTimeBeforeDelay will be 0.
    long gapTime = System.currentTimeMillis() - mTimeBeforeDelay;
    if (gapTime > SPLASH_SCREEN_MS) {
        gapTime = SPLASH_SCREEN_MS;
    }
    mSplashHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
            startActivity(intent);
            SplashScreenActivity.this.finish();
        }
    }, gapTime);
    // Save the time before the delay.
    mTimeBeforeDelay = System.currentTimeMillis();
}

@Override
protected void onPause() {
    super.onPause();
    mSplashHandler.removeCallbacksAndMessages(null);
}
new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                startActivity(intent);
                SplashScreenActivity.this.finish();
            }
        }, SPLASH_DURATION);