Android面试题(一)

1、自我介绍** **

**    **姓名,之前从事的技术方向,工作几年,做过哪些项目,掌握哪些技能

2、项目开发流程** **

**    **立项--需求文档--软件原形--效果图切图--后台接口开发--应用程序开发--版本迭代--签名上线。

3、项目开发周期为什么这么长** **

其实真正敲代码的时间并没有多少,时间很多都花在了沟通上。沟通主要包括两个方面,一个是需求的具体化,第二个是与后台的接口沟通。并且在整个的项目开发中,还有一些需求增加、变更等。并且我们公司的人力复用比较严重,有时候需要同时开发两个项目或者维护之前的项目,并不是百分百全力开发此项目。

4、和美工的沟通有哪些** **

主要和美工沟通切图的事情,有些图可以切成.9图片,这样可以节省资源。有些通用的背景可以单独把背景切出来,里面的内容再切图,就不用每一个图片都有背景了。

5、职业规划** **

短期内还是想把技术能力继续提高,后期的规划是想往技术管理上发展。

6、加班的问题** **

对于适当合理的加班是没有意见的,如果项目时间点非常紧,那么大家一起努力加班,那种感觉也是挺好的,不过不喜欢加班是一种常态。

7、离职的原因** **

尽量找自身的原因,比如城市的原因。或者生活压力大,薪水太低等。或者是公司的发展方向,公司总是做外包,而自己想用心做产品。

9String 是基本数据类型吗?可以被继承吗?有什么需要注意的地方。 **

答案:String不是基本数据类型,它是引用类型。它不能被继承,因为String是final类型的类。

需要注意的地方是我们经常使用字符串比较的时候,往往爱用==来判断字符串是否相等,这个是非常错误的。==比较的是两个字符串对象的地址是否一致,如果要比较字符串内容,需要使用equals

还有一个需要注意的地方是,对字符串进行拼接的时候,我们往往喜欢使用+号来对两个字符串进行拼接。这个在少量拼接的情况下没有什么问题,但是在大量字符串拼接的时候就非常耗资源。因为String的底层是char的数组实现的。数组元素个数的变化需要重新创建一个新的数组,然后再进行赋值。所以非常耗时。这种情况需要使用StringBuffer

10、什么是线程池,如何使用?** **

答案:线程池,就是线程的池子,用来管理线程的。当实现线程池的时候,我们就不需要创建线程了,因为线程是由线程池创建的。我们需要创建的是Runnable对象。所以使用线程池的话,就不会出现new Thread这样的语句。

使用线程池的目的是为了有效的管理线程的数量,让线程的数量可控。我们只需要创建Runnable对象,然后把Runnable对象丢到线程池里面去就可以了,至于这个Runnable什么时候执行,是由线程池控制的。一般,在下载功能模块的时候会使用到线程池。

线程池的使用方法分为两步:

1、创建线程池

ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(

5, //corePoolSize :这个池子里面的核心线程数量。正常情况下,池子里面同时运行的线程数量

10, //maximumPoolSize : workqueue 满的情况下,池子里面同时运行的线程数量

0, //keepAliveTime :空闲时间,线程执行完当前任务,到执行下一个任务的休息时间

TimeUnit.SECONDS,// unit :空闲时间单位

new ArrayBlockingQueue(20),//workQueue :队列,存的是,等待中的任务

Executors.defaultThreadFactory(),//threadFactory :创建线程的工厂类

new ThreadPoolExecutor.AbortPolicy()//handler :异常处理机制

);

2、创建Runnable对象,把此对象丢到线程池中。

Runnable r = new Runnable(){

@Override

public void run() {

// 执行相关操作,如访问网络等

}};

mExecutor.execute(r);

11、在开发Android应用的时候,你什么时候使用过线程池?** **

在下载模块中需要使用到线程池,因为如果同时有100个下载任务的话,我不可能new出100个线程进行下载吧,那样会非常影响系统性能。通过线程池就可以很好的来控制同时下载任务的数量。

