LRU算法&高效加载Bitmap&安卓小姿势

简介

最近找工作越来越不好找,越是这样,基本功越要扎实,所以把之前整理的一些基础知识点发一下,作为复习参考。

Activity的启动模式

Activity采用的是任务栈的模式,先进后出的栈结构

1.标准模式(standard)
每启动一次Activity,就会创建一个新的Activity实例并置于栈顶。

2.栈顶复用模式(singleTop)
如果需要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例。如果栈顶不是新建的Activity,就会创建该Activity新的实例,并放入栈顶。

3.栈内复用模式(singleTask)
singleTask和taskAffinity配合使用,指定开启的Activity加入到哪个栈中。
如果指定的栈不存在就创建一个栈,然后把activity压入栈顶
如果指定的栈存在,里面没activity,把activity压入栈顶
如果指定的栈存在,有该Activity的实例,则把activity之上的所有activity干掉,让这个activity处于栈顶,然后调用onNewIntent().

4.单例模式(singleInstance)
打开Activity时,直接创建一个新的任务栈,并创建该Activity实例放入新栈中。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例。

Service

service 有两种启动方式,startService() 和bindService() ,生命周期不同
startService() :普通的服务,例如后台播放音乐,统计使用时长等
bindService():同Service通信,就要使用这种方式。生命周期同被绑定的Context对象。
放在单独进程中的服务需要用到进程间通信。
Service分为前台服务和后台服务,前台服务需要在服务里创建一个Notification,setForeground()来提升进程的优先级,减少被回收的风险。

广播接收者

广播接收者有两种注册方式:静态注册,动态注册
广播类型:有序广播、无序广播、系统广播、本地广播(安全效率)、粘性广播(已废弃)
动态注册的广播随组件生命周期,要及时干掉,以免内存泄露
原理:

1.广播接收者 通过 Binder机制在 AMS 注册
2.广播发送者 通过 Binder 机制向 AMS 发送广播
3.AMS 根据 广播发送者 要求,在已注册列表中,寻找合适的广播接收者
4.AMS将广播发送到合适的广播接收者相应的消息循环队列中;
5.广播接收者通过 消息循环 拿到此广播,并回调 onReceive()

ContentProvider

进程间进行数据交互共享,跨进程通信的搬运工角色。也适用于进程内通信
ContentProvider底层也是使用Binder机制
主要方法是增、删、改、查
android7.0后提供了FileProvider的方式访问本地路径

事件传递机制

事件传递关系到的几个对象
Activity dispatchTouchEvent()
PhoneWindow dispatchTouchEvent()
DecorView( ViewGroup ) dispatchTouchEvent() onInterceptTouchEvent()
View dispatchTouchEvent() dispatchTouchEvent()
手指点击屏幕的那一刻,就会触发Activity的dispatchTouchEvent(),然后会依次调用PhoneWindow、DecorView的dispatchTouchEvent() ,在ViewGroup的dispatchTouchEvent()里面会先调用 onInterceptTouchEvent() ,如果拦截就会调用当前ViewGroup的onTouch() onTouchEvent()…等方法。如果没有拦截就遍历子View,然后执行View的dispatchTouchEvent()方法,如果被消费了就调用该View的onTouch() onTouchEvent()…等方法。没被消费就一级一级往回返状态。如果都没有消费,最终在Activity废弃这个事件

LruCache最近最少使用

LruCache中维护了一个集合LinkedHashMap,该LinkedHashMap是以访问顺序排序的。当调用put()方法时,就会在结合中添加元素,并调用trimToSize()判断缓存是否已满,如果满了就用LinkedHashMap的迭代器删除队尾元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get()方法获得对应集合元素,同时会更新该元素到队头。

Bitmap高效加载

①将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片。
②从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于outWidth和outHeight参数。
③根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize。
④将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片。

【inJustDecodeBounds=true】通过这个属性加载图片,得到的是图片的宽高尺寸,而不是具体的图片。
【inSampleSize】设置这个属性>0就可以使加载的图片的尺寸缩小。配合上一步获得的图片宽高以及最终展示在布局的宽高,计算出缩放比,设置给inSampleSize属性,再次加载图片,就能得到缩放后的图片,加载更小的图片,减少内存占用。
【inBitmap】inBitmap属性会提高安卓系统对Bitmap分配与释放的执行效率。通过这个属性Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap不会先申请内存,而是尝试使用上一张bitmap占用的内存区域。(及时有很多图片,也只会占用屏幕能展示的一张图片的内存大小)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值