【问题标题】:Android app opens after a few seconds after pressing home button during splash screen在启动画面期间按下主页按钮后,Android 应用程序会在几秒钟后打开
【发布时间】:2017-09-21 18:19:11
【问题描述】:

我遇到了一个我似乎无法找出原因的问题。

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

感谢任何有关为什么会发生这种情况的帮助!

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

`public class SplashScreenActivity extends AppCompatActivity {

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

    Thread myThread = new Thread(){
        @Override
        public void run() {
            try {
                sleep(2500);
                Intent intent = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(intent);
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    myThread.start();` 

这是清单

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

<uses-permission android:name="android.permission.VIBRATE" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".activities.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:launchMode = "singleInstance">
    </activity>
    <activity android:name=".activities.SplashScreenActivity"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".alert.BroadCaster" >
    </receiver>
    <service android:name=".timer.TimerService"
        android:process=":timerservice" />
</application>

【问题讨论】:

标签: java android android-intent android-activity splash-screen


【解决方案1】:

你需要实现onStop()方法,只有当你想节省数据和内存。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的评论!我之前尝试过使用处理程序,但它并没有解决我遇到的问题。
    【解决方案3】:

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多