AptPreferences是基於面向對象設計的快速持久化框架,目的是為了簡化SharePreferences的使用,減少代碼的編寫。可以非常快速地保存基本類型和對象。AptPreferences是基於APT技術實現,在編譯期間實現代碼的生成,支持混淆。根據不同的用戶區分持久化信息。 特點 1. 把 ...
AptPreferences是基於面向對象設計的快速持久化框架,目的是為了簡化SharePreferences的使用,減少代碼的編寫。可以非常快速地保存基本類型和對象。AptPreferences是基於APT技術實現,在編譯期間實現代碼的生成,支持混淆。根據不同的用戶區分持久化信息。
特點
- 把通過的Javabean變成SharedPreferences操作類
- 支持保存基本類型及對象
- 支持根據不同的用戶區分持久化信息。
簡單例子
定義javabean類
@AptPreferences
public class Settings {
private long loginTime;
private LoginUser loginUser;
// get、set方法
}
使用方式
//初始化
AptPreferencesManager.init(this, null);
// 保存信息
SettingsPreference.get().setLoginTime(System.currentTimeMillis());
SettingsPreference.get().set(new LoginUser("Wiki"));
// 獲取信息
long loginTime = SettingsPreference.get().getLoginTime();
LoginUser loginUser = SettingsPreference.get().getLoginUser();
從上面的簡單例子可以看到,我們需要做SharePreferences持久化,僅僅定義一個簡單的javabean類(Settings)並添加註解即可,這個框架會根據javabean生成帶有持久化功能的SettingsPreference類,通過這個類就可以非常簡單去保持或者獲取數據,大大簡化了SharePreferences的使用,也可以保持對象。
項目地址
https://github.com/joyrun/AptPreferences
一、配置項目
配置項目根目錄 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:1.5.0"
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
配置app build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
//...
dependencies {
compile 'com.github.joyrun.AptPreferences:aptpreferences:0.4.4'
apt 'com.github.joyrun.AptPreferences:aptpreferences-compiler:0.4.4'
}
二、定義持久化Javabean
使用方法非常簡單,先編寫一個普通帶getter、setter的javabean類,在類頭部添加@AptPreferences即可:
@AptPreferences
public class Settings {
private long lastOpenAppTimeMillis;
// 使用commit提交,預設是使用apply提交,配置預設值
@AptField(commit = true)
private String useLanguage = "zh";
// 使用preferences的方式保存
@AptField(preferences = true)
private Push push;
// 使用對象的方式保存
private LoginUser loginUser;
// 不持久化該欄位,僅僅保留在記憶體
@AptField(save = false)
private long lastActionTimeMillis;
// ...
// get、set方法必須寫
}
三、註解及使用說明
我們提供了兩個註解@AptPreferences和@AptField(commit = false,save = true,preferences = false)。
@AptPreferences
被註解的javabean必須為欄位實現setter和getter方法;
@AptField
AptField有三個參數可以配置。
commit:可以配置使用commit還是apply持久化,預設是apply,需要在一些需要立刻保存到文件的可以使用commit方式,比如在退出APP時保存退出的時間。
save:用來聲明是否需要持久化這個欄位。
- preferences:這個屬性僅僅適用於對象類型的欄位,用來聲明這個是以對象的方式保存,還是以preferences的方式保存。如果是true,就可以通過settingsPreference.getPush().isOpenPush()的方式存取。
global:預設是true,如果設置為false時,和AptPreferencesManager.setUserInfo()配合,可以為不同的用戶進行持久化,達到每個用戶有不用的設置。
四、初始化
使用之前要進行初始化,建議在Application進行初始化,需要需要保存對象,還需要實現對象的解析器,這裡使用Fastjson作為實例:
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
AptPreferencesManager.init(this, new AptParser() {
@Override
public Object deserialize(Class clazz, String text) {
return JSON.parseObject(text,clazz);
}
@Override
public String serialize(Object object) {
return JSON.toJSONString(object);
}
});
}
}
五、根據不同的用戶設置
如果app支持多用戶登錄,需要根據不用的用戶持久化,可以通過下麵方法配置。再通過@AptField(global = false),就可以針對某個欄位跟隨用戶不同進行持久化。
AptPreferencesManager.setUserInfo("uid");
六、代碼調用
// 普通類型保存
SettingsPreferences.get().setUseLanguage("zh");
SettingsPreferences.get().setLastOpenAppTimeMillis(System.currentTimeMillis());
// 對象類型保存
Settings.LoginUser loginUser = new Settings.LoginUser();
loginUser.setUsername("username");
loginUser.setPassword("password");
SettingsPreferences.get().setLoginUser(loginUser);
// 對象類型帶 @AptField(preferences = true) 註解的保存,相當於把 push相關的放在一個分類
SettingsPreferences.get().getPush().setOpenPush(true);
// 獲取
String useLanguage = settingsPreference.getUseLanguage();
Settings.LoginUser loginUser1 = settingsPreference.getLoginUser();
boolean openPush = settingsPreference.getPush().isOpenPush();
七、預設值
很多時候我們需要在沒有獲取到值時使用預設值,SharedPreferences本身也是具備預設值的,所以我們也是支持預設值配置。分析生成的代碼可以看到:
@Override
public long getLastOpenAppTimeMillis() {
return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());
}
如果沒有獲取到值,會調用父類的方法,那麼就可以通過這個方式配置預設值:
@AptPreferences
public class Settings {
// 使用commit提交,預設是使用apply提交,配置預設值
@AptField(commit = true)
private String useLanguage = "zh";
// ...
}
八、詳細轉換代碼
@AptPreferences
public class Settings {
private long lastOpenAppTimeMillis;
// 使用commit提交,預設是使用apply提交,配置預設值
@AptField(commit = true)
private String useLanguage = "zh";
// 使用preferences的方式保存
@AptField(preferences = true)
private Push push;
// 使用對象的方式保存
private LoginUser loginUser;
// 不持久化該欄位,僅僅保留在記憶體
@AptField(save = false)
private long lastActionTimeMillis;
public long getLastActionTimeMillis() {
return lastActionTimeMillis;
}
public void setLastActionTimeMillis(long lastActionTimeMillis) {
this.lastActionTimeMillis = lastActionTimeMillis;
}
public LoginUser getLoginUser() {
return loginUser;
}
public void setLoginUser(LoginUser loginUser) {
this.loginUser = loginUser;
}
public long getLastOpenAppTimeMillis() {
return lastOpenAppTimeMillis;
}
public void setLastOpenAppTimeMillis(long lastOpenAppTimeMillis) {
this.lastOpenAppTimeMillis = lastOpenAppTimeMillis;
}
public String getUseLanguage() {
return useLanguage;
}
public void setUseLanguage(String useLanguage) {
this.useLanguage = useLanguage;
}
public Push getPush() {
return push;
}
public void setPush(Push push) {
this.push = push;
}
public static class Push {
private boolean openPush;
private boolean vibrate;
private boolean voice;
public boolean isOpenPush() {
return openPush;
}
public void setOpenPush(boolean openPush) {
this.openPush = openPush;
}
public boolean isVibrate() {
return vibrate;
}
public void setVibrate(boolean vibrate) {
this.vibrate = vibrate;
}
public boolean isVoice() {
return voice;
}
public void setVoice(boolean voice) {
this.voice = voice;
}
}
public static class LoginUser implements Serializable{
public String username;
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
}
實際上就是根據上面的代碼自動生成帶有持久化的代碼,可以在這裡可以找到
app/build/generated/source/apt/debug
public final class SettingsPreferences extends Settings {
public static final Map<String, SettingsPreferences> sMap = new java.util.HashMap<>();
private final SharedPreferences.Editor mEdit;
private final SharedPreferences mPreferences;
private final String mName;
public SettingsPreferences(String name) {
mPreferences = AptPreferencesManager.getContext().getSharedPreferences("Settings_" + name, 0);
mEdit = mPreferences.edit();
this.mName = name;
this.setPush(new PushPreferences());
}
@Override
public Settings.LoginUser getLoginUser() {
String text = mPreferences.getString("loginUser", null);
Object object = null;
if (text != null) {
object = AptPreferencesManager.getAptParser().deserialize(com.thejoyrun.aptpreferences.Settings.LoginUser.class, text);
}
if (object != null) {
return (com.thejoyrun.aptpreferences.Settings.LoginUser) object;
}
return super.getLoginUser();
}
@Override
public void setLoginUser(Settings.LoginUser loginUser) {
mEdit.putString("loginUser", AptPreferencesManager.getAptParser().serialize(loginUser)).apply();
}
@Override
public long getLastOpenAppTimeMillis() {
return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());
}
@Override
public void setLastOpenAppTimeMillis(long lastOpenAppTimeMillis) {
mEdit.putLong("lastOpenAppTimeMillis", lastOpenAppTimeMillis).apply();
}
@Override
public String getUseLanguage() {
return mPreferences.getString("useLanguage", super.getUseLanguage());
}
@Override
public void setUseLanguage(String useLanguage) {
mEdit.putString("useLanguage", useLanguage).commit();
}
public static SettingsPreferences get(String name) {
if (sMap.containsKey(name)) {
return sMap.get(name);
}
synchronized (sMap) {
if (!sMap.containsKey(name)) {
SettingsPreferences preferences = new SettingsPreferences(name);
sMap.put(name, preferences);
}
}
return sMap.get(name);
}
public static SettingsPreferences get() {
return get("");
}
public void clear() {
mEdit.clear().commit();
sMap.remove(mName);
}
public static void clearAll() {
java.util.Set<String> keys = sMap.keySet();
for (String key : keys) {
sMap.get(key).clear();
}
}
private class PushPreferences extends Settings.Push {
@Override
public boolean isOpenPush() {
return mPreferences.getBoolean("Push.openPush", super.isOpenPush());
}
@Override
public void setOpenPush(boolean openPush) {
mEdit.putBoolean("Push.openPush", openPush).apply();
}
@Override
public boolean isVibrate() {
return mPreferences.getBoolean("Push.vibrate", super.isVibrate());
}
@Override
public void setVibrate(boolean vibrate) {
mEdit.putBoolean("Push.vibrate", vibrate).apply();
}
@Override
public boolean isVoice() {
return mPreferences.getBoolean("Push.voice", super.isVoice());
}
@Override
public void setVoice(boolean voice) {
mEdit.putBoolean("Push.voice", voice).apply();
}
}
}
License
Copyright 2016 Joyrun, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.