整理:Android 知识点

activity service broadcast contentprovider

fragment     bind service     unbind service

AIDL     

textview button listview srollview

relatelayout     linearlayout     gridlayout

actionbar toolbar

android.support.v4     android.support.v7

FloatingActionButton

sqlite sharedpreference

px sp dp dip pt dpi

dip: device independent pixels(设备独立像素). 一般我们为了支持多种分辨率如WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

dp: dip是一样的,谷歌官方推荐使用这个。1dp表示在屏幕点密度为160ppi时1px长度。

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较少。px=dp*(ppi/160)

pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;

sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。

Diagonal pixel表示对角线的像素值(=),DPI=933/3.7=252

PPI:是Pixels Per Inch缩写,表示的是每英寸所拥有的像素数目,√(X^2+Y^2)/ Z

DPI:是Dots Per Inch(每英寸所打印的点数)的缩写,是打印机、鼠标等设备分辨率的单位。

Android官方尺寸介绍

https://developer.android.com/guide/practices/screens_support.html#support

  • Android task任务栈

参考:android的task任务栈

http://www.cnblogs.com/CSU-PL/p/3794280.html

参考:彻底明白Activity启动模式-SingleTop、SingleTask、SingleInstance具体使用场景 http://blog.csdn.net/zivensonice/article/details/51569502 

参考:android launchmode(四种启动模式)应用场景及实例

http://www.th7.cn/Program/Android/201503/405426.shtml

standard:默认模式,每次激活Activity都会创建实例。

SingleTop:若任务栈顶存在该Activity实例,会重用(会调用实例的 onNewIntent())。

适合接收通知启动的内容显示页面。从其他地方,如通知栏返回APP时,回到页面。

SingleTask:若栈中已经有该Activity实例,就会重用。该实例回到栈顶,上面的所以实例会被移除栈。

适合作为程序入口点,例如浏览器的主界面。其他App需要打开我们的APP页面,就可以配置他为singleTask模式,保证他只有一个唯一实例,节约内存同时按下返回键后的感官也更顺畅。提供给人调用的页面最好是栈底元素,返回后能回到其他APP。

SingleInstance:在一个新栈中创建实例,并让多个应用共享该栈中的实例。

整个手机操作系统里面只有一个实例存在,适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。

启动模式设置 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性

  • Android Handler 

彻底理解handler的实现原理:

http://blog.csdn.net/wanghao200906/article/details/51355018

Android中的Thread, Looper和Handler机制(附带HandlerThread与AsyncTask):

https://hit-alibaba.github.io/interview/Android/basic/Android-handler-thread-looper.html

- 接收消息的“消息队列” ——【MessageQueue】

- 阻塞式地从消息队列中接收消息并进行处理的“线程” ——【Thread+Looper】

- 可发送的“消息的格式” ——【Message】

- “消息发送函数”——【Handler的post和sendMessage】

  • view和viewGroup的事件传递机制/View 的事件分发机制

Android事件分发机制详解:史上最全面、最易懂:

http://blog.csdn.net/carson_ho/article/details/54136311

Android事件分发顺序:Activity(Window) -> ViewGroup -> View

- super:调用父类方法

- true:消费事件,即事件不继续往下传递

- false:不消费事件,事件继续往下传递 / 交由给父控件onTouchEvent()处理

图解 Android 事件分发机制:

http://www.jianshu.com/p/e99b5e8bd67b

默认传递

MainActivity     dispatchTouchEvent

LinearLayout     dispatchTouchEvent

LinearLayout     onInterceptTouchEvent

Button               dispatchTouchEvent

Button              onTouchEvent 

基本和博客 http://blog.csdn.net/carson_ho/article/details/54136311 里的图一样,但是View的onTouchEvent()默认行为应该和true一样,有误。

setOnTouchListener的onTouch()返回true,则onClick()不会执行。

onInterceptTouchEvent 只有 ViewGroup 有

dispatchTouchEvent onInterceptTouchEvent onTouchEvent  返回true,则消费结束,默认向下执行

dispatchTouchEvent         返回false,则执行上层的 onTouchEvent 

onInterceptTouchEvent    返回false, 则执行本层的 onTouchEvent 

onTouchEvent                  返回false,则执行上层的 onTouchEvent

  • Activity的生命周期

https://developer.android.com/guide/components/activities/activity-lifecycle.html

启动到结束 onCreate() onStart() onResume() -> onPause() onStop() onDestory()

切换后台再返回 onPause() onStop() -> onRestart() onStart() onResume()

