应用级别变量

本文关键字:变量 应用 | 更新日期: 2023-09-27 18:19:00

我需要在登录时存储一些信息,这些信息在应用程序的其他活动中可用。我尝试创建一个单独的类:

public class MyApp : Application
{
    private string siteID;
    public string getSite()
    {
        return siteID;
    }
    public void setSite(string s)
    {
        siteID = s;
    }
}

设置我的登录活动中的站点ID:

MyApp ma = new MyApp();
ma.setSite("IT-TEST");

然后在稍后的另一个活动中再次尝试获取值:

MyApp ma = new MyApp();
var site = ma.getSite();
Toast.MakeText(this, site, ToastLength.Long)
     .Show();

但是这部分总是返回空白。我错过了什么?

应用级别变量

问题是每次都实例化一个MyApp的实例,因此那里没有数据持久性。在应用程序中共享数据的方法有很多,但这里有几种方法你可以使用。

存储简单键/值对的一个好方法是使用Android内置的首选项系统。在Activity中你可以做:

var settings = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext);
var editor = settings.Edit();
editor.PutString("key", "value");
editor.Commit();
var value = settings.GetString("key", null);

另一种方法是子类化Application,它将在整个应用程序中充当全局应用程序类:

[Application]
public class MyApplication : Application
{
    public static string StaticString { get; set; }
    public string InstanceString { get; set; }
    public MyApplication(IntPtr handle, JniHandleOwnership transfer)
        : base(handle, transfer)
    {
    }
}

按照设计,在整个应用程序中将有一个该类的实例运行。从Activity中,你可以通过将Activity的Application属性强制转换为你的自定义类来访问该类上的实例数据:

var instanceValue = ((MyApplication) Application).InstanceString;

或者你也可以在类上使用静态属性,如果这更适合你的情况:

var staticValue = MyApplication.StaticString;

因为您创建了一个新实例,其中站点为空。你需要存储"MyApp"对象的第一个实例来获取站点。

你试过使类静态化吗?

正如这个(相关)问题的答案中所述,子类化应用程序类在所有情况下都不会有帮助,因为在重新激活(从后台)后将创建一个新的实例,其中变量将为空,而不是您保存的状态。

所以像在给定的首选项解决方案中保存状态是一个很好的解决方案。