【问题标题】:Using Shared Preferences in Android在 Android 中使用共享首选项
【发布时间】:2010-11-08 14:25:02
【问题描述】:

我有三个活动,A、B 和 C。其中 A 是启动活动,B 包含登录屏幕,其中包含用户 ID 和密码文本字段以及一个登录按钮。当我点击登录时,它会将我带到欢迎屏幕,在屏幕 C 上显示用户名。

在这里我想实现共享首选项,以便我可以存储用户的用户名和密码,这样用户就不必再次插入用户名和密码,并且在启动屏幕后用户直接进入欢迎屏幕。

我阅读了几篇关于共享偏好的文档,我了解到共享偏好有两种类型,一种是活动级别,另一种是应用程序级别。

我该如何实现?

【问题讨论】:

    标签: android


    【解决方案1】:

    这相对容易。您可以将用户名和密码直接存储在 SharedPreference 中,如下所示:

    SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(context);
    
    p.edit().putString("username", username).commit();
    p.edit().putString("password", password).commit(); //SECURITY HAZARD: read below...
    

    然后你可以像这样检索它:

    String username = p.getString("username", "");
    String password = p.getString("password", "");
    

    这样做的问题是密码在全球范围内可用。您需要有一种方法来阻止其他人查看它。执行此操作的方法是在保存密码时对其进行加密,并在使用对称密钥加载密码时对其进行解密。这里有一个关于加密的教程:http://android.voxisland.com/code_examples/How_to_encrypt_and_decrypt_strings.rhtml

    如果这对你有帮助,请告诉我。

    伊曼纽尔

    【讨论】:

    • 你好,亲爱的。感谢您的回复....它的一个应用程序级别或活动级别???自动记住我需要在活动 A 中实现它?
    • 应用程序级别。自动记住只是意味着您将其保存在首选项中。当你得到它们时,你应该检查它们是否为空并再次询问用户。
    【解决方案2】:

    从 Activity A 中这样写:

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
                Editor editor = sp.edit();
                editor.putString("YOUR_KEY", "username");
                editor.commit();
    

    之后您可以阅读:

    SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this);
            String username = p.getString("YOUR_KEY", null);
    

    【讨论】:

    • 您需要阅读来自Activity 的信息。它可能是 A、B 或 C。
    【解决方案3】:

    这是使用共享偏好的最佳方式,只需调用此方法即可

    存储共享偏好

    public static void setDefaults(String key, String value, Context context) {
        SharedPreferences prefs =
                PreferenceManager.getDefaultSharedPreferences(context);
    
        SharedPreferences.Editor editor = prefs.edit();
    
        editor.putString(key, value);
    
        editor.commit();
    }
    

    调用这个方法并像这样传递参数

    Classname.setsetDefaults("key","Value",context);
    

    获得共享价值

        public static String getDefaults(String key, Context context) {
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
            return preferences.getString(key, null);
        }
    

    调用此方法并传递密钥

    ClassName.getDefaults("Key",Context);
    

    【讨论】:

      【解决方案4】:

      在 android 中使用共享偏好

      public class SharedPref {
      
      public static void setValue(String key, String value, Context context) {
          SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
          SharedPreferences.Editor editor = prefs.edit();
          editor.putString(key, value);
          editor.commit();
      }
      
      public static String getValue(String key, Context context) {
          SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
          return preferences.getString(key, null);
      }
       public static void setAlertDialog(Context mContext,String title,String message)
      {
          AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
          alertDialog.setTitle(title);
          alertDialog.setMessage(message);
          alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                  new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog, int which) {
      
                          dialog.dismiss();
                      }
                  });
          alertDialog.show();
      }
      
      }
      

      并使用以下代码从类中设置和获取值

      SharedPref.setConfig("key","value",Context);
      SharedPref.getConfig("key",Context);
      SharedPref.setAlertDialog(Context,"title","Content to print");
      

      【讨论】:

        【解决方案5】:

        使用 JWT 存储用户名和密码是一种不好的做法。从您的响应中获取 JWT 令牌,然后将其存储在您的共享首选项中。如果您的 API 没有返回任何 JWT 作为回复,那么至少在保存之前对您的用户名和密码进行哈希处理,但这也是不安全的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多