拦截返回键 onKeyDown() KeyEvent.KEYCODE_BACK

并且手动 moveTaskToBack(false); (false代表只有栈底activity才执行)

跳转时 A的onPause() > B的onCreate() > B的onStart() > B的onResume() > A的onStop()

切换横竖屏时 onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->

android:configChanges属性总结

http://www.cnblogs.com/wanqieddy/p/5172120.html

注意:设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次,并且调用onConfigurationChanged()

只竖屏显示 android:screenOrientation="portrait"

只横屏显示 android:screenOrientation="landscape"

onNewIntent()

只有启动模式是 singleTop 或者使用 FLAG_ACTIVITY_SINGLE_TOP 来 startActivity(Intent). 这个方法才回被调用

FLAG_ACTIVITY_SINGLE_TOP :如果当前栈顶的activity就是要启动的activity,则不会再启动一个新的activity

  • Fragment的生命周期

https://developer.android.com/guide/components/fragments.html

启动 onAttach() onCreate() onCreateView() onActivityCreate() onStart() onResume()

结束 onPause() onStop() onDestroyView() onDestroy() onDetach()

  • Service的生命周期

Unbounded service: onCreate() -> onStartCommand() -> onDestroy()

Bounded service: onCreate() -> onBind() -> onUnbind() -> onDestroy()

  • View的绘图/控件绘制过程

测量——onMeasure():决定View的大小                         getMeasuredHeight()

布局——onLayout():决定View在ViewGroup中的位置     getHeight()

绘制——onDraw():如何绘制这个View。

draw() -> drawBackground() -> onDraw() -> dispatchDraw() -> onDrawScrollBars()

getMeasuredHeight()返回的是原始测量高度,与屏幕无关,getHeight()返回的是在屏幕上显示的高度。

MeasureSpec是由父View的MeasureSpec和子View的LayoutParams通过简单的计算得出一个针对子View的测量要求,这个测量要求就是MeasureSpec

值得注意的是MeasureSpecs,它是父级别view测量该子view时的标尺。有三种模式(UNSPECIFIED、EXACTLY、AT_MOST)

- UNSPECIFIED:通过xml布局不会出现,一般是用来作试探性的测量,比如设置高为UNSPECIFIED、宽为固定的240dp去衡量子视图,子视图可以根据固定的240宽去计算需要多高的空间

- EXACTLY:xml中设置为match_parent或具体的数值时会使用,父级别来限制

- AT_MOST:xml中设置为wrap_content时会使用,不要求父级别来加以限制

Android View的绘制流程

http://www.jianshu.com/p/5a71014e7b1b

  • recyclerview 对比 listview

RecyclerView 和 ListView 使用对比分析

http://www.jianshu.com/p/f592f3715ae2

RecyclerView

http://blog.csdn.net/lmj623565791/article/details/45059587

getItemCount() -> getItemViewType() ->  onCreateViewHolder() -> onBindViewHolder()

setLayoutManager setAdapter setItemAnimator addItemDecoration

布局效果

LinearLayoutManager(线性布局效果)

GridLayoutManager(网格布局效果)

taggeredGridLayoutManager(瀑布流布局效果)

局部刷新

          notifyItemChanged(int position)

          notifyItemInserted(int position)

          ...

动画效果

          setItemAnimator(new DefaultItemAnimator())

嵌套滚动机制

ListView

getCount() getItem() getItemId() getView()

Android ListView与RecyclerView对比浅析--缓存机制

https://dev.qq.com/topic/5811d3e3ab10c62013697408

ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个pos的View修改标志位,区分是否重新bindView。

  • recyclerview listview 下拉刷新

RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)

http://blog.csdn.net/developer_jiangqq/article/details/49992269

使用 SwipeRefreshLayout 非常简单,设置 setOnRefreshListener 即可

使用 Payload 提高 RecyclerView 渲染效率

http://blog.chengyunfeng.com/?p=1007

在 onBindViewHolder(ViewHolder holder, int position, List<Object> payload) 里使用 Payload 更新数据

  • Android如何检测卡顿
  1. 使用 Android Studio TraceView
  2. GPU呈现模式分析 \ GPU过度绘制
  3. 使用 BlockCanary 等工具定位卡顿代码
  • RelateLayout 比 LinarLayout 性能好

Android中RelativeLayout和LinearLayout性能分析

http://www.jianshu.com/p/8a7d059da746

1 RelativeLayout 两次measure

