面试纪录

来源:互联网 发布:php socket可以做什么 编辑:程序博客网 时间:2024/04/30 03:44

Android开发面试纪录(一)


问题1:谈一谈你简历上的项目,你在其中扮演什么角色?

回答:该项目是xx公司的SDK开发,我主要负责其中的接口测试,开发文档的编写与SDK demo的开发,并最终交付给应用层开发人员来作为公司标准应用层开发接口。


问题2 : 简单谈一下Android四大组件

回答:

1.Activity主要提供与用户进行交互的接口,主要负责界面显示与基本的界面逻辑。
2.Service作为后台运行的服务,主要的职能是执行需要长时间运行的任务。
3.BroadcastReceiver作为广播,主要是用来进行跨进程的通信或者与其它组件进行交互。
4.ContentProvider作为不同app数据交互的统一接口,它实际上是规范了应用间数据读取的方式,并不关心数据本身。用户可以使用文件、SharedPreference、数据库等方式来提供数据。


问题3:Service有哪些启动方式,不同启动方式有哪些特点?

回答:

Service有两种启动方式:1.通过StartService来开启一个Service,调用该方法来启动的Service不会被调用它的组件的生命周期所影响,当调用它的组件被杀死后,该service依然可以继续继续运行下去。2.通过bindService来开启一个Service,调用该方法来启动的Service生命周期会被调用它的组件的生命周期影响,当调用它的组件被杀死后,该service也会被同时杀死。


问题4:如何去调用Service里的方法?

回答:

重写Service里的onBind方法,返回一个binder对象,在需要调用Service方法的组件里面实例化一个ServiceConnection接口,实现其onServiceConnected和onServiceDisconnected方法,在onServiceConnected方法里获取这个binder对象,这样该组件就可以通过这个binder对象来调用Service里提供的方法了。


问题5:如果我需要bind一个Service,同时我又不想要这个Service在我这个组件被杀死的时候结束掉,我该怎么做?

回答:

你可以在某个组件内通过startService的方法来开启这个Service,这样这个Service就不会被别的组件bind后绑架其生命周期了。比如,有ActivityA和ActivityB,可以在ActivityA中通过StartService的方法开启这个Service,这样就可以在ActivityB中正常的bind这个Service而不会影响其生命周期。


问题6:关于广播你了解多少

回答:

广播的用法非常简单,实例化一个intent,然后通过调用Context.sendBroadcast方法就可以把这个intent通过广播的方式发出去。关于广播的接收,你需要继承一个BroadcastReceiver,重写其onReceive方法就可以接收到广播发来的intent。广播有两种注册方式,一种注册方式是在xml里面配置,这种注册方法可以使得应用可以被远程唤醒。一种是在代码里通过调用registerReceiver方法动态注册,这种方法注册的广播不能使应用被远程唤醒。


问题7:为什么xml配置广播可以使应用能够被远程唤醒,而动态注册广播就无法让应用被远程唤醒呢?

回答:

这个问题我没有深入研究过,不过我猜测Android应该是提供了对每个应用程序清单,也就是对AndroidManifest文件里intent-filter的action提供了一个特殊的存放机制,当有全局广播的时候就会对这些action进行遍历,然后唤醒相应的app。但是如果在代码里动态注册的话,那么当app没有处于运行状态的话那么代码肯定没有执行,所以就不会存在这些action,当然也就不会被远程唤醒。


问题8:关于本地广播你了解么?

回答:

就是应用内部的广播,不会被外部接收到的广播。其它的应该和全局广播一样。(确实不是很了解)


问题9:广播接收器内部不能做哪些操作?

回答:

不能做耗时的操作,不能访问网络,数据库等。。。。(囧。。。。这个问题算是没回答出来。。感觉面试官不是很满意)


问题10:关于设计模式,你来讲一个你个人比较熟悉的设计模式吧?

回答:

那就观察者模式吧,观察者模式实际上提供了一种事件分发的机制,观察者可以通过注册感兴趣的事件源来实现对某个主题的观测,然后当主题有改变时,就可以通知观察者。其具体实现也很容易,只需要在主题类中实例化一个存放观察者的数据结构,并且声明注册与注销的接口就可以实现了。观察者只需实现一个接口来接收主题发来的事件就可以了。

问题11:单例模式有哪些实现方式?

回答:

单例模式只需要把构造方法声明为private,然后向外提供一个接口用于获取一个静态的类的对象,该对象由于是静态的,所以只会在该类被加载的时候被生成一次。由于构造方法是private的,那么在类外部就不会被再次实例化,由此实现单例。但是这种方法实现的单例当在多线程并发的情况下由于调用构造方法的方法不是原子操作,所以可能会同时存在多个实例。那么就需要给获取实例的方法加一个同步锁。但是由于当同步锁给整个类的成员方法加锁的时候会导致整个类被加锁,影响性能,所以更推荐使用的是同步代码块的方法,也就是只给具体调用构造方法的那一部分代码加锁。(这部分讲得不够全面,实际上还有很多方法实现单例模式,比如使用静态内部类等)


12.说说对java内存模型和并发编程的理解?

回答:

java给每个线程分配一个java Stack和一个程序计数器,每当线程调用一个方法时,就会根据该方法的入参从主内存中复制一个副本参数到线程的虚拟空间中,形成一个栈帧。当方法结束时,会将当前栈帧出栈,并且该方法的返回值作为下一个方法的入参进行下一个方法的计算。最终当线程执行完毕后,会将线程的虚拟内存中保存的副本写入到主内存中,由此更新主内存中的实际数据。由于cpu为每个线程分配的时间片很短,当某个线程的时间片耗尽而该线程未执行完毕,则会将该线程暂停。这时就需要把当前线程的java stack栈顶的栈帧的程序地址写入到程序计数器中,当下次该线程cpu时间片进入运行状态时就从程序计数器中取地址继续执行。(然后后面就是关于操作的原子性可见性巴拉巴拉。。。。打字好累。。。)


先写这些,后面继续添加,有点忘记了。。。