broadcast相关

onreceiver中执行耗时操作 不要在onreceiver中执行耗时操作,也不要开启新线程开执行这个操作,在broadcast中的代码执行位于其进程的主线程中,执行时间不要超过5s,否则会弹出超市dialog。但是如果执行不完,也不能放在线程中,Receiver只在onReceiver方法执行时是激活状态。因为开启线程——>onReceiver返回——>receiver不再处于激活状态——>receiver进程变为空进程将会在任意时刻被终止——>正在工作的子线程也会被杀死 解决这个问题的方案是在onReceive()里开始一个Service,让这个Service去 做这件事情,那么系统就会认为这个进程里还有活动正在进行。 执行优先级 冷注册(权限文件)和热注册(代码中跟随activity生命周期) 对于有序消息,热注册的BroadcastReceiver总是先于冷注册的BroadcastReceiver被触发。对于同样是动态注册的BroadcastReceiver,优先级别高(android:priority)的将先被触发,而静态注册的 BroadcastReceiver总是按照冷注册的顺序执行。 与其他app的干扰: 任何应用都可以向该registered receiver发送广播 (1)可以通过对广播添加权限来控制。 a. 定义新权限: b....

1 minute read

图片框架优缺点整理(Fresco和Glide)

在功能上,Picasso无法支持gif,在加载时会加载全尺寸的图片到内存,因为一般项目中都会有gif图的加载,所以暂时不考虑Picaso。不存在384和重复请求url的问题 Fresco https://github.com/facebook/fresco https://www.fresco-cn.org/ facebook 优点: Fresco会自动复用相同URL的缓存,两个相同URL同时进行请求Fresco也只会进行一次网络请求,然后第二个进行复用。 Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。 在5.0以下系统,Fresco将图片放到一个特别的内存区域。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。在更底层的Native层对OOM进行处理,图片将不再占用App的内存 支持渐进式的图片呈现 在加载gif图中,Fresco的java heap基本保持较低平稳状态,而Glide的java...

1 minute read

《设计模式》笔记(未完)

策略模式 观察者模式 装饰者模式 工厂模式 简单工厂 简单工厂模式是用一个工厂来创建对象。简单工厂抽象了产品对象(也可以不抽象)。工厂是一个直接引用的类,用来直接根据指定的参数来创建不同类型的对象。(一般用到的也就只是简单工厂了) 工厂模式 工厂模式是通过不同类型的工厂创建不同的对象。工厂模式抽象了产品对象和工厂,对外使用抽象的工厂,而不同产品的区分是由特定的工厂来决定的。特定的工厂可以按照简单工厂去实现。工厂生产出来的直接是面向对象的成品,只能创建一个具体产品类的实例。 抽象工厂模式 抽象工厂是为创建不同的产品族。抽象工厂抽象的产品族,(抽象中已经定义好了要生产哪些产品),工厂生产出来的是面向对象产品的组成部分,所以工厂产品生成也是可以抽象的。 具体工厂类可以创建多个产品,这些产品有一定的依赖关系。增加某一个产品的不同类型容易,但是难以增加新的类型的产品。比如可以增加原料的不同类型,但是增加新的原料不容易。 单件模式 简单单例 private static...

2 minute read

《Android高性能编程》-电量消耗

分析 检测电池电量和充电状态 BatteryManager会规律的发送Intent,可以捕获该content获知电池状态 Intent.ACTION_BATTERY_CHANGED 如果设备正在充电,我们可以最大限度地发挥所有操作。 BatteryManager.BATTERY_STATUS_CHARGING || BATTERY_STATUS_FULL 识别充电状态的变化 接收上面的广播 注册广播 ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED 获取信息 intent.getIntentExtra(BatteryManager.EXTRA_STATUS)...

1 minute read

《Android高性能编程》-提升技能的小技巧

位图 加载 BitMap.createScaledBitmap()方法在创建一个新的小图像之前,都会读取整个原图,造成了非必要的内存分配。一旦我们明确了图像要被缩放的分辨率,可以利用BitmapFactory.Options类,通过设置参数,高效地缩放图像。 BitmapRegionDecode类可以得到部分图像 流程:(file可以换为bytearray, resource, stream等) 加载(不处理位图)injustdecodebounds = true 读取图片分辨率 decodefile 计算比率 outHeight/desiredheight等 设置属性...

1 minute read

《Android高性能编程》-网络

预览 HttpClient, URLConnection 协议:Http,https, ftp, File, Jar 方法:GET, POST(connection.setDoOutput),其余通过 HttpURLConnection.setRequestMethod() 头部: URLConnection.setRequestProperty/ getHeaderFields 超时: 链接超时;读取超时...

1 minute read

《Android高性能编程》-多线程

预览 线程基础 Thread.run()方法并不会创建一个新线程,start()才能开启新线程 Thread.join()方法可以在它的子线程完成时恢复执行状态,在不知道要执行多久时可以调用。(一般情况不会恢复么,或者有没有回调什么的) 线程安全:一个多线程应用程序再共享对象上没有什么并发操作。 每个对象都有一个监视器,线程可以锁定或者解锁它,监视器确保同一时间只会被锁住一次。 Android多线程环境 进程的生命周期:Foreground, visible(非前台但可见), service, background, empty(不包含任何组件的进程,它被用作缓存的目的,以加快应用程序未来的恢复) 进程名以 :开始代表为该应用的私有进程,以小写字母开始为可共享进程。 Android应用程序线程...

1 minute read

《重构-改善既有代码的设计》-方法部分笔记

提炼函数:需要注释才能理解的代码,以更好的方式昭示代码意图 内联函数:内部代码和函数名称同样清晰易读 内联临时变量:某个临时变量被赋予某个函数的返回值,(改为final确定时候只被用过一次) 以查询取代临时变量:使得同一个类中其他部分也可以获取临时变量中计算的信息 引入注释性变量:表达式复杂难以解读。将复杂表达式的结果放进一个临时变量(多个条件&&   这样) 分解临时变量:某个临时变量被赋值超过一次,意味着承担了多个责任。 移除对参数的赋值:代码对参数复制,以一个临时变量取代该参数的位置 以函数对象取代函数:有一个大型函数,其中对局部变量的使用使你无法提炼函数。将这个函数放进一个单独对象,局部变量就成了对象中的字段,就可以分解为小函数,这些小函数可以共用这些字段。 替换算法:有更好的算法 搬移函数:某个函数与另一类进行更多交流 搬移字段: 某个字段被另一类更多用到 提炼类:某个类做个多个类应该做的事。(是改善并发程序的一种常用技术,因为它使你可以为提炼后的两个类分别加锁)...

1 minute read