【问题标题】:How To Keep SharedPreferences Values When Android App Killed如何在 Android 应用程序被杀时保留 SharedPreferences 值
【发布时间】:2019-07-10 08:21:40
【问题描述】:

我正在做一个安卓项目。我想在 android 应用程序被杀死时推送通知。所以,我正在创建 BroadcastReceiver 和 Service 类。他们在工作。但是,我有一个问题。

这个问题是,当用户登录我的应用程序时;我用 SharedPreferences 来存储这个值。但是,当我杀死应用程序时,这个 SharedPreferences 取“null”值。

java.lang.NullPointerException:尝试调用接口方法 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' 在空对象引用上

当我搜索时,人们说:“editor.clear();”但它不起作用。我能做什么?

我的登录类:

public static SharedPreferences UserDetailsSP,

UserDetailsSP = getSharedPreferences("UserDetails", MODE_PRIVATE);
SharedPreferences.Editor UserDetailsPreferencessEdit = UserDetailsSP .edit();
UserDetailsPreferencessEdit.clear();
UserDetailsPreferencessEdit.putString("UserName", A);
UserDetailsPreferencessEdit.commit();

我用这个调用其他java类:

String a1 = Login.UserDetailsSP.getString("UserName","A");

【问题讨论】:

  • 您的登录课程是活动的吗?否则你需要传递上下文来创建 SharedPreference obj。
  • @ZarNiMyoSettWin 是的,登录是活动;调用 java 类不仅仅是 java 类的活动。

标签: java android sharedpreferences shared


【解决方案1】:

你可以像这样创建一个共享偏好类:-

    public class AppPrefrences {

            private static SharedPreferences mPrefs;
            private static SharedPreferences.Editor mPrefsEditor;

            public static boolean isUserLoggedOut(Context ctx) {
                mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
                return mPrefs.getBoolean("id_logged_in", true);
            }

            public static void setUserLoggedOut(Context ctx, Boolean value) {
                mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
                mPrefsEditor = mPrefs.edit();
                mPrefsEditor.putBoolean("id_logged_in", value);
                mPrefsEditor.commit();
            }

    public static String getUserName(Context ctx) {
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            return mPrefs.getString("userName", "");
        }

        public static void setUserName(Context ctx, String value) {
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            mPrefsEditor = mPrefs.edit();
            mPrefsEditor.putString("userName", value);
            mPrefsEditor.commit();
        }

public static void clearAllPreferences(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.clear();
        mPrefsEditor.commit();
    }
        }

当您登录您的应用程序时,然后设置如下值:-

setUserLoggedOut(YourActivity.class, false);

并像这样在启动屏幕上设置检查:-

if (isUserLoggedOut(StartActivity.this)) {
                    startActivity(new Intent(StartActivity.this, LoginActivity.class));
                    finish();
                } else {
                    startActivity(new Intent(StartActivity.this, MainActivity.class));
                    finish();
                }

【讨论】:

    【解决方案2】:
    You this approach create a SessionManager class
    public class AppPrefrences {
    
            private static SharedPreferences mPrefs;
            private static SharedPreferences.Editor mPrefsEditor;
    public AppPrefrences(Context context)
    {
        int PRIVATE_MODE = 0;
        pref = context.getSharedPreferences("UserDetails", PRIVATE_MODE);
        editor = pref.edit();
        editor.apply();
    }
    
            public static boolean isUserLoggedOut() {
    
                return mPrefs.getBoolean("id_logged_in", false);
            }
    
            public static void setUserLoggedOut(Boolean value) {
    
                mPrefsEditor.putBoolean("id_logged_in", value);
                mPrefsEditor.commit();
            }
    
    public static String getUserName() {
    
            return mPrefs.getString("userName", "");
        }
    
        public static void setUserName(String value) {
    
            mPrefsEditor.putString("userName", value);
            mPrefsEditor.commit();
        }
    
        public static void clearAllPreferences()
        {
    
           mPrefsEditor.clear();
           mPrefsEditor.commit();
       }
      }
    
    
    Inside your activity
    AppPrefrences sess = new AppPrefrences(this);
    sess.setUserName("A");
    

    【讨论】:

    • 我使用它,但是当我杀死应用程序时,它总是会为空。
    • @designanddevelop 我希望新编辑的解决方案对您有用。?
    • 我不明白“isUserLoggedOut”方法。
    • @designanddevelop 你不明白的告诉我。?
    • 我可以投入使用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多