RelativeLayout会对子View做两次measure,RelativeLayout中子View的排列方式是基于彼此的依赖关系,而这个依赖关系可能和布局中View的顺序并不相同,需要横向纵向分别进行一次排序测量。

而LinearLayout则只需一次measure过程,所以显然会快于RelativeLayout,但是如果LinearLayout中有weight属性,则也需要进行两次measure,但即便如此,应该仍然会比RelativeLayout的情况好一点。

2 RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。

默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优,因为复杂的View嵌套对性能的影响会更大一些。

  • Android中用SparseArray和ArrayMap代替HashMap

Android内存优化(使用SparseArray和ArrayMap代替HashMap)

http://blog.csdn.net/u010687392/article/details/47809295

只要一满足扩容条件,HashMap的空间将会以2倍的规律进行增大,而且在此过程中也需要不断的做hash运算,这将对我们的内存空间造成很大消耗和浪费。

SparseArray只接受int类型作为key

内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value

SparseArray数量小时,性能较好,它避免了自动装箱的过程,其添加、查找、删除数据都需要先进行一次二分查找

满足下面两个条件我们可以使用SparseArray代替HashMap:

- 数据量不大,最好在千级以内

- key必须为int类型,这种情况下的HashMap可以用SparseArray代替:

ArrayMap设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作

ArrayMap应用场景

- 数据量不大,最好在千级以内

- 数据结构类型为Map类型

假设数据量都在千级以内的情况下:

1、如果key的类型已经确定为int类型,那么使用SparseArray,因为它避免了自动装箱的过程,如果key为long类型,它还提供了一个LongSparseArray来确保key为long类型时的使用

2、如果key类型为其它的类型,则使用ArrayMap

Android内存优化:ArrayMap

http://blog.csdn.net/bdmh/article/details/49176001

ArrayMap用的是copy数据,而不是new,所以效率相对要高

总结:

ArrayMap      收缩数组 二分查找 扩容时拷贝数据

SparseArray   压缩数组 二分查找 扩容时拷贝数据 key为int避免自动装箱

  • Android中线程间通信的方式
  1. 共享变量
  2. 进程间通信方式(包括文件)
  3. 消息队列(包括:Handler)
  4. wait() notify() notifyAll()

使用第三方库

 EventBus使用详解(一)——初步使用EventBus

http://blog.csdn.net/harvic880925/article/details/40660137

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

  • Android中进程间通信的方式
  1. AIDL
  2. Intent(BroadCast)
  3. 文件(包括:管道)
  4. Socket/LocalSocket
  5. 信号
  6. 共享内存
  7. Content Provider

Android中进程间通信有哪些实现方式?原理是什么?

https://github.com/android-cn/android-discuss/issues/28

  • 创建自定义线程池的参数

ThreadPoolExecutor线程池参数设置技巧

http://www.cnblogs.com/waytobestcoder/p/5323130.html

- corePoolSize:核心线程数

- queueCapacity:任务队列容量(阻塞队列)

- maxPoolSize:最大线程数

- keepAliveTime:线程空闲时间

- allowCoreThreadTimeout:允许核心线程超时

- rejectedExecutionHandler:任务拒绝处理器

已经达到maxPoolSize 和 线程池被调用shutdown()后,会拒绝处理任务,抛出异常

java.util.concurrent.RejectedExecutionException

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

JAVA4种线程池的使用

http://www.cnblogs.com/SKILL0825/p/5971539.html

  • BroadCast 延时问题

使用其他进程/线程通信方式

  • AsyncTask 的优缺点

优点:

1.简单,快捷

2.过程可控

缺点:

  1. 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来
  2. 默认线程池并发数量有限,大并发需要自己创建线程池

android Asynctask的优缺点?能否同时并发100+asynctask呢?

http://blog.csdn.net/u012974916/article/details/24579213

Android学习笔记:多个AsyncTask实例的并发问题

http://www.cnblogs.com/51kata/p/4122655.html

  • Android中的动画

android中的动画分 View Animation和Property Animation两大类

View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);

Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;

Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

Property Animation 包括ValueAnimatorObjectAnimation

Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。

Android中的动画--笔记

http://www.jianshu.com/p/1d3ac9322b26

  • getMeasuredHeight()与getHeight()的区别

getMeasuredHeight()返回的是原始测量高度,与屏幕无关,getHeight()返回的是在屏幕上显示的高度。

  • RelateLayout 和 LinearLayout 测量的区别

见 RelateLayout 比 LinarLayout 性能好 

