重新启动服务/设备后,SharedPreferences为空

时间:2017-01-18 18:37:33

标签: firebase service xamarin.android sharedpreferences firebase-cloud-messaging

当我使用Google Firebase推送通知时,我想将实例令牌保存到SharedPreferences。不幸的是,每当令牌刷新并想要从SharedPreferences检查前一个令牌时,它们都是空的......

是因为我在这里使用Service吗?

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#但不应该有任何区别。

3 个答案:

答案 0 :(得分:0)

我不知道它在xamarin中是如何工作的,但是在服务上下文的本机android getSharedPreferences中可能是错误的。打开共享首选项时,您应该只使用applicationContext或MODE_MULTI_PROCESS。

您可以看到类似的问题here

当你打开一些文件时,Xamarin和C#也有这种模式,所以我认为与首选项完全相同。试试这样的,而不是使用GetDefaultSharedPreferences:

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

答案 1 :(得分:0)

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

我尝试过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);

    }

首次安装应用时,您将获得令牌并将其保存在SharedPreferences,下次打开应用并在文本视图中显示旧令牌,然后您就会发现您的令牌已保存,并且不要卸载您的应用程序:

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

有效。但是当您卸载应用时,textview显示为空。enter image description here

答案 2 :(得分:0)

我解决了问题,事实证明,我的代码工作正常但在我的测试设备上表现得很奇怪。

重新构建应用程序后,SharedPreferences已被清除,尽管我在Visual Studio中检查了部署选项之间的 Preserve应用程序数据/缓存。那是因为我的物理测试设备是 rooted ,并且不接受此选项。

尝试使用无根设备时,一切都按预期工作。