You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的引用,容易造成内存泄漏,要谨慎使用。

3. SharedPreferences(持久化全局变量方案)

如果你的全局变量需要持久化保存(比如用户登录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:41:05