基于Kotlin的委托机制实现一个对Extra、SharedPreferences操作的库

本文介绍了如何使用Kotlin的委托属性来封装Extra和SharedPreferences操作,提供了一个库,支持AES加密和对象序列化。库包含两个模块,一个用于封装Extra的传递,另一个用于封装SharedPreferences,支持基本类型及对象类型的存储。库已上传到jcenter,通过Gradle可便捷引入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=jpeg


Kotlin 的委托属性

有一些很常见的属性,虽然我们可以在每次需要它们的时候手动地实现它们,但更好的方法是一次性全部实现,然后放进一个库里面。换句话说,对其属性值的操作不再依赖于其自身的getter()/setter()方法,而是将其托付给一个代理类,从而每个使用类中的该属性可以通过代理类统一管理。

委托属性的语法

  1. val/var <property name>: <Type> by <expression>

其中,by 后面的表达式就是一个委托操作。

本文介绍的库,github地址:https://github.com/fengzhizi715/SAF-Object-Delegate

包含四个模块:

模块extras-delegateprefs-delegateprefs-fastjson-delegateprefs-gson-delegate
最新版本0.1.01.0.00.1.00.1.0

一. 封装Extra

1.1 下载安装

Gradle:

  1. implementation 'com.safframework.delegate:extras-delegate:0.1.0'

1.2 使用

点击某个控件,跳转到下一个页面,并传递参数。

  1.        text1.click{

  2.            val intent = Intent(this@MainActivity, Demo4ExtrasDelegateActivity::class.java)

  3.            val u = User("Tony","123456")

  4.            intent.putExtra("user",u)

  5.            intent.putExtra("string","just a test")

  6.            startActivity(intent)

  7.        }

这里的 click 函数是一个扩展函数,可以在 https://github.com/fengzhizi715/SAF-Kotlin-Utils 找到。

从Demo4ExtrasDelegateActivity接受来自上一个Activity中传递过来的参数。

  1. import android.os.Bundle

  2. import android.support.v7.app.AppCompatActivity

  3. import com.safframework.delegate.domain.User

  4. import com.safframework.delegate.extras.extraDelegate

  5. import com.safframework.log.L

  6. /**

  7. *

  8. * @FileName:

  9. *          com.safframework.delegate.activity.Demo4ExtrasDelegateActivity.java

  10. * @author: Tony Shen

  11. * @date: 2018-06-13 17:42

  12. * @version V1.0 <描述当前版本功能>

  13. */

  14. class Demo4ExtrasDelegateActivity: AppCompatActivity() {

  15.    private val user: User? by extraDelegate("user")

  16.    private val s:String? by extraDelegate("string")

  17.    public override fun onCreate(savedInstanceState: Bundle?) {

  18.        super.onCreate(savedInstanceState)

  19.        L.json(user)

  20.        L.i(s)

  21.    }

  22. }

所传递过来的任何对象类型,都可以使用如下的方式获取Extras。只要保证,extra的key正确即可。

  1.    private val user: User? by extraDelegate("user")

  2.    private val s:String? by extraDelegate("string")

二. 封装SharedPreferences

2.1 SharedPreferences存放int、long、float、boolean、string以及Set\

2.1.1 下载安装

Gradle:

  1. implementation 'com.safframework.delegate:prefs-delegate:1.0.0'

2.1.2 特点

  • 支持 SharedPreferences 的int、long、float、boolean、string以及Set\

  • 支持对上述类型使用 AES 算法进行加密,以保障数据安全

没有使用 AES 算法,SharedPreferences的数据文件大致是这样的:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

  2. <map>

  3.    <string name="name">tony</string>

  4.    <string name="password">1234abcd</string>

  5.    <int name="age" value="20" />

  6.    <boolean name="isForeigner" value="false" />

  7. </map>

