Android 面试常见问题

转载请注明出处:http://blog.csdn.net/mr_liabill/article/details/48376071   来自《LiaBin的博客》

通讯行业转行做android app开发,这段时间也面试了不少企业,蹭着现在刚入职,没多大开发任务,记录下面试android应用开发工程师过程自己碰到的常见面试问题

Android基础篇

1. activity生命周期    fragment生命周期
这个是所有开发android必须掌握的
onSaveInstanceState调用时期
系统“未经你许可”时销毁了你的activity,按home键,跳转到另一个activity算“未经许可”,如果是back键就不算“未经许可”,然后这个Bundle会传递到oncreate方法中
replace hide fragment生命周期不同表现
replace
如果fragment没加入到回退栈那么会销毁实例onDestroyView-onDestroy,下次启动fragment会经历一次完整的生命周期
如果加入了回退栈transaction.addToBackStack(null),那么只会销毁视图,onDestroyView,下次启动会从onCreateView开始
hide
既不销毁视图也不销毁实例,只是调用onPause onStop,下次启动onStart,onResume

参考 《Android Fragment生命周期》

2. activity启动模式
standard singleTop singleTask
singleInstance singleTask 重点留意

singleTask 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉

指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动
假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例。
可以举浏览器这个例子

3. Handler机制

参考 《Android Handle机制》

4. listview优化
参考 《Android Listview优化》

5. 设计模式
单例模式

参考 《Java 单例模式》

工厂方法模式
GSMPhone CDMAPHone   通过Phone phone = PhoneFactory.makeGsmPhone()创建对象

适配器模式
listview recyclerview 不同的数据源进行使用不同的adapter,arrayadapter,cursoradapter。

观察者模式
BaseAdapter,BaseAdapter关联了一个DataSetObservable对象,并实现 registerDataSetObserver和unregisterDataSetObserver两个方法实现注册和撤销Observer,方法 notifyDataSetChanged间接调用Observer的实现者的onChange()方法,以达到通知数据改变的作用。使用 ListView和BaseAdapter组合时,当BaseAdapter的item改变时,我们经常会调用 notifyDataSetChanged(),通知Listview刷新。
mAdapter.registerDataSetObserver(mDataSetObserver);  注册了,在DataSetObservable对象中有一个数组引用,来保存观察者,发送通知。

组合模式
view viewgroup的应用 viewgroup继承view  有添加删除修改view的子方法

6. 内存泄漏 内存溢出的理解
参考 《内存泄漏分析》

7. 图片加载优化
参考 《Android高效加载大图、多图解决方案,有效避免程序OOM》

8. Java中引用的类型以及他们的区别
参考 《Android 弱引用 软引用 区别与应用》



9. Java反射机制

10. NDK是否使用过


11. service在主线程还是子线程开启,IntentService呢?

service默认运行在主线程中,所以如果在service中执行耗时的操作依然会阻塞主线程导致ANR,除非显示的在子线程中start或者bind,这个时候service运行在子线程,IntentService默认开启一个子线程这个service同时运行在这个子线程中


12. Android四大组件

activity service contentprovider broadcast

ContentProvider: 主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作


13. 事件分发机制原理

参考下面文章,已经讲解不能再详细了

1.  《Android 事件分发机制详解(1)-View》

2.  《Android 事件分发机制详解(2)-ViewGroup》


14. 自定义view流程


15. asynctask的缺陷,线程池了解过吗?

参考 http://blog.csdn.net/lmj623565791/article/details/38614699

在3.0以前,最大支持128个线程的并发,10个任务的等待。如果超过129会抛出异常,在3.0以后,无论有多少任务,都会在其内部单线程执行,如果需要同步进行,需要自定义线程池;


16. 未完待遇


项目篇

一般招聘都会问你项目经历,然后看简历中项目具体提问,如果想转行,一个demo都没写还是不要去面试了,这个过程中,我一般说我自己写了一个开源客户端 《Git@OSC第三方客户端》

这个过程中碰到的问题记录如下

1. Volley的原理  为什么用它来代替android-async-http  有什么优势劣势

主要是通过两种Diapatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。

只有有时间会去深入研究Volley通信框架


2. LRUCache原理,怎么实现

Android用LruCache来取代原来强引用和软引用实现内存缓存,因为自2.3以后Android将更频繁的调用GC,导致软引用缓存的数据极易被释放。
LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。他的主要原理在trimToSize方法中。需要了解两个主要的变量size和maxSize。
maxSize是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。
size在添加和移除缓存都被更新值,他通过safeSizeOf这个方法更新值。safeSizeOf默认返回1,但一般我们会根据maxSize重写这个方法,比如认为maxSize代表是KB的话,那么就以KB为单位返回该项所占的内存大小。

public void trimToSize(int maxSize) {
        while (true) {
            K key;
            V value;
            synchronized (this) {
                if (size < 0 || (map.isEmpty() && size != 0)) {
                    throw new IllegalStateException(getClass().getName() + ".sizeOf() is reporting inconsistent results!");
                }
                if (size <= maxSize) {
                    break;
                }
                Map.Entry<K, V> toEvict = map.eldest();
                if (toEvict == null) {
                    break;
                }
                key = toEvict.getKey();
                value = toEvict.getValue();
                map.remove(key);
                size -= safeSizeOf(key, value);
                evictionCount++;
            }
            entryRemoved(true, key, value, null);
        }
    }

除异常外首先会判断size是否超过maxSize,,如果超过了就取出最先插入的缓存,如果不为空就删掉(一般来说只要map不为空都不会返回null,因为他是个双休链表),并把size减去该项所占的大小。这个操作将一直循环下去,直到size比maxSize小或者缓存为空。


3. RecycleView跟Listview异同点,优劣势

1. 强制使用ViewHolder ListView每次getView的时候都会调用findViewById(int),这将导致ListView性能展示迟缓。而在RecyclerView中使用 RecyclerView.ViewHolder 则变成了必须
2. LayoutManager我们知道ListView只能在垂直方向上滚动。水平,竖直,网格
3. ItemAnimator  动画,添加删除可以用动画
4. ItemDecoration 分割线
5. ListView通过AdapterView.OnItemClickListener接口来探测点击事件。而RecyclerView则通过 RecyclerView.OnItemTouchListener接口来探测触摸事件。它虽然增加了实现的难度,但是却给予开发人员拦截触摸事件更多的 控制权限。

6. ListView只提供了notifyDataSetChanged,而RecyclerView额外提供了notifyItemInserted,notifyItemRemoved等方法,提高效率

总之,通过比较我们可以发现,RecyclerView充满了大量的自定义功能,它可以用于实现复杂的列表或网格,但实现起来稍显得复杂。



Java基础篇

1. 方法重载 重写区别

参考 Java方法重载与重写的区别


2. String StringBuilder StringBuffer区别

3. Java集合框架,什么是线程安全的,线程不安全的

简单来说synchronized 修饰的就是安全的,没修饰的就是不安全的,多线程访问同一个对象


4. 写一个排序算法出来,二分法查找怎么实现

5. 线程状态图,生产者消费者模型

6. sleep wait区别


7. Object类都有哪些方法,分别有什么作用

clone equal hascode getclass wait notify notifyall tostring finalize


上面问题基本都能在我博客中找到答案,就不一一说明了


其它

1. 职业规划

2. 为什么离职

3. 对公司是否了解

4. 有什么要问公司的吗?

5. 薪资要求

6. 一般碰到怎么解决,经常上哪些网站

7.  最近在看哪些技术相关的书籍

8.  个人有哪些优点有哪些缺点


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值