动画的原理,底层如何给上层信号
动画分两种,补间动画和属性动画。
补间动画是通过不停地重绘视图实现的,只是改变了视图,而没有改变相关属性。补间动画通过不断调用invalidate()通知父容器,父容器来处理子控件的动画。
属性动画是通过差值器和估值器计算中间过程,不断地设置属性形成的动画。
Bitmap 使用时候注意什么?
避免加载bitmap过大内存造成oom
放置切图时需要注意放置的位置。避免大图放置在低分辨率下,这样加载到内存中的大小会很恐怖的。
图片进行合适大小的缩放,避免加载过大图片。
在图片decode阶段,先获取其宽高然后进行判断是否符合我们预期的,否则进行一定比例的缩放。
在加载大图片时不要使用getResources().getDrawable()的方式去获取图片,因为这种方式也是将图片全部加载到内存的,大图很容易oom。
使用Options.inBitmap设置这个可以重用的bitmap的内存区域,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。
在不影响实际显示效果的情况下,图片尽量不使用ARGB_8888(颜色模式,四通道高精度(32位))
JNI
JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。
NDK
Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。
NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作
String buffer 与string builder 的区别?
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String:使用最简单,(常量池的概念)
StringBuffer :线程安全的,方法都加了synchronized修饰。
StringBuilder :线程不安全,但是是最快的。
handler,在任何地方new handler 都是什么线程下
1.Handler的构造函数可以传入Looper,默认的使用当前线程的Looper,如果当前线程没有Looper,则会报错。MainLooper在程序启动,ActivityThread中就创建了。如果自己开辟线程,可以使用Looper.prepare()创建Looper,然后创建Handler就不会报错了。
2.Handler handler = new Handler(Looper.getMainLooper());这个不管在哪个线程中创建,handleMessage回调的都是主线程。
3.使用默认构造函数创建,当前在哪个线程,handleMessage回调就是在哪个线程。
强引用置为null,会不会被回收?
1.如果还存在其他引用,是不会回收的,例如内部类handler的引用。那样可能会造成内存溢出。
2.如果没有其他引用,也不会被立即回收,需要等到gc的时候才会被回收。
glide
Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。
内存缓存使用lru,从内存缓存中取出来之后,会使用一个WeakReference引用该资源。
生命周期控制:贴了一个fragment。
Glide 内存缓存如何控制大小?
Lru算法,设置最大使用内存大小。
为什么要有线程,而不是仅仅用进程?
进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
谈谈你在工作中是怎样解决一个 bug
异常附近多打印 log 信息;
分析 log 日志,实在不行的话进行断点调试;
调试不出结果,上 Stack Overflow 贴上异常信息,请教大牛
再多看看代码,或者从源代码中查找相关信息
实在不行就 GG 了,找师傅来解决!
嵌入式操作系统内存管理有哪几种, 各有何特性
页式,段式,段页,用到了MMU,虚拟空间等技术
如何切换 fragement,不重新实例化
正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前,show()另一个。
这样就能做到多个 Fragment 切换不重新实例化
ListView 如何实现分页加载
设置 ListView 的滚动监听器:setOnScrollListener(new OnScrollListener{….})在监听器中有两个方法: 滚动状态发生变化的方法(onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll)
在滚动状态发生改变的方法中,有三种状态:手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL:触摸滑动,惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: 滑翔,静止状态: SCROLL_STATE_IDLE: // 静止,对不同的状态进行处理:
分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。
ListView 可以显示多种类型的条目吗
这个当然可以的,ListView 显示的每个条目都是通过 baseAdapter 的 getView(int position,View convertView, ViewGroup parent)来展示的,理论上我们完全可以让每个条目都是不同类型的view。
比如:从服务器拿回一个标识为 id=1,那么当 id=1 的时候,我们就加载类型一的条目,当 id=2的时候,加载类型二的条目。常见布局在资讯类客户端中可以经常看到。
除此之外 adapter 还提供了 getViewTypeCount()和 getItemViewType(int position)两个方法。在 getView 方法中我们可以根据不同的 viewtype 加载不同的布局文件。
ListView 如何定位到指定位置
可以通过 ListView 提供的 lv.setSelection(listView.getPosition())方法
Service 和 Activity 在同一个线程吗
默认情况下service与activity在同一个线程,都在main Thread,或者ui线程中。
如果在清单文件中指定service的process属性,那么service就在另一个进程中运行。
启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
通过主界面进入,就是设置默认启动的activity。在manifest.xml文件中配置
从另一个组件跳转到目标activity,需要通过intent进行跳转
Android数字签名
所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。
数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
如何修改 Activity 进入和退出动画
可 以 通 过 两 种 方 式 , 一 是 通 过 定 义 Activity 的 主 题 , 二 是 通 过 覆 写 Activity 的overridePendingTransition 方法。
属性动画,例如一个 button 从 A 移动到 B 点,B 点还是可以响应点击事件,这个原理是什么?
补间动画只是显示的位置变动,View 的实际位置未改变,表现为 View 移动到其他地方,点击事件仍在原处才能响应。而属性动画控件移动后事件相应就在控件移动后本身进行处理
都使用过哪些自定义控件
pull2RefreshListView
LazyViewPager
SlidingMenu
SmoothProgressBar
自定义组合控件
ToggleButton
自定义Toast
开发中都使用过哪些框架、平台
EventBus(事件处理)
xUtils(网络、图片、ORM)
JPush(推送平台)
友盟(统计平台)
有米(优米)(广告平台)
百度地图
bmob(服务器平台、短信验证、邮箱验证、第三方支付)
阿里云 OSS(云存储)
ShareSDK(分享平台、第三方登录)
Gson(解析 json 数据框架)
imageLoader (图片处理框架)
zxing (二维码扫描)
anroid-asyn-http(网络通讯)
DiskLruCache(硬盘缓存框架)
Viatimo(多媒体播放框架)
universal-image-loader(图片缓存框架)
讯飞语音(语音识别)
andorid 应用第二次登录实现自动登录
前置条件是所有用户相关接口都走 https,非用户相关列表类数据走 http。
第一次登陆 getUserInfo 里带有一个长效 token,该长效 token 用来判断用户是否登陆和换取短 token 把长效 token 保存到 SharedPreferences 接口请求用长效 token 换取短token,短 token 服务端可以根据你的接口最后一次请求作为标示,超时时间为一天。所有接口都用短效 token 如果返回短效 token 失效,执行第3步,再直接当前接口 如果长效 token 失效(用户换设备或超过一月),提示用户登录。
即时通讯是是怎么做的?
使用asmark 开源框架实现的即时通讯功能.该框架基于开源的 XMPP 即时通信协议,采用 C/S 体系结构,通过 GPRS 无线网络用 TCP 协议连接到服务器,以架设开源的Openfn'e 服务器作为即时通讯平台。
客户端基于 Android 平台进行开发。负责初始化通信过程,进行即时通信时,由客户端负责向服务器发起创建连接请求。系统通过 GPRS 无线网络与 Internet 网络建立连接,通过服务器实现与Android 客户端的即时通信脚。
服务器端则采用 Openfire 作为服务器。 允许多个客户端同时登录并且并发的连接到一个服务器上。服务器对每个客户端的连接进行认证,对认证通过的客户端创建会话,客户端与服务器端之间的通信就在该会话的上下文中进行。
怎样对 android 进行优化?
对 listview 的优化。对图片的优化。对内存的优化。
具体一些措施:尽量不要使用过多的静态类static
数据库使用完成后要记得关闭 cursor
广播使用完之后要注销