Xamarin Android开发:如何设置及获取可跨Activity使用的全局变量?
在Xamarin Android开发中,要实现能在所有Activity间共享的全局变量,有几种实用方案,我帮你逐一梳理清楚:
1. 自定义Application类(最推荐的全局上下文方案)
Application类是整个App的全局入口,生命周期和App完全一致,用来存全局变量再合适不过。
设置步骤:
- 首先创建一个继承自
Application的自定义类,在里面定义你的全局属性:
using Android.App; using System; namespace YourAppNamespace { [Application] public class MyApp : Application { // 定义全局变量,比如用户名称 public string GlobalUserName { get; set; } // 可以加更多全局属性,比如用户ID、主题设置等 public int CurrentUserId { get; set; } public MyApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { } public override void OnCreate() { base.OnCreate(); // 这里可以初始化全局变量的默认值 GlobalUserName = "Guest"; CurrentUserId = 0; } } }
- 接下来在
AndroidManifest.xml中注册这个自定义Application(如果用[Application]特性,VS会自动帮你注册,不过可以检查一下确保配置正确):
<application android:name=".MyApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" ...> <!-- 其他Activity、权限等配置 --> </application>
获取全局变量:
在任何Activity里,通过Application.Context转换成你的自定义类实例,就能访问全局变量了:
// 设置全局变量 var myApp = (MyApp)Application.Context; myApp.GlobalUserName = "张三"; myApp.CurrentUserId = 1001; // 获取全局变量 var userName = myApp.GlobalUserName; var userId = myApp.CurrentUserId;
2. 静态类(简单直接的轻量方案)
如果只是存一些简单的、不需要和App生命周期强绑定的变量,静态类是最省事的选择。
设置和使用:
创建一个静态类,里面定义静态属性:
namespace YourAppNamespace { public static class GlobalData { // 静态属性作为全局变量 public static string AppVersion { get; set; } = "1.0.0"; public static bool IsDarkMode { get; set; } = false; } }
在任何Activity里直接访问,不需要实例化:
// 设置 GlobalData.IsDarkMode = true; GlobalData.AppVersion = "1.0.1"; // 获取 var isDark = GlobalData.IsDarkMode; var version = GlobalData.AppVersion;
⚠️ 注意:静态变量的生命周期是整个App进程,一旦App被系统回收,变量就会丢失。另外如果静态属性持有Activity或Context的引用,容易造成内存泄漏,要谨慎使用。
如果你的全局变量需要持久化保存(比如用户登录token、记住的账号、应用设置),那SharedPreferences是最佳选择,即使App重启或手机重启,数据依然存在。
设置变量:
// 获取默认的SharedPreferences实例 var prefs = PreferenceManager.GetDefaultSharedPreferences(this); // 获取编辑器 var editor = prefs.Edit(); // 存入字符串类型的变量 editor.PutString("UserToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."); // 存入布尔类型 editor.PutBoolean("RememberLogin", true); // 存入整数类型 editor.PutInt("FontSize", 16); // 提交保存(Apply是异步提交,Commit是同步提交,推荐用Apply) editor.Apply();
获取变量:
var prefs = PreferenceManager.GetDefaultSharedPreferences(this); // 获取时可以指定默认值(如果key不存在就返回默认值) var token = prefs.GetString("UserToken", string.Empty); var rememberLogin = prefs.GetBoolean("RememberLogin", false); var fontSize = prefs.GetInt("FontSize", 14);
4. 依赖注入(大型项目架构化方案)
如果你的项目比较复杂,遵循MVVM或其他架构模式,用依赖注入(DI)来管理全局状态会更规范,也便于测试和解耦。比如用Autofac、Prism或者Xamarin自带的DI容器。
举个简单例子,用Xamarin的DI容器实现:
- 首先定义一个全局状态接口和实现类:
public interface IAppState { string CurrentUser { get; set; } bool IsLoggedIn { get; set; } } public class AppState : IAppState { public string CurrentUser { get; set; } public bool IsLoggedIn { get; set; } }
- 在App启动时注册为单例:
// 在自定义Application的OnCreate方法里或者App入口处注册 var services = new ServiceCollection(); services.AddSingleton<IAppState, AppState>(); var serviceProvider = services.BuildServiceProvider();
- 在Activity里获取使用:
var appState = serviceProvider.GetService<IAppState>(); appState.IsLoggedIn = true; appState.CurrentUser = "李四"; // 获取状态 var isLoggedIn = appState.IsLoggedIn;
内容的提问来源于stack exchange,提问作者user2256870
相关产品推荐
相关产品推荐

