FOURTH DAY——SharedPreferences

SharedPreferences本身一个接口,故无法直接创建其实例。主要负责读取程序的Preferences数据,本身并不提供写入数据的能力,而是通过其内部接口调用.edit()获取对应Editor对象来写入数据。

1、获取SharedPreferences对象
法1:

   Context.getSharedPreferences(String name,int mode) 

文件名称不存在就会创建一个,操作模式有两种:

  • MODE_PRIVATE:默认操作模式,指定该SharedPreferences数据只能被本应用程序读写。
  • MODE_MULTI_PRIVATE:用于多个进程共同操作一个SharedPreferences文件。

**注:**android 4.2版本以后不在推荐使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式, 建议使用ContentProvider。

法2:

Activity.getPreferences(int mode) 

当前活动的类名作为SharedPreferences的文件名,底层调用的是下面这个方法
Activity.getSharedPreferences(String name, int mode)
也可以直接调用getSharedPreferences方法,传入自定义的名字。

法3

PreferenceManager.getDefaultSharedPreferences(Context) 

当前程序的包名作为前缀来命名SharedPreferences文件

2、获取SharedPreferences.Editor对象

SharedPreferences.Editor editor = getSharedPreferences(“data”,MODE_PRIVATE).edit();

3、操作数据

    editor.putString(“name”,”Lily”); //以键值对形式存储 
    editor.putInt(“age”,”20”); 
    editor.putBoolean(“married”,false); 

    editor.clear(); //清空数据
    editor.remove(String key);//删除指定key对用数据 

注:SharedOreferences不支持写入Date类型的值。
可使用SimpleDateFormat将Date格式化成字符串后再写入。示例:

SimpleDateFormat sdf=new SimpleDateFormat("yyyy年mm月dd日"+"hh:mm:ss");
//存入当前时间
editor.putString("time",sdf.format(new Date()));
//存入一个随机数
editor.putInt("random",(int)(Math.random()*100));
//提交所有存入的数据
editor.commit();

4、提交数据修改与应用数据的区别
提交:

 editor.commit();
  • 返回布尔型的值
  • 当数据变化进行存储时是一个原子性的操作
  • 多个editor同时提交时,只有最后一个生效

应用:

  editor.apply();
  • 没有返回值
  • 原子性操作
  • 同时编辑时,也是最后一个生效

两者的区别:

  • apply无返回值,而commit返回值可表明是否提交成功
  • apply是异步提交到硬件磁盘, 而commit是同步提交到硬件磁盘。故apply比commit效率高。

故不关心提交结果时,建议使用apply。

另:SharedPerferences数据总是保存在/data/data//shared_prefs目录下,以XML格式保存。

5.封装SharedPreferences的工具类示例:
示例1:

 public class SharePreferencesUtil {
        private static SharePreferencesUtil sSharePreferencesUtil = null;
        private static final String DB_NAME = "dbname";
        private static final String IS_REMEMBER = "isremember";
        ...
    
        private static volatile SharedPreferences preferences;
        private SharedPreferences.Editor editor;
    
        private SharePreferencesUtil() {
            preferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext());
            editor = preferences.edit();
        }
    
        public static SharePreferencesUtil getInstance() {
            if (sSharePreferencesUtil == null) {
                synchronized (SharePreferencesUtil.class) {
                    if (sSharePreferencesUtil == null) {
                        sSharePreferencesUtil = new SharePreferencesUtil();
                    }
                }
            }
            return sSharePreferencesUtil;
        }
    
    
       public boolean getIsRemember() {
           return preferences.getBoolean(IS_REMEMBER, false);
       }
       public void setIsRemember(boolean is_remember) {
            editor.putBoolean(IS_REMEMBER, is_remember).apply();
        }
        
        public String getDbName() {
            return preferences.getString(DB_NAME, null);
        }
        public void setDbName(String db_name) {
            editor.putString(DB_NAME, db_name).apply();
        }
        
      ...

    }

示例2:

    public class SharedPreferencesUtil{
        private SharedPreferences sharedPreferences;
        private SharedPreferences.Editor editor;
        
        public SharedPreferencesUtil(Context context,String FILE_NAME) {
            sharedPreferences = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            editor = sharedPreferences.edit();
        }
    
//存储 putXXX(String key,xxx value)

        public void put(String key, Object object) {
            if (object instanceof String) {
                editor.putString(key, (String) object);
            } else if (object instanceof Integer) {
                editor.putInt(key, (Integer) object);
            } else if (object instanceof Boolean) {
                editor.putBoolean(key, (Boolean) object);
            } else if (object instanceof Float) {
                editor.putFloat(key, (Float) object);
            } else if (object instanceof Long) {
                editor.putLong(key, (Long) object);
            } else {
                editor.putString(key, object.toString());
            }
            editor.commit();
        }
    
 // 获取getXXX(String key,xxx defValue)
 
    public Object getSharedPreference(String key, Object defaultObject) {
            if (defaultObject instanceof String) {
                return sharedPreferences.getString(key, (String) defaultObject);
            } else if (defaultObject instanceof Integer) {
                return sharedPreferences.getInt(key, (Integer) defaultObject);
            } else if (defaultObject instanceof Boolean) {
                return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
            } else if (defaultObject instanceof Float) {
                return sharedPreferences.getFloat(key, (Float) defaultObject);
            } else if (defaultObject instanceof Long) {
                return sharedPreferences.getLong(key, (Long) defaultObject);
            } else {
                return sharedPreferences.getString(key, null);
            }
        }
    
//移除remove(String key)

        public void remove(String key) {
            editor.remove(key);
            editor.commit();
        }
    
 //清除clear()
 
         public void clear() {
            editor.clear();
            editor.commit();
        }
    
  // 查询contain(String key)
  
        public Boolean contain(String key) {
            return sharedPreferences.contains(key);
        }
    
 // 返回所有getAll()
 
         public Map<String, ?> getAll() {
            return sharedPreferences.getAll();
        }
    }

