【问题标题】:How to make MainActivity ready before SplashActivity finish?如何在 SplashActivity 完成之前使 MainActivity 准备好?
【发布时间】:2019-02-27 03:45:19
【问题描述】:

我想让我的启动画面更流畅。阅读此link 后,我制作了启动画面。但是,当我完成 SplashActivity 并意图进入 MainActivity 时,我觉得 SplashActivity 完成得太早了,我在 MainActivity 显示之前看到了我的设备的屏幕保护程序(我估计延迟为 0.5s)。我想要的是在 SplashActivity 完成之前准备好 MainActivity。

我尝试了在 Intent 中设置标志 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 的解决方案,但它并不顺利。

下面是两个activity之间的转换代码:

private void transitionActivity() {
        Intent intent = new Intent(SplashActivity.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }

和清单文件:

<activity
            android:name=".SplashActivity"
            android:launchMode="singleTask"
            android:theme="@style/SplashScreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity
            android:name=".MainActivity"
            android:launchMode="singleTask"
            android:theme="@style/AppThemeNoActionBar" />

【问题讨论】:

  • 准备好 MainActivity 是什么意思?
  • 如果你在主Activity中加载信息,必须在splash中加载,获取后主Activity才能加载该信息。或者,如果您愿意,您可以使用加载对话框来加载异步数据。
  • @KiranMalvi 我想要 MainActivity 的内容视图准备好;因为我希望当我完成 SplashActivity 时,我会看到 MainActivity 而不是我设备的屏幕保护程序(可能是太早完成的原因)。 MainActivity 的内容视图是一个登录表单。
  • @GilbertoIbarra MainActivity 是一个登录表单,所以我不加载任何东西,我只想在完成 SplashActivity 时看到 MainActivity 而不是设备的屏幕保护程序。我知道我看到屏幕保护程序的原因,是因为过早完成 SplashActivity。
  • 如果你什么都不加载,问题可能是其他的,也许你的 xml 中有一个大的位图,另一方面,也许你只有一个慢的手机,idk。

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


【解决方案1】:

首先,我要感谢所有回答我以及评论我的问题的人。 @MOF(answer link)有一个答案,它并没有解决问题,但它帮助我想到了一个新的方法,这个新的方法让我的问题不再存在。我的方法是:

Intent intent = new Intent(SplashActivity.this, MainActivity.class);
        startActivity(intent);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                finish();
            }
        }, getResources().getInteger(android.R.integer.config_mediumAnimTime));

谢谢大家!

【讨论】:

    【解决方案2】:

    也许他想延迟启动画面

    如果是这样,您可以使用 Handler() 来做到这一点

    int SplashDuration = 2000;
    new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent i = new Intent(splashScreen.this, MainActivity.class);
                        startActivity(i);
                        finish();
                    }
    
                }, SplashDuration);
    

    如果对您来说还是快或慢,您可以在“SplashDuration”处更改时间

    【讨论】:

    • 您的解决方案不能解决我的问题,但它可以帮助我想出解决问题的方法。 Runnable 中的'run' 函数,我保留'finish ()' 并将其余部分从Runnable 中取出。类型为:startActivity(intent);新的处理程序()。延迟后(...);那么,现在,您能否更新您的答案,以便我为您投票?
    【解决方案3】:

    你可以使用https://developer.android.com/reference/android/os/AsyncTask.html 来做这件事。 在启动画面直到 5 秒时进行逻辑,在 4 秒或以下时调用您的主要活动。

    【讨论】:

    • 你的意思是我应该在 SplashActivity 中有一个 AsyncTask,它运行到 5 秒。 4 秒后,我运行代码 startActivity(intent)?
    • 我试过了,没有任何变化。不过,我想和你说声谢谢,谢谢你的回答。
    猜你喜欢
    • 2011-05-06
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多