当我写这个问题并准备发布它时,我偶然发现了 setKeepOnScreenCondition 方法(如下),该方法属于我们必须在主要活动的 onCreate 上安装的启动屏幕。我认为不发布此内容似乎很浪费,因为没有关于此主题的其他帖子,也没有对其他相关问题的类似答案(截至 2022 年 1 月)。
SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
splashScreen.setKeepOnScreenCondition(....);
经过检查,我发现这个方法接收了一个实例SplashScreen.KeepOnScreenCondition()其实现必须提供以下方法签名实现的接口:
public boolean shouldKeepOnScreen()
看起来这个方法将被启动屏幕调用并保留启动屏幕可见直到它返回 false。这就是我如此热爱编程的灵光一现的时刻。
如果我使用初始化为 true 的布尔值,并在延迟后将其设置为 false 会怎样?事实证明,这种预感是有效的。这是我的解决方案。它似乎有效,我认为它对其他人有用。据推测,除了使用处理程序进行延迟之外,还可以在某个进程完成后使用它来设置布尔值。
package com.example.mystuff.myactivity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.splashscreen.SplashScreen;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends AppCompatActivity {
private boolean keep = true;
private final int DELAY = 1250;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Handle the splash screen transition.
SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
super.onCreate(savedInstanceState);
//Keep returning false to Should Keep On Screen until ready to begin.
splashScreen.setKeepOnScreenCondition(new SplashScreen.KeepOnScreenCondition() {
@Override
public boolean shouldKeepOnScreen() {
return keep;
}
});
Handler handler = new Handler();
handler.postDelayed(runner, DELAY);
}
/**Will cause a second process to run on the main thread**/
private final Runnable runner = new Runnable() {
@Override
public void run() {
keep = false;
}
};
}
如果您热衷于 Java Lambda,一个更好、更紧凑的解决方案如下:
package com.example.mystuff.myactivity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.splashscreen.SplashScreen;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends AppCompatActivity {
private boolean keep = true;
private final int DELAY = 1250;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Handle the splash screen transition.
SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Keep returning false to Should Keep On Screen until ready to begin.
splashScreen.setKeepOnScreenCondition(() -> keep);
Handler handler = new Handler();
handler.postDelayed(() -> keep = false, DELAY);;
}
}
如果您有意见或反馈(除了告诉我我不应该增加启动屏幕的持续时间),或者更好的方法,请发表评论或回复其他答案。