Android中RelativeLayout和LinearLayout性能分析

http://www.jianshu.com/p/8a7d059da746

  • 退出所有Activity

Android退出所有Activity最优雅的方式

http://blog.csdn.net/dsc114/article/details/50517336

① 使用ActivityManager的方式;

② 自定义一个Activity集合类的方式;

③ 通过发送广播的方式;

④ 通过杀死当前应用进程的方式;

⑤ singleTask启动BaseActivity

⑤ 最优雅

  • 有没有遇到过内存泄漏

在AsyncTask里面持有了Activity的引用,然后Activity关闭,但是由于AsyncTask没有结束,所有Activity并不会被GC回收。

解决方法:采用弱引用

为了能让所有的Activity关闭,在Aplication里创建了一个Activity集合,这种方式容易造成Activity并不会被GC回收。后来换Boradcast或者singeTask的栈底Activity。

解决方法:弱引用 WeakReference<MainActivity> activity ; reference.get()

[译]Android内存泄漏的八种可能(上)

http://www.jianshu.com/p/ac00e370f83d

  • 项目中用到哪些设计模式

适配器模式:比如GridView、ListView与Adapter

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。

优点:1 提高了类的复用度 2 灵活性好,当不需要适配器时,只要删掉这个适配器就可以了

缺点:

单例模式:线程池的使用

单例模式确保某个类只有一个实例,分三种:

懒汉式单例          在第一次调用的时候实例化     synchronized 双重检查锁定(可能失败) 静态内部类

饿汉式单例          类初始化时,已经自行实例化

登记式单例          维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)中

三种。

JAVA设计模式之单例模式

http://blog.csdn.net/jason0539/article/details/23297037/

双重检查锁定失败可能性——参照《The "Double-Checked Locking is Broken" Declaration》

http://blog.csdn.net/gerryzhu/article/details/17524281

多线程下双重检查锁定可能失效

解决:在jdk1.5及其后的版本中,可以将instance 设置成volatile以让双重检查锁定生效

用volatile修饰的变量,线程在每次使用变量的时候,都会从主内存同步,读取变量修改后的最的值。

优点:1 提供了对唯一实例的受控访问 2 可以节约系统资源 3 允许可变数目的实例

缺点:1 没有抽象层,扩展困难 2 单例类的职责过重,违背“单一职责原则”3 滥用单例将带来一些负面问题

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式:Handler

当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

优点:1 在被观察者和观察者之间建立一个抽象的耦合 2 支持广播通讯

缺点:1其中一个观察者卡壳,会影响整体的执行效率,一般要考虑采用异步的方式

建造者模式:AlertDialog.Builder

建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。工厂模式关注的是创建单个产品,而建造者模式则关注创建复合对象,多个部分。

优点:1 封装性,使得客户端不必知道产品内部的组成细节 2 建造者独立,容易扩展

缺点:

代理模式:Binder

代理模式就是多一个代理类出来,替原对象进行一些操作。

优点:1 职责清晰 2 高扩展性,具体主题角色随时都会发生变化,但只要它实现了接口,我们的代理类就可以在完全不做任何修改的情况下使用

缺点:

23种设计模式的优点与缺点概况

http://www.cnblogs.com/WoodJim/p/4715385.html

Java开发中的23种设计模式详解

http://zz563143188.iteye.com/blog/1847029

有哪些在实际 Android 项目中用到的设计模式?

https://www.zhihu.com/question/29575295

设计模式六大原则:

  1. 单一职责原则:通俗说法:一个类只负责一项职责
  2. 里氏替换原则:通俗说法:子类可以扩展父类的功能,但不能改变父类原有的功能
  3. 依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象
  4. 接口隔离原则:客户端不应该依赖它不需要的接口
  5. 迪米特法则:一个对象应该对其他对象保持最少的了解(尽量降低类与类之间的耦合)
  6. 开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

设计模式六大原则

http://www.uml.org.cn/sjms/201211023.asp#2

  • SharedPreferences中的commit和apply方法

1. apply没有返回值而commit返回boolean表明修改是否提交成功

2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘

  • 如何避免应用被杀死

作者:闭关写代码
链接:https://www.nowcoder.com/discuss/3244?type=2&order=0&pos=49&page=3

来源:牛客网

  1. Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

  2. 通过 startForeground将进程设置为前台进程, 做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill

  3. 双进程Service: 让2个进程互相保护**,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

  4. QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

  5. 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行

  1. 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以上的版本不可行)
  2. 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
  3. 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

  4. 联系厂商,加入白名单

