1、Fragment:两种Adapter之间的区别
FragmentStatePagerAdapter会销毁不需要的Fragment,FragmentStatePageAdapter适用于Fragment较多的情况。而FragmentPageAdapter则适用于固定的,少量的Fragment情况。
2、BroadcastReceiver:本地广播LocalBroadcastReceiver
本地广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播,这样保证广播的安全性。
注意事项
本地广播无法通过静态注册来接收,相比起系统全局广播更加高效。
在广播中启动activity的话,需要为intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,因为需要一个栈来存放新打开的activity。
广播中弹出AlertDialog的话,需要设置对话框的类型为:TYPE_SYSTEM_ALERT不然是无法弹出的。
3、Service:onStartCommand的返回值,IntentService实现原理
START_STICKY:系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止。
4、AsyncTask,HandlerThread,LruCache,LinkedHashMap,SparseArray
AsyncTask即异步任务,是Android给我们提供的一个处理异步任务的类
HandlerThread一个继承自Thread的类HandlerThread,这个类对Java的Thread做了很多便利的封装。
LruCache应用缓存
LinkedHashMap:有序的HashMap
SparseArray:相比较HashMap更高效,适用于1000条一下数据
5、RecyclerView相比较ListView优点
从性能上看,RecyclerView并没有带来显著的提升,不需要频繁更新,暂不支持用动画,意味着RecyclerView优势也不太明显,没有太大的吸引力,ListView已经能很好地满足业务需求。
进一步来讲,结论是:列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用RecyclerView,更加强大完善,易扩展;其它情况(如微信卡包列表页)两者都OK,但ListView在使用上会更加方便,快捷。
6、约束布局ConstraintLayout(增强型的相对布局)
约束布局集LinearLayout(线性布局),RelativeLayout(相对布局),百分比布局等的功能于一身,功能强大,使用灵活。
7、APP启动
使用一个没有ActionBar的主题,比较快,而如果连StatusBar也去掉了,速度最快!
如果想提高APP的启动速度,尤其是使用Splash的App,务必将第一个Activity的主题设为FullScreen的,这样能有效提高启动速度
8、Android Lint工具
Android Studio使用Lint进行代码检查,它能够帮助我们检查项目中存在的问题,让我们更有规范性的开发App。
它能够检查出:xml文件里是否存在hardcode硬编码、unused resources没有使用到的资源、probable bug可能的bug等等。
9、被动定位
被动定位较少用(API=8加入),该方式非主动请求位置信息而是被动接收位置更新,最省电。App想获位置信息只需开一位置监听后等其它应用或服务主动发位置请求,App可同主动发请求组件同时接收更新。
10、Android闹钟
AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。
11、Android WakeLock
wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。
12、Android APK大小优化
pngquant是国外的一个有损的PNG压缩开源库,提供了命令行形式和源码库形式。
通过这个库的转化可以显著减少png文件大小(通常减少70%),并且保持原有透明度通道。
生成的图片文件可以兼容所有现代web浏览器,在IE6下比24-bit PNGs也有更好的表现。
13、Android APK Analyser
Android Studio中的 APK Analyser 将会拆解你的应用并让你知道 .apk 文件中的那个部分占据了大量空间。
14、Analyser下的classes.dex
classes.dex包含了所有 Java 代码。当你编译你的应用时,gradle 会将你的所有模块里的 .class 文件转换成 .dex 文件并将这些文件合成一个 classes.dex 文件。
单个的classes.dex文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。这将会创建另一个 classes1.dex 文件去存储剩下的方法。
可以通过混淆将未使用的方法移除来降低apk大小。
15、Android列表优化
▶ ItemView的变化
在我们根据数据类型来控制一个View的显隐时,会触发布局的重新测量、布局、绘制等操作,若itemView的布局比较复杂,重新测量绘制会很耗时间,引起列表卡顿。这个时候可以将数据和itemView分解成不同的类型,根据类型来绑定对应的itemView,减少布局的重绘操作。
▶ 重用OnClickListener
我们直接设置点击事件,在滑动列表时会不停的重复创建新的OnClickListener,旧的OnClickListener会被标记为需要垃圾回收,当需要回收的对象过多的时候会引起GC,导致列表卡顿。可以创建一个通用的OnClickListener,把数据放入Button的Tag中,根据id来判断是哪个Button执行了点击,来取出数据、执行不同的逻辑。
16、性能优化工具
TraceView、Systrace、调试GPU过度绘制 & GPU呈现模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker、LeakCanary、Lint。
17、ANR原理
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
造成ANR原因:
● Service Timeout:服务在20s内未执行完成;
● BroadcastQueue Timeout:比如前台广播在10s内执行完成
● ContentProvider Timeout:内容提供者执行超时
● inputDispatching Timeout:输入事件分发超时5s,包括按键分发事件的超时。
18、路由框架Arouter
路由:映射页面跳转关系的,当然它也包含跳转相关的一切功能。