【问题标题】:Switch or Remove Splash Screen from MainActivity从 MainActivity 切换或删除启动画面
【发布时间】:2020-04-09 03:48:26
【问题描述】:

我有一个 MainActivity 在某些设备上冷启动时间很长,所以我想使用启动屏幕并从我的 MainActivity 上的一个函数触发它来完成。

我使用我的 SplashActivity 作为启动器,然后加载我的 MainActivity。这在我在 SplashActivity 中设置时有效,但我的 SplashActivity 突然结束并且在冷启动时仍然出现空白屏幕,然后启动应用程序主循环。

下面的代码很快结束了初始屏幕并运行 MainActivity 仍然带有长时间的冷启动空白屏幕。

我知道这也适用于超时/计时器,正如我在大多数答案中看到的那样,但我想通过使用函数或一旦我的 NativeActivity 主循环开始在我的 MainActivity 中触发它。我正在使用 JNI 从 C++ 调用 java 函数。

编辑:我还找到了在 MainActivity 中使用片段的替代解决方案,但不知道从哪里开始,因为作者没有在这里详细分享解决方案:

https://stackoverflow.com/a/44444946/11736918

public class SplashActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

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


我的 MainActivity 只是加载了另一个 Native .so 库。

public class MainActivity extends NativeActivity {

    static {
        System.loadLibrary("MyLib");    
    }

    public void RemoveSplash() {
      // Ideally I will use this to trigger it from my C++ code using JNI.
    }


}

这是我的 AndroidManifest.xml

        <activity android:name=".MainActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboardHidden"
                android:screenOrientation="landscape">
            <!-- Tell NativeActivity the name of or .so -->
            <meta-data android:name="android.app.lib_name"
                    android:value="native-activity" />
        </activity>

        <activity android:name=".SplashActivity"
                    android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>    

【问题讨论】:

  • SplashActivity 的整个想法是展示它一段时间 2 秒让我们说.. 但是你只是启动MainActivity 没有任何延迟.. 关注How do I make a splash screen?跨度>
  • 因为您在启动时完成了启动活动。所以splash Activity会突然结束,MainActivity需要很长时间才能加载。使用 Thread 加载长动作。并 runOnUiThread 加载 MainActivity 屏幕。所以用户不会看到黑屏。
  • 使用 Handler 进行 Activity 更改延迟,就像最后的 new Handler.postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intent); finish(); } }, 400);
  • @ADM 谢谢我知道这一点,但只是为了展示我到目前为止所拥有的。我也已经读过,我不会使用计时器,因为冷启动取决于不同的设备。
  • @HacettepeHesabı 我已经知道结果了。如何使用 runOnUiThread?

标签: java android android-activity splash-screen


【解决方案1】:

像这样在启动时更改您的代码:

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

或者,您可以从清单中设置 MainActivity 的主题

<activity
        android:name=".MainActivity"
        android:theme="@style/SplashTheme">

SplashTheme 是

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorAccent</item>
    <item name="colorPrimaryDark">@color/colorAccent</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item 
       name="android:windowBackground">@drawable/img_app_splash_screen</item>
</style>

然后,在super.onCreate() 之前调用你的函数 当你的功能完成后,拨打setTheme(R.style.AppTheme), 然后拨打super.onCreate()setContentView(R.layout.activity_main)

不需要SplashActivity

【讨论】:

  • 谢谢,但我不想使用延迟或计时器,因为它违背了我想要完成的目的,我想通过函数在特定条件下手动触发它。
  • 还有,函数在哪里?
  • 查看我添加 MainActivity 的更新帖子。显然,这就是我被困在里面使用什么的地方。理想情况下,这应该结束启动并显示 MainActivity 已经加载并运行。
  • 谢谢,这可行,将尝试第二个选项。
  • 你能写出例子中的java部分或者sn-p代码吗?这有点令人困惑,不知道将它们放在哪里。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多