还有一个就是AsyncTask,它内部也是维护了一个线程池,之前看它源码的时候了解到。正是由于它的这个特点,所以有时候在应用中使用AsyncTask的时候,我们的任务有时候不会立马执行。

12、说说你在Android使用到的设计模式** **

在Android中使用最多的就是适配器模式,这个在ListView、ViewPager、GridView中必须使用到,而这几个控件在Android无处不见。它其实就是让View和数据集合连接起来,使得View能够显示出正确的数据。

我还经常使用单例模式,这种模式可以保证程序当中只有一个对象实例。比如当我们使用xutils中的BitmapUtils来显示图片的时候,就需要保证BitmapUtils只有一个实例,而单例模式的写法也比较简单,只要满足几个条件就可以了。

1、构造方法私有

2、私有的,静态的成员变量

3、公开的,静态的getInstance方法

4、为了线程安全,需要在getInstance的方法上加上synchronized关键字

我还经常使用观察者模式。观察者模式也可以理解为回调。其实观察者模式在Android也几乎无处不见,我们通常会给Button设置一个onClickListener,这个其实就是一个观察者模式。在我做下拉刷新的ListView这个控件的时候,也使用到了观察者。因为ListView需要在特定的情况下,比如下拉到达一定距离的时候,通知Activity,让Activity去重新加载数据。当ListView滑动到底部的时候,通知Activity,让Activity去加载一下页数据。而观察者模式的写法也相对固定,分为以下几个步骤:

1、定义观察者,一般是一个接口,而接口中的方法为观察者感兴趣的事件。

2、保存观察者,你可以保存在一个变量中,也可以通过一个ArrayList将它存储起来

3、在特定的情况下,通知观察者,其实也就是调用观察者的方法。

13、有没有使用过枚举,什么时候使用它?** **

枚举可以和类进行比较,枚举是特殊的一种类,体现在以下几个方面:

1.关键字class变成了enum

2.创建对象不写new了,直接声明一个变量就可以了。

3.构造方法私有,不能在外面创建对象

作用:枚举类就是为了控制有限个对象而设计出来的,构造方法私有,不能在外部创建

一般来说可以使用枚举来代码某些状态,当然可以使用int值来区分不同的状态,使用枚举显得更专业些。

14、写几个**linux指令 **

答案:cd、mkdir、chmod、chown、cp、ls、reboot、rm、rmdir、mv、cat

15、写几个**adb指令 **

adb shell

adb start-server

adb kill-server

adb devices

adb install

adb uninstall

adb pull

adb push

adb -s

17、如何设置透明的Activity,这个对生命周期有什么影响?** **

启动activity默认是占满整个屏幕,如果想让这个activity以对话框的方式展示,则需要配置:android:theme="@android:style/Theme.Dialog",此时它下面的activity并不会执行onStop方法,而是仅执行onPause方法

18、如何保持Activity的状态** **

除了在栈顶的activity,其他的activity在系统资源匮乏的时候,都有可能会被  系统回收。如果activity被系统没有onDestory的情况下就被系统回收了,这   时候系统会调用onSaveInstanceState方法,我们可以往bundle里面存放数据。         在activity onCreate里面我们先判断一下bundle是不是为空,如果不为空,就代表这个activity之前被系统回收掉,应该恢复一下现场。我们就可以从bundle里面取值。

具体的使用场景:填写资料的时候,记录ViewPager当前是哪一页

19、横竖屏切换对生命周期的影响?** **

默认情况下,横竖屏切换的时候会重新创建新的activity,新的那个activity会  执行onCreate方法。可以通过AndroidManifest文件进行配置,让它横竖屏切换的时候不重新创建Activity,配置方法为android:configChanges="orientation|keyboardHidden|screenSize",配置之后就不会创建新的Activity,而是执行当前activity的onConfigurationChanged。

我们在工作开发中,一般都是写死屏幕的方向:

在AndroidManifest中配置android:screenOrientation="landscape"

竖屏:portrait

和下面的Activity一致:behind

20、如何退出应用** **

在Application中使用一个ArrayList,在 Activity执行onCreate方法的时候,往这个集合add这个Activity,在点击退出按钮的时候,遍历这个ArrayList,取出Activity,执行finish方法。