使用了 AES 算法之后,可能会变成这样:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

  2. <map>

  3.    <string name="PUoKC8qjz+tmMUV+EVz9Pw==">x2jMB8gvbhkLpMsUuvN7VA==</string>

  4.    <string name="/dSJ/TeQoeRnpoMvZWI67A==">lV+O+RVVrE/p4CjmBX3IbA==</string>

  5.    <string name="viAoG1taVD8rPP9+0n4ORg==">O4DxiobDhUeGEPe0cQFrCQ==</string>

  6.    <string name="Mq2QcYiQhvDjHwBohnGWEQ==">er4sZVGF7k45nNmUq6p7Cg==</string>

  7. </map>

2.1.2 使用

可以编写一个 PrefsHelper,把所需要使用 SharedPreferences 保存的属性放进去。

  1. import android.content.SharedPreferences

  2. /**

  3. *

  4. * @FileName:

  5. *          com.safframework.delegate.prefs.PrefsHelper.java

  6. * @author: Tony Shen

  7. * @date: 2018-06-28 23:43

  8. * @version V1.0 <描述当前版本功能>

  9. */

  10. class PrefsHelper(prefs: SharedPreferences) {

  11.    var name by prefs.string("name")

  12.    var password by prefs.string("password")

  13.    var age by prefs.int("age")

  14.    var isForeigner by prefs.boolean("isForeigner")

  15. }

要使用加密功能的话,需要先初始化密钥,且密钥是16位。

  1. import android.content.SharedPreferences

  2. /**

  3. *

  4. * @FileName:

  5. *          com.safframework.delegate.prefs.EncryptPrefsHelper.java

  6. * @author: Tony Shen

  7. * @date: 2018-06-13 23:44

  8. * @version V1.0 <描述当前版本功能>

  9. */

  10. class EncryptPrefsHelper(prefs: SharedPreferences) {

  11.    init {

  12.        prefs.initKey("12345678910abcde") // 初始化密钥,且密钥是16位的

  13.    }

  14.    var name by prefs.string("name",isEncrypt=true)

  15.    var password by prefs.string("password",isEncrypt=true)

  16.    var age by prefs.int("age",isEncrypt=true)

  17.    var isForeigner by prefs.boolean("isForeigner",isEncrypt=true)

  18. }

注意,实际使用过程中 PrefsHelper 应该是单例。

由于,com.novoda.bintray-release插件和gradle版本升级到当前最新版本。该模块也已经上传到jcenter,要是引入到项目中出现“Failed to resolve: com.safframework.delegate:prefs-delegate:1.0.0”时,可以采用临时解决方案,在项目根目录的build.gradle中添加如下的代码。

  1. allprojects {

  2.    repositories {

  3.        ......

  4.        maven{url 'https://dl.bintray.com/fengzhizi715/maven/'}

  5.    }

  6. }

2.2 SharedPreferences存放对象类型

支持 fastjson、gson 分别来做对象的序列化。这里做成两个库,主要是考虑到某些项目已经使用了 fastjson 或者 gson,选取合适的库避免额外添加library。

2.2.1 下载安装

使用fastjon序列化对象

Gradle:

  1. implementation 'com.safframework.delegate:prefs-fastjson-delegate:0.1.0'

使用gson序列化对象

Gradle:

  1. implementation 'com.safframework.delegate:prefs-gson-delegate:0.1.0'

2.2.2 使用

类似上面的 PrefsHelper,写了一个 ObjectPrefsHelper。它包含两个 user 对象,分别使用 fastjson 和 gson 来做序列化。

  1. import android.content.SharedPreferences

  2. import com.safframework.delegate.domain.User

  3. /**

  4. *

  5. * @FileName:

  6. *          com.safframework.delegate.prefs.ObjectPrefsHelper.java

  7. * @author: Tony Shen

  8. * @date: 2018-06-29 11:56

  9. * @version V1.0 <描述当前版本功能>

  10. */

  11. class ObjectPrefsHelper(prefs: SharedPreferences) {

  12.    var user1 by prefs.json<User?>(null)

  13.    var user2 by prefs.gson<User?>(null)

  14. }



关注【Java与Android技术栈】

更多精彩内容请关注扫码

640?wx_fmt=jpeg


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值