在 B4A (Basic4Android) 中,Process_Globals 和 Globals 这两个过程虽然都用于声明全局变量,但它们的作用域、生命周期和用途有本质区别。以下是详细对比:
1. Process_Globals
| 特性 | 说明 |
|---|---|
| 作用域 | 整个应用程序(所有 Activity、Service、模块共享) |
| 生命周期 | 进程级别 :变量在应用进程启动时初始化,进程销毁时才释放 |
| 触发时机 | 应用进程启动时执行一次(所有代码模块都会执行自己的 Process_Globals) |
| 典型用途 | 全局配置、数据库连接、网络客户端、用户登录状态等需要跨 Activity 持久存在的变量 |
示例:
b4a
Sub Process_Globals
' 所有 Activity 都能访问
Public AppName As String = "MyApp"
Public SQL1 As SQL
Public HttpJob As HttpJob
End Sub
2. Globals
| 特性 | 说明 |
|---|---|
| 作用域 | 仅限当前 Activity 或 Service |
| 生命周期 | Activity 级别:每次 Activity 创建时初始化,Activity 销毁时变量释放 |
| 触发机制 | 每次 Activity 的 Create 事件执行前自动调用 |
| 典型用途 | 当前界面的控件引用、界面状态变量、临时数据 |
示例:
b4a
Sub Globals
' 这些变量每次 Activity 创建时重新初始化
Dim EditText1 As EditText
Dim Button1 As Button
Private CurrentScore As Int = 0
Private IsFirstLoad As Boolean = True
End Sub
3. 关键区别对比表
| 对比维度 | Process_Globals |
Globals |
|---|---|---|
| 初始化时机 | 应用进程启动时 | 每次 Activity 创建时 |
| 销毁时机 | 进程终止时 | Activity 销毁时 |
| 跨 Activity 共享 | ? 是(所有 Activity 可见) | ? 否(仅当前 Activity) |
| 常用变量类型 | 长期对象(SQL、HttpJob、File) | UI 控件、界面状态变量 |
| 内存释放 | 进程结束前常驻内存 | Activity 销毁后即可回收 |
| 典型声明位置 | Process_Globals 子程序内 |
Globals 子程序内 |
| 访问修饰限制 | 无特殊限制(通常用 Public) | 当前模块内部(常用 Private) |
4. 实际开发中的注意事项
b4a
' ? 正确用法:跨 Activity 共享的变量放在 Process_Globals
Sub Process_Globals
Public CurrentUser As User
Public DB As DatabaseManager
End Sub
' ? 正确用法:当前界面的控件放在 Globals
Sub Globals
Private lblTitle As Label
Private btnSubmit As Button
Private CurrentItemIndex As Int
End Sub
' ? 错误用法:将 UI 控件或 Activity 相关变量放在 Process_Globals
' (会导致 Activity 销毁后控件引用仍然存在,可能引发内存泄漏)
5. 总结
Process_Globals= 应用全局变量(进程级,跨所有模块)Globals= 当前模块变量(Activity 级别,仅当前界面)
选择原则:
- 需要跨多个 Activity/Service 共享的状态 →
Process_Globals - 仅当前界面需要的临时变量、UI 控件引用 →
Globals
?? 一个重要提示 :Process_Globals 中的变量会一直占用内存直到进程结束,所以不要滥用。只有确实需要全局共享的变量才放在那里。