应用级别变量
本文关键字:变量 应用 | 更新日期: 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"对象的第一个实例来获取站点。
你试过使类静态化吗?
正如这个(相关)问题的答案中所述,子类化应用程序类在所有情况下都不会有帮助,因为在重新激活(从后台)后将创建一个新的实例,其中变量将为空,而不是您保存的状态。
所以像在给定的首选项解决方案中保存状态是一个很好的解决方案。