我需要在登录时存储一些可用于应用程序中其他活动的信息。我试过创建一个单独的类:
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();
但这部分总是返回空白。我错过了什么?
答案 0 :(得分:5)
问题是你每次都要实例化一个MyApp
的实例,所以那里没有数据持久性。有很多方法可以在应用程序中共享数据,但是您可以使用几种方法。
存储简单键/值对的一个好方法是使用Android的内置首选项系统。在您可以执行的活动中:
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中,您可以通过将活动的Application属性强制转换为自定义类来访问类上的实例数据:
var instanceValue = ((MyApplication) Application).InstanceString;
或者你可以在类上使用静态属性,如果这对你的情况更好:
var staticValue = MyApplication.StaticString;
答案 1 :(得分:0)
因为您已经创建了一个新实例,其中该网站为null。您需要存储“MyApp”对象的第一个实例才能恢复该网站。
答案 2 :(得分:0)
你试过让这个课静止吗?
答案 3 :(得分:0)
如this (related) question的答案中所述,继承应用程序类将无助于所有情况,因为在重新激活(从后台)后将创建一个新实例,其中变量将为null而不是你保存的状态。
因此,在给定的偏好解决方案中保存状态是一个很好的解决方案。