优雅读取Activity的Intent二

204 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

之前写过一篇文章优雅读取Activity的Intent、Fragment的Argument,这个主要是从Kotlin属性委托的角度来封装Intent、Argument读写的,本篇文章将从另一个角度利用Kotlin运算符重载、带接收者的扩展函数来封装下

包装类封装Intent操作

class IntentWrapper2(private val mIntent: Intent) {
    //读取Intent
    fun <T> getValue(key: String, default: T): T? {
        return when(default) {
            is String -> mIntent.getStringExtra(key)
            is Boolean -> mIntent.getBooleanExtra(key, default)
            is Int -> mIntent.getIntExtra(key, default)
            else -> throw Exception("do not support the type")
        } as T?
    }
    //写入Intent
    fun <T> setValue(key: String, default: T) {
         when(default) {
            is String -> mIntent.putExtra(key, default)
            is Boolean -> mIntent.getBooleanExtra(key, default)
            is Int -> mIntent.getIntExtra(key, default)
            else -> throw Exception("do not support the type")
        }
    }
}

上面只是简单了罗列了下StringIntBoolean类型的读写,其他的类型诸如Double数组等请根据需求自行添加。

使用方式如下:

private val mIntents by lazy(LazyThreadSafetyMode.NONE) {
    IntentWrapper2(intent)
}

fun test() {
    val value = mIntents.getValue("key", "haha")
}

可以看到这样使用起来很麻烦:

  • 麻烦1:手动构造IntentWrapper2对象且给其传入当前AppCompatActivityIntent对象,优化如下:
fun AppCompatActivity.optIntent(): Lazy<IntentWrapper2> = lazy {
    IntentWrapper2(intent)
}

定义了一个接收者为AppCompatActivity的扩展函数,这样Intent就不用通过外部传入了:

private val mIntents by optIntent()
  • 麻烦2:通过mIntents.getValue()/setValue()读写Intent太过于麻烦,这个可以利用运算符重载setget进一步简化:

image.png

只需要把最上面定义的setValuegetValue方法增加operator且方法名分别改为setget即可,看下基本使用:

//read
val value = mIntents["key", "haha"]
//write
mIntents["key"] = "haha2"

使用起来是不是特别的简单,这个封装思想和我之前写的一篇关于SharedPreference读写封装的思想基本一致:三.委托与SharedPreference的结合

对于Fragmentargument读写的封装和Intent类似,这里就不再进行过多阐述了。

总结

相比较于Kotlin的属性委托封装Intent读写,使用文章中的这种封装方法需要用户手动指定Intent读写的key键,但是好处是只用创建一个包装者IntentWrapper2对象即可。