有一些很常見的屬性,雖然咱們能夠在每次須要它們的時候手動地實現它們,但更好的方法是一次性所有實現,而後放進一個庫裏面。換句話說,對其屬性值的操做再也不依賴於其自身的getter()/setter()方法,而是將其託付給一個代理類,從而每一個使用類中的該屬性能夠經過代理類統一管理。php
委託屬性的語法java
val/var <property name>: <Type> by <expression>
複製代碼
其中,by 後面的表達式就是一個委託操做。android
本文介紹的庫,github地址:https://github.com/fengzhizi715/SAF-Object-Delegategit
包含四個模塊:github
模塊 | extras-delegate | prefs-delegate | prefs-fastjson-delegate | prefs-gson-delegate |
---|---|---|---|---|
最新版本 |
![]() |
![]() |
![]() |
![]() |
Gradle:算法
implementation 'com.safframework.delegate:extras-delegate:0.1.0'
複製代碼
點擊某個控件,跳轉到下一個頁面,並傳遞參數。express
text1.click{
val intent = Intent(this@MainActivity, Demo4ExtrasDelegateActivity::class.java)
val u = User("Tony","123456")
intent.putExtra("user",u)
intent.putExtra("string","just a test")
startActivity(intent)
}
複製代碼
這裏的 click 函數是一個擴展函數,能夠在 https://github.com/fengzhizi715/SAF-Kotlin-Utils 找到。json
從Demo4ExtrasDelegateActivity接受來自上一個Activity中傳遞過來的參數。安全
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.safframework.delegate.domain.User
import com.safframework.delegate.extras.extraDelegate
import com.safframework.log.L
/** * * @FileName: * com.safframework.delegate.activity.Demo4ExtrasDelegateActivity.java * @author: Tony Shen * @date: 2018-06-13 17:42 * @version V1.0 <描述當前版本功能> */
class Demo4ExtrasDelegateActivity: AppCompatActivity() {
private val user: User? by extraDelegate("user")
private val s:String? by extraDelegate("string")
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
L.json(user)
L.i(s)
}
}
複製代碼
所傳遞過來的任何對象類型,均可以使用以下的方式獲取Extras。只要保證,extra的key正確便可。app
private val user: User? by extraDelegate("user")
private val s:String? by extraDelegate("string")
複製代碼
Gradle:
implementation 'com.safframework.delegate:prefs-delegate:1.0.0'
複製代碼
沒有使用 AES 算法,SharedPreferences的數據文件大體是這樣的:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">tony</string>
<string name="password">1234abcd</string>
<int name="age" value="20" />
<boolean name="isForeigner" value="false" />
</map>
複製代碼
使用了 AES 算法以後,可能會變成這樣:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="PUoKC8qjz+tmMUV+EVz9Pw==">x2jMB8gvbhkLpMsUuvN7VA==</string>
<string name="/dSJ/TeQoeRnpoMvZWI67A==">lV+O+RVVrE/p4CjmBX3IbA==</string>
<string name="viAoG1taVD8rPP9+0n4ORg==">O4DxiobDhUeGEPe0cQFrCQ==</string>
<string name="Mq2QcYiQhvDjHwBohnGWEQ==">er4sZVGF7k45nNmUq6p7Cg==</string>
</map>
複製代碼
能夠編寫一個 PrefsHelper,把所須要使用 SharedPreferences 保存的屬性放進去。
import android.content.SharedPreferences
/** * * @FileName: * com.safframework.delegate.prefs.PrefsHelper.java * @author: Tony Shen * @date: 2018-06-28 23:43 * @version V1.0 <描述當前版本功能> */
class PrefsHelper(prefs: SharedPreferences) {
var name by prefs.string("name")
var password by prefs.string("password")
var age by prefs.int("age")
var isForeigner by prefs.boolean("isForeigner")
}
複製代碼
要使用加密功能的話,須要先初始化密鑰,且密鑰是16位。
import android.content.SharedPreferences
/** * * @FileName: * com.safframework.delegate.prefs.EncryptPrefsHelper.java * @author: Tony Shen * @date: 2018-06-13 23:44 * @version V1.0 <描述當前版本功能> */
class EncryptPrefsHelper(prefs: SharedPreferences) {
init {
prefs.initKey("12345678910abcde") // 初始化密鑰,且密鑰是16位的
}
var name by prefs.string("name",isEncrypt=true)
var password by prefs.string("password",isEncrypt=true)
var age by prefs.int("age",isEncrypt=true)
var isForeigner by prefs.boolean("isForeigner",isEncrypt=true)
}
複製代碼
注意,實際使用過程當中 PrefsHelper 應該是單例。
因爲,com.novoda.bintray-release插件和gradle版本升級到當前最新版本。該模塊也已經上傳到jcenter,要是引入到項目中出現「Failed to resolve: com.safframework.delegate:prefs-delegate:1.0.0」時,能夠採用臨時解決方案,在項目根目錄的build.gradle中添加以下的代碼。
allprojects {
repositories {
......
maven{url 'https://dl.bintray.com/fengzhizi715/maven/'}
}
}
複製代碼
支持 fastjson、gson 分別來作對象的序列化。這裏作成兩個庫,主要是考慮到某些項目已經使用了 fastjson 或者 gson,選取合適的庫避免額外添加library。
使用fastjon序列化對象
Gradle:
implementation 'com.safframework.delegate:prefs-fastjson-delegate:0.1.0'
複製代碼
使用gson序列化對象
Gradle:
implementation 'com.safframework.delegate:prefs-gson-delegate:0.1.0'
複製代碼
相似上面的 PrefsHelper,寫了一個 ObjectPrefsHelper。它包含兩個 user 對象,分別使用 fastjson 和 gson 來作序列化。
import android.content.SharedPreferences
import com.safframework.delegate.domain.User
/** * * @FileName: * com.safframework.delegate.prefs.ObjectPrefsHelper.java * @author: Tony Shen * @date: 2018-06-29 11:56 * @version V1.0 <描述當前版本功能> */
class ObjectPrefsHelper(prefs: SharedPreferences) {
var user1 by prefs.json<User?>(null)
var user2 by prefs.gson<User?>(null)
}
複製代碼
Java與Android技術棧:每週更新推送原創技術文章,歡迎掃描下方的公衆號二維碼並關注,期待與您的共同成長和進步。