应用示例:
示例1:(项目代码较多)

public class LoginActivity extends BaseProcessActivity implements View.OnClickListener {

    private CheckBox rememberPwdCB;
    private EditText userEditText;
    private EditText pwdEditText;
    private Button enterButton;
   ...
    ViewTools mViewTools;
    SharePreferencesUtil preferencesUtil = SharePreferencesUtil.getInstance();

    private String dbname="";
    private String dbpassword="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        //解決彈出軟鍵盤時編輯框被覆蓋的問題
        AndroidBug5497Workaround.assistActivity(findViewById(android.R.id.content));
        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) !=
                    PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
            }
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
            }
        }
        mViewTools = new ViewTools(this);
       
        initView();
        ...
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    return;
                } else {
                    this.finish();
                    Process.killProcess(Process.myPid());
                }
                break;
            default:
        }
    }

    private void initView() {
        rememberPwdCB = findViewById(R.id.rememberPwdCheckBox);
        userEditText = findViewById(R.id.userEditText);
        pwdEditText = findViewById(R.id.pwdEditText);
        enterButton = findViewById(R.id.enterButton);
       ...
        enterButton.setOnClickListener(this);
        rememberPwdCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                preferencesUtil.setIsRemember(isChecked);
            }
        });
        rememberPwdCB.setChecked(preferencesUtil.getIsRemember());
        if (rememberPwdCB.isChecked()) {
            userEditText.setText(preferencesUtil.getNoId());
            pwdEditText.setText(preferencesUtil.getPwdId());
        }
        mViewTools.setETEnabled(userEditText, true);
        mViewTools.showSoftInput(userEditText);
        userEditText.addTextChangedListener(mTextWatcher);
        pwdEditText.addTextChangedListener(mTextWatcher);
    }

    TextWatcher mTextWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String id = userEditText.getText().toString();
            String pwd = pwdEditText.getText().toString();
            if (!id.isEmpty()) {
                if (userEditText.getText().toString().substring(id.length() - 1).equals("\n")) {
                    userEditText.clearFocus();
                    userEditText.setText(id.substring(0, id.length() - 1));
                    pwdEditText.requestFocus();
                    pwdEditText.setSelection(pwd.length());
                    mViewTools.showSoftInput(pwdEditText);
                }
            }
            if (!pwd.isEmpty()) {
                if (pwdEditText.getText().toString().substring(pwd.length() - 1).equals("\n")) {
                    pwdEditText.setText(pwd.substring(0, pwd.length() - 1));
                    mViewTools.hideSoftInput(pwdEditText);
                    pwdEditText.clearFocus();
                    enterButton.requestFocus();
                }
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    ...

    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.enterButton:
                //TabActivity.actionStart(LoginActivity.this);
                final String id = userEditText.getText().toString().trim();
                final String pwd = pwdEditText.getText().toString().trim();
                if ((id == null || id.trim().equals(""))) {
                    userEditText.setError("請輸入帳號!");
                    if (pwd == null || pwd.trim().equals("")) {
                        pwdEditText.setError("請輸入密碼!");
                        return;
                    }
                    return;
                } else {
                    if (pwd == null || pwd.trim().equals("")) {
                        pwdEditText.setError("請輸入密碼!");
                        return;
                    }
                }
                showProcessDialog("登錄中...");
                
                ...


        }
        
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);//finish之后 消息仍然存在消息队列中,最好把他们移除
    }
    
...

    public static void actionStart(Context context) {
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }
}

示例2:

    public class LoginActivity extends Activity implements OnClickListener {
        private EditText username;
        private EditText password;
        private Button login;
        private CheckBox holdPwd;
        private MyDialog mydialog;
        private SharedPreferencesUtil sharedPreferencesUtil;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_login);
    
            init();
        }
    
        private void init() {
            sharedPreferencesUtil= new SharedPreferencesUtil(
                    LoginActivity.this, "test");
            username = (EditText) findViewById(R.id.username);
            password = (EditText) findViewById(R.id.password);
            holdPwd = (CheckBox) findViewById(R.id.login_hold);
            holdPwd.setChecked(true);
            username.setText(sharedPreferencesUtil.getSharedPreference("username", "").toString().trim());     password.setText(sharedPreferencesUtil.getSharedPreference("password", "").toString().trim());
    
            login = (Button) findViewById(R.id.login);
            login.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.login:
                   String name = username.getText().toString().trim();
                   String pwd = password.getText().toString().trim();
            if (holdPwd.isChecked()) {
                sharedPreferencesUtil.put("username", name);
                sharedPreferencesUtil.put("password", pwd);
                sharedPreferencesUtil.put("isremember", holdPwd.isChecked());
            } else {
                sharedPreferencesUtil.remove("username");
                sharedPreferencesUtil.remove("password");
                sharedPreferencesUtil.remove("isremember");
            }
        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
                break;
                
           ...


            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值