一.Activity的生命周期
Android Activity 生命周期和重要的相关函数(基础一)
http://blog.csdn.net/whb20081815/article/details/77069519
1).A的Activity跳转到B的Activity
A onpause B oncreate B onstart B oresume Aonstop======B可见,A就不可见了(onResume:可见,Onstop:不可见)
2).onsaveInstance什么时候执行?
onSaveInstanceState方法在onPause方法之后执行在onStop方法之前执行
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。
1)当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。
(2)由于 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取 Bundle 对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。
(3)也可以选择实现 onRestoreInstanceState() ,而不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此不需要检查 Bundle 是否为null。
(4)onsaveInstance:保存了数据,oncreate和onRestoreInstancestate里面才有数据!
总结:横竖屏切换时候Activity的生命周期的总结
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
(不同的系统会有不一样的结果)
1)android 2.3之前的版本 android:configChanges="orientation|keyboardHidden"
2)android 3.0之后的版本 android:configChanges="orientation|screenSize"
问题:
Android 彻底弄懂Activity四大启动模式 和taskAffinity属性详解 intentFlag 图文解析
http://blog.csdn.net/whb20081815/article/details/7655933
stand,singleTak,singleInstance,sing启动模式
singleTask:栈中已经有该Activity的实例只有一个实例,启动的时候不会再New,一个实例,执行onNewIntent方法(上次的Activity移除)(一个栈里面它可以有它哈其他的Activity)
stand:标准,每次激活都会创建实例,放入到
singInstace:全局唯一,多个程序调用都会只有一个实例(一个栈里面只有它一个实例)
singletop;当前的Activity在栈顶的时候不会重新产生实例。
taskAffinit-------系统先查找是否在同一个栈,如果是直接启动,否则如果在清单文件里面设置了,则启动新的任务栈
new_flag_____启动Activity的时候,如果是从非Activity的Context启动的话,需要用这个参数,比如:升级通知栏里面的跳转
问题:
Acitiy基类的封装,里面封装了什么?
1.权限的封装
2.Dialog的封装
3.状态栏的封装
4.Toast
Fragment那些事情:
Android Activity和Fragment通信 切换 数据传值
http://blog.csdn.net/whb20081815/article/details/76854099
问题:
1.Fragment的生命周期,Acitivity启动fragment的生命周期分别是什么?
问题:
回退栈
添加的时候要addToBackStack(),返回的时候popBackStack(),然后可以通过fragmentManager得到count数量
问题
Activty和fragment是如何通信的?
fragment可以得到Activity的实例,就可以直接调用方法
Activity里面有fragment的引用:直接调用方法(Activity会new一个fragment)
Activiity里面没有fragment的应用:通过findtagById得到fragment,然后调用
其他通用的通信方案;handler,evenbus,广播,接口
问题:
fragment的状态保存
onsaveInstance和Activity一样的
问题:
replace和hide的区别
replace会重新加载fragment的生命周期,hide不会
Android UI适配
Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
http://blog.csdn.net/whb20081815/article/details/76937801
1.图片适配
xhdpi:对应的代表分别率是720P 1dp=2px
xxhdpi:对应的代表分辨率是1080P 1dp=3px
用一套图片,有些差距比较大的,在另外加些图,比如微信就是这么做的
2.普通的计算
计算公式:dp*ppi/160=px 320dp/160 相当于2px
3.精确的计算:通过百分比的形式
不同分辨率生成不同对应的px的值
问题:
UI切图,给了1080*720的分辨率,按钮距离左边的6px
你怎么算的,dimen怎么放置
也需要放几个不同的文件夹
xhdpi:1:1的关系,转化成dp就是 3dp
xxhpi:6px ,1:3的关系,转化成dp 就是2dp
二.线程和进程
问题:
1.线程分为UI线程和工作线程,用来执行一些耗时的操作
2.进程:有自己独立的内存和数据空间,一个APP可以有多一个进程,一个进程大概分配了32M。守护进程,相互拉活!
多进程可以让每个进程相互独立,扩大内容的容量。
问题:
如何创建进程?
1.在xml中设置
2.jni的native层,fork一个出来
问题:
多进程的失效的东西?
1.单列和静态变量
1). Android 价值千万 java线程专题:Wait¬ify&join&Yield
http://blog.csdn.net/whb20081815/article/details/65627387
2). Android 价值千万 java多线程同步 <二>Callable和Future&FutureTask
http://blog.csdn.net/whb20081815/article/details/65630694
3). Android 价值千万 java多线程<三>生产者消费者模型四种实现方法
http://blog.csdn.net/whb20081815/article/details/65635647
4).
Android 价值千万 java多线程同步 <四> synchronized&Lock&Atomic6种方式
http://blog.csdn.net/whb20081815/article/details/66971983
5).Android 价值千万java多线程同步 <五>CountDownLatch(计数器)和Semaphore(信号量)
http://blog.csdn.net/whb20081815/article/details/68498371
6). Android 厉害了ThreadLocal的工作原理和实例分析
http://blog.csdn.net/whb20081815/article/details/66974651
(7) Android 性能优化<八> 多线程优化和线程管理
http://blog.csdn.net/whb20081815/article/details/77775444
线程同步:
1.同步synchronized
2.强原子性AtomicInterger
3.重入锁ReentrantLock
4.LatchDown和信号量和阻塞队列(生产者和消费者,复杂的处理)
一个singleton如何实现线程的同步问题?
http://blog.csdn.net/a347911/article/details/53321803
3).你是如何管理你的线程池的?
ExecutorService:里面封装了,包括:工作队列、核心线程数、最大线程数
Executors工厂类
推荐使用Executors的工厂方法来创建线程池
线程池功能的不同归根到底还是内部的BlockingQueue实现不同
5种创建线程的方法
1、newFixedThreadPool()—>LinkedBlockingQueue
2、newSingleThreadExecutor()—>LinkedBlockingQueue
3、newCachedThreadPool()—>SynchronousQueue
4、newScheduledThreadPool()—>DelayedWorkQueue
5、newSingleThreadScheduledExecutor()—>DelayedWorkQueue
/** This cache uses a single background thread to evict entries. */
private final ExecutorService executorService = new ThreadPoolExecutor(0, 1,
60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
通常核
心线程数可以设为CPU数量+1,而最大线程数可以设为CPU的数量*2+1
。
Android AsyncTask 那些你不知道的事
http://blog.csdn.net/whb20081815/article/details/70332209
AsycTask的源代码:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory);
ThreadLocal:
解决多线程的问题,多个线程,为每个线程都保留一份副本(在线程中保存局部的变量),达到了线程隔离的效果(HashMap原理)
Sychnize:多个线程访问:访问一个副本和ThradLoca相反
安卓中的多线程
AsyncTask优点和缺点:
优点:自己管理线程,以前是多线程,后来会并发,改成了单线程,然后
缺点:导致内存泄漏,一个
AsyncTask只执行一次,要执行多个任务需要new多个AsyncTask.因为是单线程,所以还有慢的问题
所以规避方法是:通过这个方法可以设置默认的Exector:是根本的原因
SDefaultExecutor是一个静态的类,所以初始化。
@MainThread
public static void execute(Runnable runnable) {
sDefaultExecutor.execute(runnable);
}
int N = 5;
2 for (int i = 0; i < N; i++) {
3 Log.d(TAG,"asyncTask post Task:"+i);
4 new IAsyncTask().execute("asyncTask times:"+i); //点击Button后,在onClick方法中建立5个后台子线程。
5 }
handlerThread:主要是对线程还有Loop进行了封装。没有对Handler封装。
实例:行车记录仪,录制完成一个录制下一个。
为什么UI线程用单线程更新UI呢?
多线程刷新UI,导致
UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致:
- UI控件的操作变得很复杂。
- 加锁的操作必定会导致效率下降。
三.service的理解(生命周期不一样和是否绑定)
1).四大组件之一
2).没有界面在后台运行
3).启动方式有2种,startService:调用者和他没有联系,bindService和service绑定在一起
举一个简单的例子,最常用的Service就是音乐播放,如果你要startService的话,应用退出了,音乐还在播放。用bindService的话,程序退出了,音乐也就停了,是不是很容易理解呢!
问题:
Service的真正作用是什么?
可以提高程序的优先级,这是为什么不用线程来跑的原因
问题:
service是怎么和Actitiy通行的?
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
问题:
service如何常驻?
Android 永生不死的进程,进程守护,进程常驻,进程保活
http://blog.csdn.net/whb20081815/article/details/68943545
问题:
IntentService有什么优缺点?
Android IntentService——知道这个你就能去BAT
http://blog.csdn.net/whb20081815/article/details/72284472
0).对线程和handler进行了一个封装
1).用于一个线程在后台做完一件事情做另外一件事情
2).HandlerThread+Handler,任务加消息循环的形式
3).自动开启线程和自动停止服务.只需要调用方法就可以onHandler
Android 里面用的地方:Leacanay:内存泄漏工具里面的!
四:View
Android快速理解Activity、View及Window&WindowManager之间关系
http://blog.csdn.net/whb20081815/article/details/62419059
1). 理解Activity,View,Window三者关系
Activity:在Attch方法里面,创建了一个Windown对象(WindowPhone),通过setcontentView方法得到DecView,
结构:Activity----PhoneWinow-----View
Activity:我们可以直接操作,封装好视图
window方法不能直接new处理,封装好了,phoneWinow里面有一个rootview
WindowManager;管理add ,reduce,update
WindowManagerService:服务进程,看不到源代码,控制各种事件
为什么多了window,就是一个设计,好的封装
Android 性能优化<七>自定义view绘制优化
http://blog.csdn.net/whb20081815/article/details/74474736
Android 深入理解 View 的绘制流程和机制
http://blog.csdn.net/whb20081815/article/details/62236641
2).view的绘图机制
Android 深入理解 View 的绘制流程和机制
http://blog.csdn.net/whb20081815/article/details/62236641
从viewRootImel里面的
performTraversals开始由父控件往子控件开始遍历,执行view的onMesure,onLayout,ondraw。他们是否绘图是有个标志位
问题:3者的区别是什么
invalidate: 在主线程中调用
postInvalidate:在当前线程中调用,可以是工作线程
requestlayout: 先调用子类的requestLayout,然后往父级调用,最终调用onmesure,onlayou方法,不会调用Ondraw方法
3).View状态的保存
onSaveInstance,要对View设置唯一的ID,还有设置一个属性。
打个比喻:
Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,
这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料
为什么要设计Activity、View、Window?
因为这样的结构更好管理。就像为啥需要使用MVP、MVVM、各种设计模式一样。
五:Touch事件传递机制
Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
http://blog.csdn.net/whb20081815/article/details/62888575
分为2中:View的事件传递和ViewGroup的事件传递
1.事件的派发由父控件传给子控件
2.从ViewGroup的dispaTouchEvent开始
派发
3.ViewGroup的
拦截
,IntertouchEvent,默认是false
4.
消费
:不拦截执行子view的dispathTouchEvent方法----子view的ontouch---子view的onTouchEvent----子类的onclick方法
IntertouchEvent=true,父类拦截,父类的ontouch----弗雷的ontouchEvent方法
dispathTouchEvent(派发)---onInterOnTouchEvent(拦截)------消费OnTouchEvent()
比喻:领导都会把任务向下分派,一旦下面的人把事情做不好,就不会再把后续的任务交给下面的人来做了,只能自己亲自做,
如果自己也做不了,就只能告诉上级不能完成任务,上级又会重复他的过程。
另外,领导都有权利拦截任务,对下级隐瞒该任务,而直接自己去做,如果做不成,也只能向上级报告不能完成任务。
六:
Android中的几种动画
1. 3.0以前有2中:帧动画和补间动画,都是通过在XML里面写的一些,不能改变控件view的属性
2.属性动画:灵活性好,可以对View里面的某个对象和控件修改,动态修改背景,自定义估值器和擦值器,(ObjectAnimatin)
3.复杂的动画都是由多个不同的动画拼接而成的(AnimSet)
NineOldAndroids:第三方开源框架动画库
七
1).Android中跨进程通讯的几种方式
安卓中的四大组件,就是为了解决跨进程通信的问题
1.广播
2.contentProvide
3.Service里面常用的AIDL=====其实就是Binder机制
4.Activity
如调用系统通话应用(需要一个URI)
Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);
Android 以为几种通用的形式如下
5.Socket:知道Ip和端口号就可以通信了
6.文件,一个程序写文件,一个程序读文件。
Intent可以传递哪些数据类型?
2).AIDL理解
1.为了解决进程间的通信问题
2.原理就是binder机制
3.客户端不直接访问服务端,通过一个服务端的代理proxy访问服务端的stub,
客户端通过bindService,然后回调得到IBinder对象,然后把Binder转化为实例Service
4.proxy:客户端运行,把数据序列化传给服务端
stub:服务端运行,读取客户端数据,写入值
3.binder机制
Android Binder 作为 IPC 机制原理和面试回答
http://blog.csdn.net/whb20081815/article/details/74436204
client ,server,binder驱动,serviceManager
1.client不能直接访问Server,通过代理对象ServiceManaager访问
应用程序(Client) 首先向 Service Manager 发送请求 WindowManager 的服务,
Service Manager 查看已经注册在里面的服务的列表,找到相应的服务后,
通过 Binder kernel 将其中的 Binder 对象返回给客户端,从而完成对服务的请求。
总结:
client通过ServiceManager把Service注册
client访问的时候找到注册的服务后,通过Binder驱动把Binder对象返回给客户端
核心控件是Binder驱动,client对Binder驱动,Server也是对Binder驱动的控制
ServiceManager主要是提供注册,并且管理Server的,向客户端提供查询服务(就是可以得到服务端的代理)!
八:数据库
Android 性能优化 (二)数据库优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70142033
Android 数据库升级 数据迁移 数据不丢失
http://blog.csdn.net/whb20081815/article/details/77011860
1.数据库的升级
步骤如下:
把旧表重新命名:A_temp
创建一个新的表:A
把A_temp的数据插入到A表当中
郭霖 第三方的数据库:
LitePal是一款开源的android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发时最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表、増删改查的操作
2).数据库的同步问题
就是多线程的同步问题
3).数据库的事务
同时写入失败或者成功,没有脏数据或者不同步的情况
4).数据库的插入效率问题
用事务+sqlitStateMent的最好方法
ContentProvide
Android ContentProvider 完全解析及DEMO(最具说服力)
http://blog.csdn.net/whb20081815/article/details/71159549
1).为什么用contentProvide
1.为了共享数据,通过暴露URi
2.不同的URi.不同的权限访问
3.不需要管理生命周期,更好的封装
2)多进程访问ContetProvider反应
其实是通过binder机制,每个进程都有自己的binder线程池访问
3).什么时候启动ContentProvider,它里面的方法运行在哪?
Application之前,oncreate方法运行在主线程(UI线程里面),其他的onupdate,insert()运行在调用者的binder进程的工作线程
七:Handler原理
looper对象:消息循环
messagerque:消息队列
msg:需要处理的消息
handler;发消息和处理消息
步骤:prepare得到一个looper对象,loop.loop.里面先得到一个
messagerque,然后开始轮询消息,
handler是sendmsg,把msg存放在消息队列Messagerque
Hanler机制
Android Handle消息机制:秒懂Looper、Handler、Message三者关系
http://blog.csdn.net/whb20081815/article/details/67639060
自己的总结:
Looper:负责管理当前线程的消息队列,在构造方法中产生一个messageQueue对象,prepre方法是创建ThreadLocal,looper方法:for循环,不断的循环消息
Handler:发送消息:把msg放到messagerqueue中,接受消息,和处理消息
MessageQueue:消息队列,单链表结构
messager:消息
一句话描述:
Looper不断循环消息,通过Handler把Msg放到MessageQueue中,然后通过handler处理消息,调用handler的dispathmessger方法
九:Fragment
Android Activity和Fragment通信 切换 数据传值
http://blog.csdn.net/whb20081815/article/details/76854099
十:网络知识:
网络请求
Http和https,socket
HTTP、TCP、UDP,Socket,HTTPS(史上最强理解,没有之一)
http://blog.csdn.net/whb20081815/article/details/67640804
十一:
性能优化
1).view的绘制 view
2).内存 merrory
3).线程 IO
4). 响应 ANR
Android 性能优化 (一)APK高效瘦身
http://blog.csdn.net/whb20081815/article/details/70140063
Android 性能优化 (二)数据库优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70142033
Android 性能优化(三)布局优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70147958
Android 性能优化(四)内存优化OOM 秒变大神
http://blog.csdn.net/whb20081815/article/details/70243105
Android 性能优化(五)ANR 秒变大神
http://blog.csdn.net/whb20081815/article/details/70245594
Android 性能优化(六) RelativeLayout和LinearLayout性能比较
http://blog.csdn.net/whb20081815/article/details/74465870
Android 性能优化<七>自定义view绘制优化
http://blog.csdn.net/whb20081815/article/details/74474736
Android 性能优化<八> 多线程优化和线程管理
http://blog.csdn.net/whb20081815/article/details/77775444
Android 性能优化<九> RecyclerView替代Listview用法
http://blog.csdn.net/whb20081815/article/details/76221998
Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache
http://blog.csdn.net/whb20081815/article/details/68493509
1.内存泄露
为什么会导致内存泄露?
存在无效的引用,导致Gc不能及时回收对象,产生了内存泄露
场景
1.非静态内部类
默认持有外部类的引用,如果Actiity退出,内部类还有引用Activity的Context
AsyncTask,Handler,线程
2.静态view,静态Activity
静态view默认持有Context的引用
3.注册类监听器,广播,动画,定时器
4.图片回收,数据库cursor游标
总结:主要都是持有Activity的引用
工具:learycary
DDMS的heap工具
MAT工具(
Memory Analyzer Tool)
)
一,内存分配:
Java虚拟机是先一次性分配一块较大的空间,然后每次new时都在该空间上进行分配和释放,减少了系统调用的次数,节省了一定的开销,这有点类似于
内存池的概念;二是有了这块空间过后,如何进行分配和回收就跟GC机制有关了。
java一般内存申请有两种:静态内存和动态内存
。
很容易理解,编译时就能够确定的内存就是静态内存,即内存是固定的,系统一次性分配,比如int类型变量;动态内存分配就是在程序执行时才知道要分配的存储空间大小,比如java对象的内存空间。
来源: http://blog.csdn.net/qq_35681180/article/details/53290466
GC的回收机机制:
一种树形结构,GC从根节点开始遍历,对于没有直接引用的对象,GC就会回收,不可达的就会被回收
现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。
如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象时“可达”,哪些对象时“不可达”。当对象不可达的时候,即对象不再被引用的时候,就会被垃圾回收。
检测方式有2种方法:
1.
引用计数法
2.
可达性分析算法
什么时候回收?
系统决定,当系统内存不足的的时候会自己调用
能说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。
分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等……
问题:说说你对ANR的理解?
程序在一定时间没有响应就会报ANR,有4中情况
1.按键分发事件5s,2.servcie10s 3.contentprovide。 4.广播20s
不要阻塞UI线程,把耗时操作房子工作线程,IO,数据库,网络请求,还有一种死锁
解决办法:看CPU消耗,内存占用,io线程
看文件:
1.monkey日志
2.data/anr/trace.txt文件
还有其他的工具如:traceview
2.自己做一个图片加载框架
Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache
http://blog.csdn.net/whb20081815/article/details/68493509
Android List,Set,Map集合安全 集合区别 并发集合类性能分析
http://blog.csdn.net/whb20081815/article/details/70291412
三级缓存:内存----文件----网络
1.LruCache----内存缓存:用的linkHashMap,通过LinkHashMap,加上算法和内存缓存,保留最近常用的对象
2..DiskLruCache----------硬盘缓存,用的也是LinkHashMap,通过流的操作,写入到SD里面,同时会有版本控制version和脏数据的控制
做图片墙还需要解决的问题
1.图片压缩--option
2.缓存问题
3.图片错位
4.多线程控制加载图片,Handler机制,looper,线程池加载
5.getview里面contentview代码的复用
6.提升速度:滑动的时候不加载,停止的时候加载图片,这样就不会卡顿了
问题:
linkHashMap的原理和数据结构是怎样的?
双链表结构,有序的
最近使用原则:最新的添加到尾部,删除的时候从头部删起
十二:
设计模式和架构模式:
Android 超越官方 MVC架构 MVP架构 MVVM架构 一网打尽;
http://blog.csdn.net/whb20081815/article/details/68948856
十二:
插件化和热修复
1.Android Binder 作为 IPC 机制原理和面试回答
http://blog.csdn.net/whb20081815/article/details/74436204
2.
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
3.
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
4.
Android反射(Reflect)完全解析--强势来袭
http://blog.csdn.net/whb20081815/article/details/61198050
5.
Android 2分钟学会xUtils 注解 Annotation(实例+原理)
http://blog.csdn.net/whb20081815/article/details/62423840
6.
Android 上下文Context(最权威的官方教程)
http://blog.csdn.net/whb20081815/article/details/70258715
7.
Android Activty的加载过程 启动流程 源码分析
http://blog.csdn.net/whb20081815/article/details/76596473
.android重要术语解释
- 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
- 2.ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
- 3.ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
- 4.ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
- 5.Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
- 6.ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
- 7.ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
- 8.TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。
十三:
算法
Android 程序员必须知道的8个算法及其时间复杂度讲解
http://blog.csdn.net/whb20081815/article/details/75669464
插入排序:像扑克牌一样,对应前面是有序的数据,然后比较index,index数据和前面的数据分别比价一次
希尔排序:是插入排序的升级版本,先通过Gap进行分组,然后分别进行插入排序,知道Gap=1,进行最后一次插入排序
选择排序:第一次得到最大值,然后得到最二大的值
堆排序:是选择排序的一种扩展,构建堆,调整堆的结构,达到节点的值要比它的子节点的值都要大或者小
冒泡排序:相邻的数据进行两两的交换,第一趟得到最大值,第二趟.........像水里的气泡一样
快速排序:是冒泡排序的一种,找中间点,一左一右,然后得到中间值,中间值比前面的要大,比后面的小,然后循环
归并排序:分成多个数组,把每个数组有序(用插入排序方法),然后合并数组
基数排序:把所有个位数1的一组,2的一组,然后得到排序,个位数排一次+十位数排一次+百位数排一次
总结:
选择排序和冒泡排序的区别:共同点:先找到最大值或者最小值,不同点:选择排序是循环遍历,冒泡排序是:相邻的俩俩交换
希尔排序和快速排序:共同点:分组,希尔是:Gap,快速排序是 :得到中间值 归并排序相反:先分数组,然后合并数组。
十四;
加密
Android 最全的AES加密算法及其实现(前所未有的震撼)
http://blog.csdn.net/whb20081815/article/details/73997645
十五:源码解读
activty的加载过程 请详细介绍下:
Android Activty的加载过程 启动流程 源码分析
http://blog.csdn.net/whb20081815/article/details/76596473
十六:设计模式
1.Android 最常用的设计模式一 安卓源码分析—单例模式singleInstance
http://blog.csdn.net/whb20081815/article/details/77970206
2.
Android 最常用的设计模式二 安卓源码分析——组合模式(component)
http://blog.csdn.net/whb20081815/article/details/77980367
3.
Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
http://blog.csdn.net/whb20081815/article/details/77970133
4.Android 最常用的设计模式四 安卓源码分析——模板方法(Mould)
http://blog.csdn.net/whb20081815/article/details/77984746
5.Android 最常用的设计模式五 安卓源码分析——建造者模式
http://blog.csdn.net/whb20081815/article/details/77970093
6.
Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
http://blog.csdn.net/whb20081815/article/details/77970159
7.Android 最常用的设计模式九 安卓源码分析—— 适配器模式(Adapter)
http://blog.csdn.net/whb20081815/article/details/77993858
8.
Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
http://blog.csdn.net/whb20081815/article/details/77991430
9.Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
http://blog.csdn.net/whb20081815/article/details/77982008
单例模式分为
Application
饿汉式单例和懒汉式单例
饿汉式单例:类初始化的时候直接new 出来了
懒汉式单例:调用的时候才new出来
场景:
组合模式:
view和viewgroup:
整体和部分的关系
有部件,还有一个共同的行为
场景:去不同的加盟店刷卡,只要是那个卡,不同的分店都可以
观察者模式:
evenbus
观察者和被观察者
需要注册事件,
一个变量发生了改变,其他注册过这个事件的,都话通知
场景:订阅了天气预报的短信,有天气发生变化,它会主动通知你
模板方法:
view
父类和子类的关系,继承,子类继承父类的一些属性,同时子类也可以自己扩展自己得一些方法
场景:有一个医生,有很多理想,然后他把医术传给了儿子,儿子按照他父亲的意志,开始他的一片天
构造者模式:
dialog,ImageLoader
需要什么构建什么,可以不用在构造函数中设置太多了变量,替代set方法
工厂方法
线程,和bitmapfactory
为了解决:不同的需求,切换方案的时候非常方便,简单,减低代码的耦合
场景:客户需要这个APP,它需要不同UI,不同的客户需要不同的UI
适配器模式
adapter:
场景:用户家里是220v的电压,但是这个设备是5v电压,我们需要转换,中间多了一层
策略模式:
animation:线性插值器,加速插值器,减速插值器,不同的算法在里面
有一个共同的接口,然后采用不同的方法封装,实现不同的功能,这就是策略模式
场景:约会有很多种方式,有的带她们去海边,有的带她去看电影
一.Activity的生命周期
Android Activity 生命周期和重要的相关函数(基础一)
http://blog.csdn.net/whb20081815/article/details/77069519
1).A的Activity跳转到B的Activity
A onpause B oncreate B onstart B oresume Aonstop======B可见,A就不可见了(onResume:可见,Onstop:不可见)
2).onsaveInstance什么时候执行?
onSaveInstanceState方法在onPause方法之后执行在onStop方法之前执行
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。
1)当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。
(2)由于 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取 Bundle 对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。
(3)也可以选择实现 onRestoreInstanceState() ,而不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此不需要检查 Bundle 是否为null。
(4)onsaveInstance:保存了数据,oncreate和onRestoreInstancestate里面才有数据!
总结:横竖屏切换时候Activity的生命周期的总结
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
(不同的系统会有不一样的结果)
1)android 2.3之前的版本 android:configChanges="orientation|keyboardHidden"
2)android 3.0之后的版本 android:configChanges="orientation|screenSize"
问题:
Android 彻底弄懂Activity四大启动模式 和taskAffinity属性详解 intentFlag 图文解析
http://blog.csdn.net/whb20081815/article/details/7655933
stand,singleTak,singleInstance,sing启动模式
singleTask:栈中已经有该Activity的实例只有一个实例,启动的时候不会再New,一个实例,执行onNewIntent方法(上次的Activity移除)(一个栈里面它可以有它哈其他的Activity)
stand:标准,每次激活都会创建实例,放入到
singInstace:全局唯一,多个程序调用都会只有一个实例(一个栈里面只有它一个实例)
singletop;当前的Activity在栈顶的时候不会重新产生实例。
taskAffinit-------系统先查找是否在同一个栈,如果是直接启动,否则如果在清单文件里面设置了,则启动新的任务栈
new_flag_____启动Activity的时候,如果是从非Activity的Context启动的话,需要用这个参数,比如:升级通知栏里面的跳转
问题:
Acitiy基类的封装,里面封装了什么?
1.权限的封装
2.Dialog的封装
3.状态栏的封装
4.Toast
Fragment那些事情:
Android Activity和Fragment通信 切换 数据传值
http://blog.csdn.net/whb20081815/article/details/76854099
问题:
1.Fragment的生命周期,Acitivity启动fragment的生命周期分别是什么?
问题:
回退栈
添加的时候要addToBackStack(),返回的时候popBackStack(),然后可以通过fragmentManager得到count数量
问题
Activty和fragment是如何通信的?
fragment可以得到Activity的实例,就可以直接调用方法
Activity里面有fragment的引用:直接调用方法(Activity会new一个fragment)
Activiity里面没有fragment的应用:通过findtagById得到fragment,然后调用
其他通用的通信方案;handler,evenbus,广播,接口
问题:
fragment的状态保存
onsaveInstance和Activity一样的
问题:
replace和hide的区别
replace会重新加载fragment的生命周期,hide不会
Android UI适配
Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
http://blog.csdn.net/whb20081815/article/details/76937801
1.图片适配
xhdpi:对应的代表分别率是720P 1dp=2px
xxhdpi:对应的代表分辨率是1080P 1dp=3px
用一套图片,有些差距比较大的,在另外加些图,比如微信就是这么做的
2.普通的计算
计算公式:dp*ppi/160=px 320dp/160 相当于2px
3.精确的计算:通过百分比的形式
不同分辨率生成不同对应的px的值
问题:
UI切图,给了1080*720的分辨率,按钮距离左边的6px
你怎么算的,dimen怎么放置
也需要放几个不同的文件夹
xhdpi:1:1的关系,转化成dp就是 3dp
xxhpi:6px ,1:3的关系,转化成dp 就是2dp
二.线程和进程
问题:
1.线程分为UI线程和工作线程,用来执行一些耗时的操作
2.进程:有自己独立的内存和数据空间,一个APP可以有多一个进程,一个进程大概分配了32M。守护进程,相互拉活!
多进程可以让每个进程相互独立,扩大内容的容量。
问题:
如何创建进程?
1.在xml中设置
2.jni的native层,fork一个出来
问题:
多进程的失效的东西?
1.单列和静态变量
1). Android 价值千万 java线程专题:Wait¬ify&join&Yield
http://blog.csdn.net/whb20081815/article/details/65627387
2). Android 价值千万 java多线程同步 <二>Callable和Future&FutureTask
http://blog.csdn.net/whb20081815/article/details/65630694
3). Android 价值千万 java多线程<三>生产者消费者模型四种实现方法
http://blog.csdn.net/whb20081815/article/details/65635647
4).
Android 价值千万 java多线程同步 <四> synchronized&Lock&Atomic6种方式
http://blog.csdn.net/whb20081815/article/details/66971983
5).Android 价值千万java多线程同步 <五>CountDownLatch(计数器)和Semaphore(信号量)
http://blog.csdn.net/whb20081815/article/details/68498371
6). Android 厉害了ThreadLocal的工作原理和实例分析
http://blog.csdn.net/whb20081815/article/details/66974651
(7) Android 性能优化<八> 多线程优化和线程管理
http://blog.csdn.net/whb20081815/article/details/77775444
线程同步:
1.同步synchronized
2.强原子性AtomicInterger
3.重入锁ReentrantLock
4.LatchDown和信号量和阻塞队列(生产者和消费者,复杂的处理)
一个singleton如何实现线程的同步问题?
http://blog.csdn.net/a347911/article/details/53321803
3).你是如何管理你的线程池的?
ExecutorService:里面封装了,包括:工作队列、核心线程数、最大线程数
Executors工厂类
推荐使用Executors的工厂方法来创建线程池
线程池功能的不同归根到底还是内部的BlockingQueue实现不同
5种创建线程的方法
1、newFixedThreadPool()—>LinkedBlockingQueue
2、newSingleThreadExecutor()—>LinkedBlockingQueue
3、newCachedThreadPool()—>SynchronousQueue
4、newScheduledThreadPool()—>DelayedWorkQueue
5、newSingleThreadScheduledExecutor()—>DelayedWorkQueue
/** This cache uses a single background thread to evict entries. */
private final ExecutorService executorService = new ThreadPoolExecutor(0, 1,
60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
通常核
心线程数可以设为CPU数量+1,而最大线程数可以设为CPU的数量*2+1
。
Android AsyncTask 那些你不知道的事
http://blog.csdn.net/whb20081815/article/details/70332209
AsycTask的源代码:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory);
ThreadLocal:
解决多线程的问题,多个线程,为每个线程都保留一份副本(在线程中保存局部的变量),达到了线程隔离的效果(HashMap原理)
Sychnize:多个线程访问:访问一个副本和ThradLoca相反
安卓中的多线程
AsyncTask优点和缺点:
优点:自己管理线程,以前是多线程,后来会并发,改成了单线程,然后
缺点:导致内存泄漏,一个
AsyncTask只执行一次,要执行多个任务需要new多个AsyncTask.因为是单线程,所以还有慢的问题
所以规避方法是:通过这个方法可以设置默认的Exector:是根本的原因
SDefaultExecutor是一个静态的类,所以初始化。
@MainThread
public static void execute(Runnable runnable) {
sDefaultExecutor.execute(runnable);
}
int N = 5;
2 for (int i = 0; i < N; i++) {
3 Log.d(TAG,"asyncTask post Task:"+i);
4 new IAsyncTask().execute("asyncTask times:"+i); //点击Button后,在onClick方法中建立5个后台子线程。
5 }
handlerThread:主要是对线程还有Loop进行了封装。没有对Handler封装。
实例:行车记录仪,录制完成一个录制下一个。
为什么UI线程用单线程更新UI呢?
多线程刷新UI,导致
UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致:
- UI控件的操作变得很复杂。
- 加锁的操作必定会导致效率下降。
三.service的理解(生命周期不一样和是否绑定)
1).四大组件之一
2).没有界面在后台运行
3).启动方式有2种,startService:调用者和他没有联系,bindService和service绑定在一起
举一个简单的例子,最常用的Service就是音乐播放,如果你要startService的话,应用退出了,音乐还在播放。用bindService的话,程序退出了,音乐也就停了,是不是很容易理解呢!
问题:
Service的真正作用是什么?
可以提高程序的优先级,这是为什么不用线程来跑的原因
问题:
service是怎么和Actitiy通行的?
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
问题:
service如何常驻?
Android 永生不死的进程,进程守护,进程常驻,进程保活
http://blog.csdn.net/whb20081815/article/details/68943545
问题:
IntentService有什么优缺点?
Android IntentService——知道这个你就能去BAT
http://blog.csdn.net/whb20081815/article/details/72284472
0).对线程和handler进行了一个封装
1).用于一个线程在后台做完一件事情做另外一件事情
2).HandlerThread+Handler,任务加消息循环的形式
3).自动开启线程和自动停止服务.只需要调用方法就可以onHandler
Android 里面用的地方:Leacanay:内存泄漏工具里面的!
四:View
Android快速理解Activity、View及Window&WindowManager之间关系
http://blog.csdn.net/whb20081815/article/details/62419059
1). 理解Activity,View,Window三者关系
Activity:在Attch方法里面,创建了一个Windown对象(WindowPhone),通过setcontentView方法得到DecView,
结构:Activity----PhoneWinow-----View
Activity:我们可以直接操作,封装好视图
window方法不能直接new处理,封装好了,phoneWinow里面有一个rootview
WindowManager;管理add ,reduce,update
WindowManagerService:服务进程,看不到源代码,控制各种事件
为什么多了window,就是一个设计,好的封装
Android 性能优化<七>自定义view绘制优化
http://blog.csdn.net/whb20081815/article/details/74474736
Android 深入理解 View 的绘制流程和机制
http://blog.csdn.net/whb20081815/article/details/62236641
2).view的绘图机制
Android 深入理解 View 的绘制流程和机制
http://blog.csdn.net/whb20081815/article/details/62236641
从viewRootImel里面的
performTraversals开始由父控件往子控件开始遍历,执行view的onMesure,onLayout,ondraw。他们是否绘图是有个标志位
问题:3者的区别是什么
invalidate: 在主线程中调用
postInvalidate:在当前线程中调用,可以是工作线程
requestlayout: 先调用子类的requestLayout,然后往父级调用,最终调用onmesure,onlayou方法,不会调用Ondraw方法
3).View状态的保存
onSaveInstance,要对View设置唯一的ID,还有设置一个属性。
打个比喻:
Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,
这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料
为什么要设计Activity、View、Window?
因为这样的结构更好管理。就像为啥需要使用MVP、MVVM、各种设计模式一样。
五:Touch事件传递机制
Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
http://blog.csdn.net/whb20081815/article/details/62888575
分为2中:View的事件传递和ViewGroup的事件传递
1.事件的派发由父控件传给子控件
2.从ViewGroup的dispaTouchEvent开始
派发
3.ViewGroup的
拦截
,IntertouchEvent,默认是false
4.
消费
:不拦截执行子view的dispathTouchEvent方法----子view的ontouch---子view的onTouchEvent----子类的onclick方法
IntertouchEvent=true,父类拦截,父类的ontouch----弗雷的ontouchEvent方法
dispathTouchEvent(派发)---onInterOnTouchEvent(拦截)------消费OnTouchEvent()
比喻:领导都会把任务向下分派,一旦下面的人把事情做不好,就不会再把后续的任务交给下面的人来做了,只能自己亲自做,
如果自己也做不了,就只能告诉上级不能完成任务,上级又会重复他的过程。
另外,领导都有权利拦截任务,对下级隐瞒该任务,而直接自己去做,如果做不成,也只能向上级报告不能完成任务。
六:
Android中的几种动画
1. 3.0以前有2中:帧动画和补间动画,都是通过在XML里面写的一些,不能改变控件view的属性
2.属性动画:灵活性好,可以对View里面的某个对象和控件修改,动态修改背景,自定义估值器和擦值器,(ObjectAnimatin)
3.复杂的动画都是由多个不同的动画拼接而成的(AnimSet)
NineOldAndroids:第三方开源框架动画库
七
1).Android中跨进程通讯的几种方式
安卓中的四大组件,就是为了解决跨进程通信的问题
1.广播
2.contentProvide
3.Service里面常用的AIDL=====其实就是Binder机制
4.Activity
如调用系统通话应用(需要一个URI)
Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);
Android 以为几种通用的形式如下
5.Socket:知道Ip和端口号就可以通信了
6.文件,一个程序写文件,一个程序读文件。
Intent可以传递哪些数据类型?
2).AIDL理解
1.为了解决进程间的通信问题
2.原理就是binder机制
3.客户端不直接访问服务端,通过一个服务端的代理proxy访问服务端的stub,
客户端通过bindService,然后回调得到IBinder对象,然后把Binder转化为实例Service
4.proxy:客户端运行,把数据序列化传给服务端
stub:服务端运行,读取客户端数据,写入值
3.binder机制
Android Binder 作为 IPC 机制原理和面试回答
http://blog.csdn.net/whb20081815/article/details/74436204
client ,server,binder驱动,serviceManager
1.client不能直接访问Server,通过代理对象ServiceManaager访问
应用程序(Client) 首先向 Service Manager 发送请求 WindowManager 的服务,
Service Manager 查看已经注册在里面的服务的列表,找到相应的服务后,
通过 Binder kernel 将其中的 Binder 对象返回给客户端,从而完成对服务的请求。
总结:
client通过ServiceManager把Service注册
client访问的时候找到注册的服务后,通过Binder驱动把Binder对象返回给客户端
核心控件是Binder驱动,client对Binder驱动,Server也是对Binder驱动的控制
ServiceManager主要是提供注册,并且管理Server的,向客户端提供查询服务(就是可以得到服务端的代理)!
八:数据库
Android 性能优化 (二)数据库优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70142033
Android 数据库升级 数据迁移 数据不丢失
http://blog.csdn.net/whb20081815/article/details/77011860
1.数据库的升级
步骤如下:
把旧表重新命名:A_temp
创建一个新的表:A
把A_temp的数据插入到A表当中
郭霖 第三方的数据库:
LitePal是一款开源的android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发时最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表、増删改查的操作
2).数据库的同步问题
就是多线程的同步问题
3).数据库的事务
同时写入失败或者成功,没有脏数据或者不同步的情况
4).数据库的插入效率问题
用事务+sqlitStateMent的最好方法
ContentProvide
Android ContentProvider 完全解析及DEMO(最具说服力)
http://blog.csdn.net/whb20081815/article/details/71159549
1).为什么用contentProvide
1.为了共享数据,通过暴露URi
2.不同的URi.不同的权限访问
3.不需要管理生命周期,更好的封装
2)多进程访问ContetProvider反应
其实是通过binder机制,每个进程都有自己的binder线程池访问
3).什么时候启动ContentProvider,它里面的方法运行在哪?
Application之前,oncreate方法运行在主线程(UI线程里面),其他的onupdate,insert()运行在调用者的binder进程的工作线程
七:Handler原理
looper对象:消息循环
messagerque:消息队列
msg:需要处理的消息
handler;发消息和处理消息
步骤:prepare得到一个looper对象,loop.loop.里面先得到一个
messagerque,然后开始轮询消息,
handler是sendmsg,把msg存放在消息队列Messagerque
Hanler机制
Android Handle消息机制:秒懂Looper、Handler、Message三者关系
http://blog.csdn.net/whb20081815/article/details/67639060
自己的总结:
Looper:负责管理当前线程的消息队列,在构造方法中产生一个messageQueue对象,prepre方法是创建ThreadLocal,looper方法:for循环,不断的循环消息
Handler:发送消息:把msg放到messagerqueue中,接受消息,和处理消息
MessageQueue:消息队列,单链表结构
messager:消息
一句话描述:
Looper不断循环消息,通过Handler把Msg放到MessageQueue中,然后通过handler处理消息,调用handler的dispathmessger方法
九:Fragment
Android Activity和Fragment通信 切换 数据传值
http://blog.csdn.net/whb20081815/article/details/76854099
十:网络知识:
网络请求
Http和https,socket
HTTP、TCP、UDP,Socket,HTTPS(史上最强理解,没有之一)
http://blog.csdn.net/whb20081815/article/details/67640804
十一:
性能优化
1).view的绘制 view
2).内存 merrory
3).线程 IO
4). 响应 ANR
Android 性能优化 (一)APK高效瘦身
http://blog.csdn.net/whb20081815/article/details/70140063
Android 性能优化 (二)数据库优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70142033
Android 性能优化(三)布局优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70147958
Android 性能优化(四)内存优化OOM 秒变大神
http://blog.csdn.net/whb20081815/article/details/70243105
Android 性能优化(五)ANR 秒变大神
http://blog.csdn.net/whb20081815/article/details/70245594
Android 性能优化(六) RelativeLayout和LinearLayout性能比较
http://blog.csdn.net/whb20081815/article/details/74465870
Android 性能优化<七>自定义view绘制优化
http://blog.csdn.net/whb20081815/article/details/74474736
Android 性能优化<八> 多线程优化和线程管理
http://blog.csdn.net/whb20081815/article/details/77775444
Android 性能优化<九> RecyclerView替代Listview用法
http://blog.csdn.net/whb20081815/article/details/76221998
Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache
http://blog.csdn.net/whb20081815/article/details/68493509
1.内存泄露
为什么会导致内存泄露?
存在无效的引用,导致Gc不能及时回收对象,产生了内存泄露
场景
1.非静态内部类
默认持有外部类的引用,如果Actiity退出,内部类还有引用Activity的Context
AsyncTask,Handler,线程
2.静态view,静态Activity
静态view默认持有Context的引用
3.注册类监听器,广播,动画,定时器
4.图片回收,数据库cursor游标
总结:主要都是持有Activity的引用
工具:learycary
DDMS的heap工具
MAT工具(
Memory Analyzer Tool)
)
一,内存分配:
Java虚拟机是先一次性分配一块较大的空间,然后每次new时都在该空间上进行分配和释放,减少了系统调用的次数,节省了一定的开销,这有点类似于
内存池的概念;二是有了这块空间过后,如何进行分配和回收就跟GC机制有关了。
java一般内存申请有两种:静态内存和动态内存
。
很容易理解,编译时就能够确定的内存就是静态内存,即内存是固定的,系统一次性分配,比如int类型变量;动态内存分配就是在程序执行时才知道要分配的存储空间大小,比如java对象的内存空间。
来源: http://blog.csdn.net/qq_35681180/article/details/53290466
GC的回收机机制:
一种树形结构,GC从根节点开始遍历,对于没有直接引用的对象,GC就会回收,不可达的就会被回收
现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。
如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象时“可达”,哪些对象时“不可达”。当对象不可达的时候,即对象不再被引用的时候,就会被垃圾回收。
检测方式有2种方法:
1.
引用计数法
2.
可达性分析算法
什么时候回收?
系统决定,当系统内存不足的的时候会自己调用
能说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。
分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等……
问题:说说你对ANR的理解?
程序在一定时间没有响应就会报ANR,有4中情况
1.按键分发事件5s,2.servcie10s 3.contentprovide。 4.广播20s
不要阻塞UI线程,把耗时操作房子工作线程,IO,数据库,网络请求,还有一种死锁
解决办法:看CPU消耗,内存占用,io线程
看文件:
1.monkey日志
2.data/anr/trace.txt文件
还有其他的工具如:traceview
2.自己做一个图片加载框架
Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache
http://blog.csdn.net/whb20081815/article/details/68493509
Android List,Set,Map集合安全 集合区别 并发集合类性能分析
http://blog.csdn.net/whb20081815/article/details/70291412
三级缓存:内存----文件----网络
1.LruCache----内存缓存:用的linkHashMap,通过LinkHashMap,加上算法和内存缓存,保留最近常用的对象
2..DiskLruCache----------硬盘缓存,用的也是LinkHashMap,通过流的操作,写入到SD里面,同时会有版本控制version和脏数据的控制
做图片墙还需要解决的问题
1.图片压缩--option
2.缓存问题
3.图片错位
4.多线程控制加载图片,Handler机制,looper,线程池加载
5.getview里面contentview代码的复用
6.提升速度:滑动的时候不加载,停止的时候加载图片,这样就不会卡顿了
问题:
linkHashMap的原理和数据结构是怎样的?
双链表结构,有序的
最近使用原则:最新的添加到尾部,删除的时候从头部删起
十二:
设计模式和架构模式:
Android 超越官方 MVC架构 MVP架构 MVVM架构 一网打尽;
http://blog.csdn.net/whb20081815/article/details/68948856
十二:
插件化和热修复
1.Android Binder 作为 IPC 机制原理和面试回答
http://blog.csdn.net/whb20081815/article/details/74436204
2.
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
3.
Android AIDL进程IPC通信 一次就好
http://blog.csdn.net/whb20081815/article/details/70766913
4.
Android反射(Reflect)完全解析--强势来袭
http://blog.csdn.net/whb20081815/article/details/61198050
5.
Android 2分钟学会xUtils 注解 Annotation(实例+原理)
http://blog.csdn.net/whb20081815/article/details/62423840
6.
Android 上下文Context(最权威的官方教程)
http://blog.csdn.net/whb20081815/article/details/70258715
7.
Android Activty的加载过程 启动流程 源码分析
http://blog.csdn.net/whb20081815/article/details/76596473
.android重要术语解释
- 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
- 2.ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
- 3.ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
- 4.ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
- 5.Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
- 6.ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
- 7.ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
- 8.TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。
十三:
算法
Android 程序员必须知道的8个算法及其时间复杂度讲解
http://blog.csdn.net/whb20081815/article/details/75669464
插入排序:像扑克牌一样,对应前面是有序的数据,然后比较index,index数据和前面的数据分别比价一次
希尔排序:是插入排序的升级版本,先通过Gap进行分组,然后分别进行插入排序,知道Gap=1,进行最后一次插入排序
选择排序:第一次得到最大值,然后得到最二大的值
堆排序:是选择排序的一种扩展,构建堆,调整堆的结构,达到节点的值要比它的子节点的值都要大或者小
冒泡排序:相邻的数据进行两两的交换,第一趟得到最大值,第二趟.........像水里的气泡一样
快速排序:是冒泡排序的一种,找中间点,一左一右,然后得到中间值,中间值比前面的要大,比后面的小,然后循环
归并排序:分成多个数组,把每个数组有序(用插入排序方法),然后合并数组
基数排序:把所有个位数1的一组,2的一组,然后得到排序,个位数排一次+十位数排一次+百位数排一次
总结:
选择排序和冒泡排序的区别:共同点:先找到最大值或者最小值,不同点:选择排序是循环遍历,冒泡排序是:相邻的俩俩交换
希尔排序和快速排序:共同点:分组,希尔是:Gap,快速排序是 :得到中间值 归并排序相反:先分数组,然后合并数组。
十四;
加密
Android 最全的AES加密算法及其实现(前所未有的震撼)
http://blog.csdn.net/whb20081815/article/details/73997645
十五:源码解读
activty的加载过程 请详细介绍下:
Android Activty的加载过程 启动流程 源码分析
http://blog.csdn.net/whb20081815/article/details/76596473
十六:设计模式
1.Android 最常用的设计模式一 安卓源码分析—单例模式singleInstance
http://blog.csdn.net/whb20081815/article/details/77970206
2.
Android 最常用的设计模式二 安卓源码分析——组合模式(component)
http://blog.csdn.net/whb20081815/article/details/77980367
3.
Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
http://blog.csdn.net/whb20081815/article/details/77970133
4.Android 最常用的设计模式四 安卓源码分析——模板方法(Mould)
http://blog.csdn.net/whb20081815/article/details/77984746
5.Android 最常用的设计模式五 安卓源码分析——建造者模式
http://blog.csdn.net/whb20081815/article/details/77970093
6.
Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
http://blog.csdn.net/whb20081815/article/details/77970159
7.Android 最常用的设计模式九 安卓源码分析—— 适配器模式(Adapter)
http://blog.csdn.net/whb20081815/article/details/77993858
8.
Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
http://blog.csdn.net/whb20081815/article/details/77991430
9.Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
http://blog.csdn.net/whb20081815/article/details/77982008
单例模式分为
Application
饿汉式单例和懒汉式单例
饿汉式单例:类初始化的时候直接new 出来了
懒汉式单例:调用的时候才new出来
场景:
组合模式:
view和viewgroup:
整体和部分的关系
有部件,还有一个共同的行为
场景:去不同的加盟店刷卡,只要是那个卡,不同的分店都可以
观察者模式:
evenbus
观察者和被观察者
需要注册事件,
一个变量发生了改变,其他注册过这个事件的,都话通知
场景:订阅了天气预报的短信,有天气发生变化,它会主动通知你
模板方法:
view
父类和子类的关系,继承,子类继承父类的一些属性,同时子类也可以自己扩展自己得一些方法
场景:有一个医生,有很多理想,然后他把医术传给了儿子,儿子按照他父亲的意志,开始他的一片天
构造者模式:
dialog,ImageLoader
需要什么构建什么,可以不用在构造函数中设置太多了变量,替代set方法
工厂方法
线程,和bitmapfactory
为了解决:不同的需求,切换方案的时候非常方便,简单,减低代码的耦合
场景:客户需要这个APP,它需要不同UI,不同的客户需要不同的UI
适配器模式
adapter:
场景:用户家里是220v的电压,但是这个设备是5v电压,我们需要转换,中间多了一层
策略模式:
animation:线性插值器,加速插值器,减速插值器,不同的算法在里面
有一个共同的接口,然后采用不同的方法封装,实现不同的功能,这就是策略模式
场景:约会有很多种方式,有的带她们去海边,有的带她去看电影