关于 Android 进程保活,你所需要知道的一切

http://www.jianshu.com/p/63aafe3c12af

API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理

Android-Common-Interview-Questions

面试题总结

#通用

- 安卓学习途径, 寻找资料学习的博客网站

- AndroidStudio使用, 插件使用

- 安卓和苹果的区别

#初级(基础1年左右)

- 四大组件

- 五大存储方式

- Layout布局有哪几种 FrameLayout什么时候用

- ListView的优化

- 点击事件设置监听的几种方式

- 安卓主线程和子线程的关系

- Activity生命周期 onStart onResume区别

- Fragment生命周期 Activity和Fragment区别

- 页面之间如何传递数据, 如果传递一个对象如何处理, 如何传递集合

- dp px sp的区别

- gravity和layout_gravity的区别

- margin和padding的区别

- weight的作用

- Handler机制

- 什么的ANR, 如何避免

- 显式意图和隐式意图区别,隐式意图的使用

- 广播几种接收方式, 广播有几种类型, 区别

- 开启Service的几种方式, 区别, Service和Activity之间如何传递数据

- Service中如果要start一个Activity要如何特殊处理,为什么

...

还有很多,都是网上常见面试题, 百度搜看看, 背下来即可

#中级(2~3年, 也问部分基础问题)

- 自定义控件

- 常用开源框架的使用

- 动画类型

- 任务栈,页面启动方式

- Material Design / 新控件RecyclerView CardView等使用

- 图片压缩和双缓存原理

- 多层View的onTouch事件分发

...

简单了解记下来, 最好自己写个demo试验下

#高级(3年+, 也问部分中级问题)

- Android绘制原理 onMeasure onLayout onDraw作用

- MeasureSpec的集中类型区别和作用

- 自定义控件

- 什么是MVC MVP,区别

- 响应式编程

- 常见开源框架源码

- 单元测试常用框架和实际使用 场景

...

需要阅读源码和项目编码练习

其他

#多媒体

- 音频的环绕声和混响等如何处理

- 音频录制播放

- 视频的录制和播放

- 播放使用的常用框架

- Android原生支持格式

- 软解码硬解码的区别

- 如果要做一个按住屏幕右侧滑动调整声音功能如何处理

...

特殊公司做这方面相关的会问的多

Android基础

五种布局的特点和效率对比

Activity的生命周期和缓存

Fragment的生命周期

Service的两种启动方式,如何保证一个Service不被杀死

广播注册的两种方式的区别

如何安全的退出一个已经开启多个activity的APP

Android的进程优先级

Asset目录与res目录的区别

ANR问题,force close问题,activity,service,broadcast各自超过多少秒报ANR

Activity启动模式,intent匹配规则

Android反编译

JNI和native方法

Android系统的有哪些安全机制

Android新特性有哪些(5.0 6.0 7.0)

Dalvik和ART区别

Android屏幕适配有哪些方法

Android View相关

View事件体系,滑动冲突

View绘制原理,性能问题(view绘制间隔16ms,60fps),measure,layout,draw三大过程

如何避免overdraw

自定义View相关知识,下拉刷新的实现

Android动画分类和各自特点

View和SurfaceView的区别

Android性能优化

APK瘦身的办法

ListView的源码和如何优化Listview

Android如何获取Crash信息

ANR日志分析

Android动态加载,如何解决方法数越界

Android怎么加速启动Activity

Android内存泄漏问题,内存泄漏分析工具

Android内存溢出问题,图片的三级缓存

Android framework和底层原理

Android系统开机过程

Zygote和System进程的启动过程

Activity的启动过程

Android的消息机制,Handler原理

AsyncTask源码,优缺点

HandlerThread和IntentService的原理和特点

Android的IPC机制

AIDL原理

Binder机制原理

ActivityManagerService

Android框架和源码

项目各个细节熟练,熟悉项目用到的框架源码

Volley

xUtils

okHttp

UniversalImageLoader

RxJava

问题

ListView的getView执行两次

WindowManager 的相关知识

android中string.xml中%1$s、%1$d等的用法

http://blog.csdn.net/jdsjlzx/article/details/41789293

Activity与Fragment生命周期探讨

http://www.jianshu.com/p/1b3f829810a1

2016校招,Android开发,一个非重本应届生的坎坷求职路

https://www.nowcoder.com/discuss/3244?type=2&order=0&pos=49&page=3

发表评论

邮箱地址不会被公开。 必填项已用*标注