学习编程必须要了解您所使用的编程工具的代码结构和运行机制。您所编写的程序编译后从哪个例程启动,启动后各例程运行的先后顺序是怎样的,这就是我们需要了解的程序流程,简称程序流。
我们新建B4X项目时,IDE会为我们提供一个项目模板,模板包含必需的模块,各模块包含必需的例程(有的模块是空的代码块)。各例程的功能是什么,我们需要码入什么类型的代码?详见下面的总结笔记:
B4X有四个组件(平台),各组件有各组件的IDE。由于各组件的应用方向不同,因此其程序流也有所不同。
一、B4A程序流
新建一个B4A项目时,我们将得到一个模板,如下图:
该模板包含2个模块:Main主模块和Starter服务模块。上面是Main主模块的截图,Starter服务模块的截图如下:
模板中包含了项目运行所需的基本例程,B4A的程序流如下:
1、Main Process_Globals
这是主模块的Process_Globals 例程。
在这里声明主模块的所有私有变量和对象。
如果没有使用Starter服务,则所有公共变量也在这里声明。
2、Starter Sevice Process_Globals
如果Starter服务存在,则会运行该服务。
在这里声明所有的公共变量和对象,如SQL、位图等。
3、其它 Process_Globals
其它活动或模块的Process_Globals 例程,这个模块可以是您在项目中添加的 Activity、B4xPage、代码模块、自定义类模块等模块。
在这里为给定的模块声明所有的私有变量和对象。
4、Starter Service Service_Create
如果Starter服务存在,则会运行该服务。
在这里初始化所有的公共变量和对象,如SQL,位图等。
5、Starter Sevice Service_Start
如果Starter服务存在,则会运行该服务。
可以把这个例程留空。
6、Globals
在这里为给定的 Activity 声明所有私有变量。
7、Sub Activity_Create
创建Activity活动时运行此例程。
在这里加载布局并初始化由代码添加的活动对象。
8、Activity_Resume
每次活动更改其状态时,都会运行此例程。
在这里编写Activity状态更改时需要运行的代码。
9、Activity_Pause
此例程在 Activity 暂停时运行,例如方向更改,启动另一个 Activity 等。
在这里编写Activity 暂停时需要运行的代码。
二、B4J程序流
新建一个B4J项目时,我们将得到一个模板,如下图:
这是一个B4Xpages项目。
B4J中的程序流比B4A中的程序流要简单得多。B4J的程序流如下:
1、Main Process_Globals
这是主模块的Process_Globals 例程。
在这里声明所有的公共变量以及主模块的所有私有变量和对象。
2、其它模块的 Process_Globals
其它模块的Process_Globals 例程,这个模块可以是您在项目中添加的B4xPage、代码模块、自定义类模块等模块。
在这里为给定的模块声明所有的私有变量和对象。
3、 Main AppStart
这是主模块的Main AppStart 例程。
在这里为项目指定主窗体或加载布局文件,如果是B4xPages项目,则一般在B4XMainPage页面的B4XPage_Created例程中加载布局文件。
4、Main MainForm_Resize
这是主模块的MainForm_Resize 例程。
如果要在用户调整窗体大小时调整窗体上的各节点,则必须添加 Resize 例程。
在这里写调整窗体大小时,调整窗体上各节点控件的位置和大小的代码。
如果在设计器中使用锚点,则在大多数情况下都不需要使用此例程。
三、B4i程序流(翻译自B4X语言手册,无改动)
B4i中的程序流比B4A中的程序流要简单得多。
当我们运行一个项目时,会得到下面的模板:
Sub Process_Globals
'这些全局变量会在应用程序启动时声明一次。
'可以从所有模块中访问全局变量。
Public App As Application
Public NavControl As NavigationController
Private Page1 As Page
End Sub
Private Sub Application_Start (Nav As NavigationController)
'SetDebugAutoFlushLogs(True) '如果程序在输出所有日志之前崩溃,请取消注释。
NavControl = Nav
Page1.Initialize("Page1")
Page1.Title = "Page 1"
Page1.RootPanel.Color = Colors.White
NavControl.ShowPage(Page1)
End Sub
Private Sub Page1_Resize(Width As Int, Height As Int)
End Sub
Private Sub Application_Background
End Sub
当您启动程序时,例程将按照上面的顺序执行。
请注意,在Application_Start例程中,Page1的尺寸是未知的,它们只在Page1_Resize例程中的宽度和高度参数中被指定。
如果您想调整视图,您必须在此处进行。
四、B4R程序流(翻译自B4X语言手册,无改动)
B4R中的程序流是直截了当的。
当我们运行一个项目时,会得到下面的代码模板:
Sub Process_Globals
'这些全局变量会在应用程序启动时声明一次。
'可以从所有模块中访问全局变量。
Public Serial1 As Serial
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Log("AppStart")
End Sub
当您运行程序时,先执行Process_Globals例程,然后再执行AppStart。
五、备注:
1、Process_Globals 例程和Globals例程是用来声明变量或对象的,不能编写任何其它代码。
2、B4A中Starter服务的Process_Globals 例程是声明所有公共变量的最佳位置。 SQL对象、从文件读取的数据、多个活动使用的位图以及多模块使用的变量等都应该在此位置声明,在service_crere例程中初始化。如果项目没有使用Starter服务或非B4A项目,则声明这些变量的最佳位置是Main模块的Process_Globals 例程。
3、在B4A中,所有视图都不能声明为公共变量。
4、项目编译发行时,starter 服务应当从已编译的库中排除。 默认情况下,它的 #ExcludeFromLibrary 属性在服务属性区域中设置为 True。