Firebase 重新启动服务/设备后SharedReferences为空

Firebase 重新启动服务/设备后SharedReferences为空,firebase,service,xamarin.android,sharedpreferences,firebase-cloud-messaging,Firebase,Service,Xamarin.android,Sharedpreferences,Firebase Cloud Messaging,当我使用Google Firebase进行推送通知时,我想将实例令牌保存到SharedReferences。不幸的是,每当令牌刷新并希望从SharedReferences检查上一个令牌时,它们都是空的 是因为我在这里使用服务吗 public class MyFirebaseIIDService : FirebaseInstanceIdService { public override void OnTokenRefresh() { var sharedPrefer

当我使用Google Firebase进行推送通知时,我想将实例令牌保存到
SharedReferences
。不幸的是,每当令牌刷新并希望从
SharedReferences
检查上一个令牌时,它们都是空的

是因为我在这里使用
服务吗

public class MyFirebaseIIDService : FirebaseInstanceIdService
{
    public override void OnTokenRefresh()
    {
        var sharedPreferences = PreferenceManager.GetDefaultSharedPreferences(this);
        var sharedPreferencesEditor = sharedPreferences.Edit();

        // Get Firebase Instance Token
        var refreshedToken = FirebaseInstanceId.Instance.Token;

        // Check if a Firebase Instance Token has been registered before and unregister it
        var oldToken = sharedPreferences.GetString("FirebaseInstanceToken", null);

        if (oldToken != null) // is ALWAYS null :(
        {
            // Unregister old token...
        }

        // Save the Firebase Instance Token locally
        sharedPreferencesEditor.PutString("FirebaseInstanceToken", refreshedToken);
        sharedPreferencesEditor.Apply();

        // At this point, the SharedPreferences have to token saved.
        // Next time, the app reaches this point, it is gone... 
    }
}

很抱歉语法混乱,我使用Xamarin,所以这是C#,但它不会有任何区别。

我不知道它在Xamarin中如何工作,但在本机android GetSharedReferences中,来自服务上下文的引用可能是错误的。打开共享首选项时,应仅使用applicationContext或MODE_MULTI_进程

你们可以看到类似的问题

Xamarin和C#在打开某个文件时也有这种模式,所以我认为与首选项完全相同。尝试以下方法,而不是使用GetDefaultSharedReferences:

ISharedPreferences prefs = Application.Context.GetSharedPreferences ("PREF_NAME", FileCreationMode.MultiProcess);

您是否卸载应用程序以刷新令牌?如果是,我认为您无法获得旧令牌,因为卸载应用程序时,
SharedReferences
被清除

我已尝试使用java代码保存令牌:

public void onTokenRefresh() {
        // Get updated InstanceID token.

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d("Mike", "Refreshed token: " + refreshedToken);

        SharedPreferences mSharedPreferences = getSharedPreferences("hello",0);
        String oldToken = mSharedPreferences.getString("Token",null);

        if(oldToken == null)
        {
            Log.d("Mike", "oldToken: " + null);
        }

        SharedPreferences.Editor mEditor = mSharedPreferences.edit();
        mEditor.putString("Token", refreshedToken);
        mEditor.commit();

        // TODO: Implement this method to send any registration to your app's servers.
        //sendRegistrationToServer(refreshedToken);

    }
第一次安装应用程序时,您将获得令牌并将其保存在
SharedReferences
中,下次打开应用程序并在文本视图中显示旧令牌时,您可以发现您的令牌已保存,并且不卸载应用程序:

    TextView tv1 = (TextView)findViewById(R.id.tv1);
    SharedPreferences mSharedPreferences = getSharedPreferences("hello",0);
    String oldToken = mSharedPreferences.getString("Token",null);
    tv1.setText(oldToken);

它起作用了。但是当你卸载你的应用程序时,
textview
显示为空。

我解决了这个问题,结果证明,我的代码工作正常,但在我的测试设备上表现异常

重新构建应用程序后,
SharedReferences
已被清除,尽管我在Visual Studio中选中了在部署之间在设备上保留应用程序数据/缓存选项。这是因为我的物理测试设备是根植的,不接受这个选项


在无根设备上进行测试时,一切正常。

Xamarin是1:1 C#to Java映射,因此Java Android中存在的一切都存在于Xamarin中。不幸的是,您提出的解决方案没有达到目的。仍然为空,在应用程序重新启动后…是的,我确实卸载并重新安装应用程序以刷新令牌,但Visual Studio有一个在部署之间保留应用程序数据/cahce设备选项,我已激活该选项。但是:我解决了这个问题。我测试的物理设备是根设备,因此此选项不起作用。用一部没有插脚的手机试过,效果很好。