我有一个棘手的情况,只出现在移动设备,而不是模拟器,所以我需要一些专家帮助进行故障排除 . 这就像stateMachine在显示我的“FirstTimeSetup”表单后简要地将我带回SplashScreen(或做了一些奇怪的后转换) .
这是我的设置:我使用GUIBuilder构建应用程序,其形式为 SplashScreen ,将首先显示,然后在processBackground中发生某些网络连接后自动转换为表单 Main .
这工作正常,但在第一次开始时,(当没有设置首选项时)我想显示一个不同的形式: FirstTimeSetup . 我能看到这样做的最好方法如下:
1)在processBackground中,如果它是第一次运行则立即返回false,这样它就不会转换为Main .
protected boolean processBackground(Form f) {
if ("SplashScreen".equals(f.getName())) {
if (Preferences.get(PREFS_FIRST_TIME_SETUP,true)){
//return false to indicate that we should not proceed to next_form specified in property
//we do this because postSplashScreen will trigger the load of the "FirstTimeSetup" form
return false;
}
//...continue with normal app initialization if this is not the first time
2)在postSplashScreen中,我再次检查它是否是第一次加载,然后禁用后退命令并将showForm调用到First Time Setup表单 .
@Override
protected void postSplashScreen(Form f) {
if (Preferences.get(PREFS_FIRST_TIME_SETUP, true)) {
//disable back command for this form
setBackCommandEnabled(false);
showForm("FirstTimeSetup", null);
}
}
3)在postFirstTimeSetup方法中,我显示一些对话框来解释用户的下一步,做一些网络检查以确保我们可以继续注册,然后结束方法,这样用户就可以与对话框进行交互并注册 . 就在这时,在iOS或Android设备上,我看到SplashScreen的幻灯片转换,然后立即重新显示FirstTimeSetup表单,并且在用户能够与表单交互之前执行此操作两次 .
4)有时(它不一致),postFirstTimeSetup方法将再次执行(提示用户的相同对话框再次显示!) .
感觉就像我从processBackground返回false并且postSplashScreen方法已经完成后,一些SplashScreen自动转换仍在尝试执行...任何建议都有助于消除这种奇怪的双重转换!
UPDATE: 随着进一步调整和调查我意识到这似乎是由Android权限对话框引起的,这就是为什么它只在最初安装应用程序时发生 .
在processBackground中,我进行第一次网络调用(提示网络使用权限对话框)并访问设备参数IMEI和UUID以获取设备标识符(提示“允许访问电话”权限) . 在关闭每个对话框后,SplashScreen表单似乎重新进入,导致重新显示带有过渡动画的表单(我想还要重新运行processBackground!重新执行所有的初始屏幕初始化工作!) .
So here's the updated question: 如何获取Android权限对话框以阻止SpashScreen重新加载?
我已经尝试将触发的命令移动到initVars,但随后我在空白屏幕上获得权限对话框,然后启动屏幕快速转换两次,就像我在此视频中分享的一样:youtu.be/2QpdaeigNZ8
我已经尝试在callSerially()中包装两个“触发器”(导致权限的命令),这样它会延迟对话框,直到至少显示SplashScreen表单,然后显示表单,并显示权限对话框,单击“允许”,然后再次显示splashScreen表单,然后弹出第二个权限对话框 . 我时钟允许然后再重新显示splashScreen .
1 回答
解决方案是在
processBackground()
中执行您的逻辑并删除postSplashScreen
,然后在此方法结束时返回false .然后在
FirstTimeSetup
表单的postShow()
(即postFirstTimeSetup()
方法)中,记得将PREFS_FIRST_TIME_SETUP
设置为false
.