一、运行时权限

只有危险的权限才需要运行时申请,每个危险权限都有一个自己的权限组,当任何一个权限组里面的权限

申请完毕,其他的权限也就自动被申请,不过需要注意的是不要利用此特性进行实现任何功能,因为权限组

可能会进行调整

运行时权限的申请步骤

1.首先需要判断权限是否被申请

2.然后调用系统方法进行申请

3.权限被允许,调用我们的执行逻辑

4.最重要的一点AndroidManifest里面一定要进行权限声明

二、访问其他程序里面数据

接用ContentResolver类进行访问ContentProvider中的数据,里面也提供了一些关于数据的CRUD操作

不过ContentResolver是采用内容URI进行查询的

//URI包含两个部分,authority和path
//authority一般就是包名加provider
//path一般就是 /表名,代表查询哪个表
//不过最后还是需要加上协议声明,故最标准的写法如下
content://com.example.app.provider/table1

得到的内容URI字符串之后我们还需要进行解析成Uri对象才可以使用

val uri = Uri.parse("content://com.example.app.provider/table1")

三、创建自己的ContentProvider

通过继承ContentProvider实现,然后重写里面的六个方法

URI的格式

content://com.example.app.provider/table1
//表示访问table1表中的数据

content://com.example.app.provider/table1/2
//表示访问table1表中id为2的那条数据

//可以利用以下两种通配符来实现匹配
*表示匹配任意长度的任意字符
#表示匹配任意长度的数字

//举个栗子
content://com.example.app.provider/*
//表示匹配任意表中的内容
content://com.example.app.provider/table1/#
//表示匹配table1表中的任意一行数据

Uri对象对应的MIME类型

由三部分构成

1.以vnd开头
2.路径结尾:android.cursor.dir/
  id结尾:android.cursor.item/
3.最后接上vnd.<authority>.<path>
//举个栗子
对于URI为:content://com.example.app.provider/table1
其MIME类型为:vnd.android.cursor.dir/vnd.com.example.app.provider/table1
对于URI为:content://com.example.app.provider/table1/2
其MIME类型为:vnd.android.cursor.item/vnd.com.example.app.provider/table1

当调用单条数据时,有一个Uri对象对应的方法getPathSegments()

结果放入一个字符串里面,第0个位置是路径,第1个位置是id

四、Kotlin的泛型和委托

1.泛型

这里和java的差不多

定义一个泛型类

class MyClass<T> {
    fun method(p1:T):T{
        return p1
    }
}
//T可以时任意的字符,不过T是比较常用的写法
//其调用方法如下
 val myClass = MyClass<Int>()
 val result = myClass.method(123)
//先指定一个数据类型,然后再调用

定义一个泛型方法

class MyClass1 {
    fun <T> method(p1:T):T{
        return p1
    }
}
//格式比较简单,这里举个栗子来说明一下
val myClass1 = MyClass1()
val result1 = myClass1.method<Int>(123)
val result2 = myClass1.method(123)
//result2是采用kotlin的类型推导机制,所有不需要指定类型
//调用形式稍微有点不同,在方法后面加上具体类型

还可以对泛型进行约束,这个就有点新了

//比如可以给类型定义一个上界,像Number类意味着所有数字类型都可以做为参数,其他的不行
//默认的上界为Any?,如果指定不可为空,只需要改成Any即可

//举个栗子
class MyClass2 {
    fun <T:Number>method(p1:T):T{
        return p1
    }
}

val myClass2 = MyClass2()
myClass2.method(22.22)
myClass2.method(22)
//以上两种都为数字类型故都可以
myClass2.method("jjjj")
//这个就会报错

2.委托

相当于一种设计模式,操作对象把自己不会处理的部分交给其他对象处理,不过kotlin是支持委托机制

有类委托和委托属性

类委托的核心思想是将一个类的具体实现委托给另一个类完成
委托属性的核心思想是将一个属性的具体实现委托给另一个类去完成
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