共享首选项数据在应用程序关闭时重置

时间:2014-04-17 11:06:59

标签: android sharedpreferences

在我的应用程序中,使用共享首选项将分数存储为整数 只要分数高于前一分,它就会存储分数。 (如果分数低于之前的分数,则不会存储。) 但是当我完全关闭应用程序(即)从任务管理器关闭并再次重新启动时,即使我当前的分数低于之前的分数,分数也会被新分数重置。

这里是代码:

SharedPreferences pref = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
if (mScr > tempScore) {
    Editor editor = pref.edit();
    editor.putInt("key_name", mScr);
    editor.commit();
}
tempScore = pref.getInt("key_name", 0);

任何人都可以说如何过来吗?

8 个答案:

答案 0 :(得分:3)

尝试使用以下代码

SharedPreferences pref =getSharedPreferences(PREF_NAME, MODE_PRIVATE);
tempScore = pref.getInt("key_name",0);
if(mScr>tempScore)
        {
            Editor editor = pref.edit();
        editor.putInt("key_name", mScr);
        editor.commit();
           }
        tempScore=pref.getInt("key_name",0);

说明:您在tempScore中持有以前的分数,这是一个静态变量。您还将以前的高分存储在共享首选项中。那么,为什么不读取共享首选项中的当前值并与prefs中的实际值进行比较,而不是使用先前修改过的变量。

在上面的代码中,我从prefs中检索了值并分配给tempScore变量。这将确保即使您强行关闭应用程序,您也会获得存储在首选项中的正确值以进行比较,从而满足您的条件。

答案 1 :(得分:2)

在if条件之前使用此行

tempScore = pref.getInt("key_name", 0);

我希望它能正常工作

答案 2 :(得分:0)

我不知道您存储和检索数据的方式是什么,但我很确定这种方式完美无缺:

保存:

private void savePreferences(int score) {
        SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        Editor editor = sharedPreferences.edit();
        editor.putInt("score", score);
        editor.commit();
    }

加载:

private void loadSavedPreferences() {
        SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        int score = sharedPreferences.getInt("score", 5); // 5 here is the default value when you get nothing 
        score_textview.setText(Integer.toString(score)); // if you want to set it for a TextView for example
    }

答案 3 :(得分:0)

问题在于您依赖静态字段来存储整数。您无法执行此操作,因为在应用程序进程被终止时将卸载该类。您需要在暂停Activity时将整数存储到共享首选项(或其他形式的持久存储),并在创建或恢复时检索它。

答案 4 :(得分:0)

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;    
public class SessionManager {
        // Shared Preferences
        SharedPreferences pref;

        // Editor for Shared preferences
        Editor editor;

        // Context
        Context _context;

        // Shared pref mode
        int PRIVATE_MODE = 0;

        // Sharedpref file name
        private static final String PREF_NAME = "Pref";


        // User name (make variable public to access from outside)
        public static final Int KEY_NAME = "mScr";


        // Constructor
        public SessionManager(Context context){
            this._context = context;
            pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
            editor = pref.edit();
        }

        public void ScoreStoring(Int mScr){

            // Storing name in pref
            editor.putInt(KEY_NAME, mScr);

            // commit changes
            editor.commit();
        }   
    }

为上面的代码保留一个类,只要你想在另一个活动中导入上面的代码

SessionManager session;
SharedPreferences pref =getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
tempScore=pref.getInt(KEY_NAME,0);
if(mScr>tempScore)
        {
            session.ScoreStoring(mScr);
           }

此sessionManager全局类保留您的值,直到您的应用程序卸载为止。

答案 5 :(得分:0)

  1. 原因:因为tempScore是静态的。当您重新启动时,tempScore变为0.因此mScr>tempScore将成为true并存储mScr
  2. 解决方案:要克服这一点。您可以使用自己的Application客户并在其tempScore方法
  3. 中阅读onCreate的偏好设置

答案 6 :(得分:0)

当您使用tempScore作为static时,会导致问题。

静态是流程的全局。因此,它们的值将持续到流程的生命周期,通常比单个活动实例长得多。

  

但是当我完全关闭应用程序(即)从任务管理器关闭时   再次重新启动分数即使我目前的新分数重置   得分低于前一个

当您这样做时,Task manager会终止您的申请流程。因此,您的静态变量会丢失其值。因此,下次再次启动应用程序时,您将获得该静态变量的默认值。

在您的情况下,您将获得tempScore的值0,因为您正在使用int。因此,'if()'中的条件在这种情况下将成立。

我认为,编码的最佳实践之一是尽可能避免使用静态变量。还有一种方法可以在Android中使用从Application类扩展的类。

public class MyApplication extends Application {

     private int tempScore; 

     public int getTempScore() {
        return tempScore;
     }

     public void setTempScore(int tempScore) {
        this.tempScore = tempScore;
     } 
}

由于应用程序只有一个Application对象,因此您可以随时从应用程序中获取和设置自定义应用程序对象的变量,如下所示。

((MyApplication)getApplication()).setTempScore();
((MyApplication)getApplication()).getTempScore();

应用程序对象的生命周期贯穿整个应用程序的生命周期(以及您的自定义应用程序对象),并使用get()set()方法管理其数据成员,从而避免使用静态变量你的申请。

希望它对你有所帮助。

答案 7 :(得分:0)

tempScore=pref.getInt("key_name",0);
        if(mScr>tempScore)
        {
            Editor editor = pref.edit();
        editor.putInt("key_name", mScr);
        editor.commit();
        //tempScore=pref.getInt("key_name",0);
                }
        tempScore=pref.getInt("key_name",0);

这一个世界