注意:切记别忘了在onDestory中要把当前Activity从ArrayList中移除,否则会造成内存泄漏

21Android中是如何管理Activity的** **

Android中是通过 栈来管理Activity的,是一种先进后出的数据结构。四大组件中只有Activity是有栈的,其他的都没有。所以在Service或者广播接收者中要启动Activity需要加入一个flag:Intent_ACTIVITY_NEW_TASK

** 23**、Activity的启动模式模式有哪些?** **

启动模式一共有四种,

standard:默认的模式,没有限制,栈里爱有几个有几个,只要startActivity启动这种类型的                  Activity,那么就都会重新创建一个新的Activity

singleTop:栈顶只有一个,栈内可以有多个

singleTask:整个栈只有一个

singleInstance:霸道,整个栈只有自己

24、了解onNewIntent吗?什么时候会使用到这个方法** **

在复用Activity的时候会调用到此方法,也就是singleTop、singleTask、singleInstance的Activity才有可能会调用到此方法。

虽然配置了singleTask的activity,在startActivity的时候有可能不会创建activity,但是,毕竟代码中也是通过startActivity来启动了这个activity,而启动了这个activity有可能会带有新的参数,此时需要在onNewIntent中更新intent。

具体的使用场景是,如果当前处于新闻详情页面,此时有一个通知,这个通知点开之后也会跳到详情页面,一般来说,详情页面会使用singleTask,这时候就需要在onNewIntent中将intent设置到activity中,调用setIntent方法,只有这样,才能通过getIntent取得最新的新闻详情id,然后去加载服务器数据。

25、什么是ANR****?ANR出现的原因?如何解决ANR **

ANR就是Android Not Response安卓无响应,简单来说,ANR出现的原因是主线程被耗时操作阻塞了,来不及处理窗口消息造成的无响应。窗口消息包括触摸、按键,弹框,setText等,当这些消息得不到及时的处理,就会出现ANR了。其实每一个发往主线程的消息其实都带有一个超时时长,超过了这个时间,这个消息还没有处理,就会出现ANR,不同组件超时时长都不一样,Activity的超时是5s,BroadcastReceiver超时是10s,Service超时是20s,这里需要注意的是,四大组件都是运行在主线程中的,所以,在这些组件中,如果有耗时操作,请创建子线程。将所有耗时操作,比如访问网络,Socket 通信,查询大量 SQL 语句,复杂逻辑计算等都放在子线程中去,然后 通过 handler.sendMessage、runonUITread、AsyncTask 等方式更新 UI。无论如何都要确保用户界面操作的流畅度。 如果耗时操作需要让用户等待,那么可以在界面上显示进度条。

如果出现了ANR,我们可以通过log信息以及traces.txt文件进行分析。traces.txt里面记录的是stack信息。traces.txt的路径:/data/anr/traces.txt

26、数据存储的方式有哪些** **

内存、数据库、SharedPreference、文件

对于文件而言,可以存在sd卡中,也可以存在用户空间。下载的一些大图片、大文件,一般会存在sd卡中,一些较小的数据,如json数据等,会存在用户空间中。

27、如何判断是否有** SD 卡?如何得到**sd卡的路径**** **

可以通过如下代码来判断

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

如果是true就代表有SD卡,false就代表没有SD卡。

获取SD卡的路径:

File file = Environment.getExternalStorageDirectory();

一般来说,SD卡路径为/sdcard/

28、有没有使用过meta-data?它是干嘛的?** **

meta-data就是用来存储一些配置的,具体的表现是key-value类型

发布渠道

广告平台 (多盟)

29、广播接收者的注册方式** **

动态注册和静态注册

30、广播的类型有哪些** **

主要使用到有序广播和无序广播,广播一般也用于跨进程通讯,一般我们会在自己的应用中注册一些广播接收者来接收系统发送出来的广播,比如电量变化、来电、来短信、网路状态发生改变等等。

有序广播是按顺序一个传给一个的,可以通过abortBroadcast来终止广播的传递,而无序广播是无法终止的。

�i4l.�

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值