Xamarin.Forms依赖关系服务非静态字段/属性

时间:2018-12-10 09:34:14

标签: c# android xamarin.forms xamarin.android cross-platform

我正在使用Dependency Service获取特定于平台的接口实现。 假设我有以下界面:

public interface IMyInterface
{
    bool IsEnabled { get; set; }
}

还有我的Android项目中的实现类:

[assembly: Dependency(typeof(MyClass))]
namespace App.Droid
{
    class MyClass : IMyInterface
    {
        public bool IsEnabled { get; set; }
    }
} 

在代码中的某个时刻,我将IsEnabled设置为true

然后,我开始一个新活动,使我的应用程序进入后台:

Intent intent = new Intent();
intent.SetAction(action);
intent.SetFlags(ActivityFlags.NewTask);

MainActivity.Instance.StartActivity(intent);

当我的应用返回到前台时,我访问属性IsEnabled并得到false而不是true。实际上,这是影响类的每个属性和私有字段发生的情况。当我离开应用程序进行新活动时,这些属性会被垃圾回收吗?

我发现解决此问题的唯一方法是使所有后备字段都为static,但这会增加代码的开销,如果我知道此行为的原因,这可能是不必要的。

1 个答案:

答案 0 :(得分:1)

不太了解您的问题的标题。

如果使用单例模式,则可以在需要时根据唯一的实例化对象提取属性。就像这样:

public class Singleton
    {
        // Define a static variable to hold an instance of the class
        private static Singleton uniqueInstance;

        // Define a private constructor so that the outside world cannot create instances of the class
        private Singleton()
        {
        }

        /// <summary>
        /// Define public methods to provide a global access point, and you can also define public properties to provide global access points
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            // Create if the instance of the class does not exist, otherwise return directly
            if (uniqueInstance == null)
            {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
    }

如果不是,则可以使用Propertieshttps://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.application.properties?view=xamarin-forms)to访问数据。就像这样:

private void SaveConnectionData(JSON.Connection C)
                    {
                        App.Current.Properties[Cryptography.Encryption("AccessToken")] = Cryptography.Encryption(C.Access_token);
                        App.Current.Properties[Cryptography.Encryption("ExpiresIn")] = Cryptography.Encryption(C.Expires_in.ToString());
                        App.Current.Properties[Cryptography.Encryption("TokenType")] = Cryptography.Encryption(C.Token_type);
                        App.Current.Properties[Cryptography.Encryption("Scope")] = Cryptography.Encryption(JsonConvert.SerializeObject(C.Scope));
                        App.Current.Properties[Cryptography.Encryption("RefreshToken")] = Cryptography.Encryption(C.Refresh_token);
                        App.Current.SavePropertiesAsync();
                    }

您可能参与了lifecyclesnotifications的使用。此外,如果有大量数据,请考虑使用SQLite数据库保存此数据。可以参考链接here

更多:在Xamarin.Android中,您也可以尝试lifecycles来显示保存的数据。类似于OnResume方法来显示数据。