最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。
小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
开启多进程模式
-
在清单文件中指定: android:process
-
在 native 层 fork(不常用)
-
运行机制
-
每个进程都分配了一个独立的虚拟机, 独立的地址空间, 所以导致不能共享内存
-
常见问题
-
1. 静态成员和单例模式完全失效
-
2. 线程同步机制完全失效
-
3. SharedPreferences 的可靠性下降
-
4. Application 会多次创建
-
序列化
-
Serializable
-
一般需要手动指定 serialVersionUID, 比如 1L.
-
serialVersionUID 不指定, 系统会自动计算当前类的 hash 值, 序列化时和反序列化时如果 serialVersionUID 不一致会 crash. 如果指定了 serialVersionUID, 即使有新增或者删除字段, 任然能够序列化成功.
-
Parcelable
-
writeToParcel() 序列化, 反序列化由 CREATOR 完成, 内容描述由 describeContents() 完成
-
两者之间的比较
-
Serializable 是 Java 中的序列化接口, 使用简单, 开销很大. 序列化和反序列化需要大量 I/O 操作. Parcelable 效率很高.
-
序列化到存储设备或者对象序列化后通过网络传输, 建议选择 Serializable
-
Parcelable 主要用在内存序列化上
-
Binder
-
可以使用 AIDL(系统提供的快速实现 Binder 的工具) 自动生成代码, 也可以自己写
-
Android 中 IPC 方式
-
Bundle(使用 Intent 中附加的 extras)
-
非常简单, 方便
-
使用场景: 直接传递数据
-
共享文件
-
简单方便
-
对象记得序列化
-
不建议使用 SP 进行进程间通信, 虽然它也是文件, 但是它内存有一定的缓存策略, 内存中有一份 SP 文件的缓存.
-
使用场景: 由于并发读写存在问题, 适合对数据同步要求不高的进程之间通信
-
Messenger
-
其实底层是通过 AIDL 实现的, 也就是通过 Binder 来通信的
-
数据传递必须将数据放入 Message 中
-
串行方式处理, 一个一个地来
-
AIDL
-
服务端
-
首先创建一个 Service, 用来监听客户端的连接请求, 然后创建一个 AIDL 文件, 将暴露给客户端的接口在这个 AIDL 文件中声明, 最后在 Service 中实现这个 AIDL 接口即可
-
客户端注册的 listener(RemoteCallbackList, 底层是 map,key 是 binder), 服务端调用 listener 中的方法, 这个方法是运行在客户端的 binder 线程中, 可能很耗时, 所以不能在 UI 线程搞
-
客户端
-
首先需要绑定服务端的 Service, 绑定成功后, 将服务端返回的 Binder 对象转成 AIDL 接口所属的类型, 接着就可以调用 AIDL 中的方法了.
-
调用服务端的方法时, 运行在服务端的 binder 线程池中, 不能在 UI 线程调用
-
客户端与服务端之间传递的对象不是引用, 而是序列化和反序列化了的
-
ContentProvider
ContentProvider 是 Android 中提供的专门用于不同应用间进行数据共享的方式, 天生适合进程间通信. 底层是 Binder
-
android:authorities 唯一标识
-
onCreate()在主线程中运行, 其他 () 都在 binder 线程中运行
-
通过 Uri 来区分外面要访问的数据集合, 需要定义单独 Uri 和 Uri_Code, 使用 U 日 Match 而的 addURI() 方法将 Uri 和 Uri_Code 关联到一起
-
update,insert,delete 方法会引起数据源的改变, 这时候需要调用 ContentResolver 的 notifyChange 方法来通知外界当前 ContentProvider 中的数据已经发生改变
-
观察 ContentProvider 中的数据改变情况, 可以通过 ContentProvider 的 registerContentObserver() 方法来注册观察者, unregisterContentObserver 方法来解除观察者
-
Socket(网络通信肯定是可以的撒)
-
底层实现分类
-
TCP
-
稳定
-
超时重传
-
三次握手, 四次挥手
-
UDP
-
无连接
-
不太可靠, 只保证发出去, 不保证正确传输
-
效率高
-
连接上了之后可以互相通信, 不像 Http(是 APP 主动通信, 然后服务端返回).
-
Binder 连接池
当 aidl 比较多的时候, 需要用到 Binder 连接池, 为了共用一个 Service. 这个 Service 可兼容多个 aidl
-
我们需要减少 Service 的数量,将所有的 AIDL 放在同一个 Service 中去管理。Binder 连接池用于转发查询应该使用哪个 aidl
-
IPC 优缺点及适用场景
-
Bundle
结尾
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!