2016 Android面试题
这些面试题全是在网上看到,然后收集。
1.Message,Handler,MessageQueue,Looper的关系
Handler的成创建依赖当前线程中的Looper,若当前线程中没有Looper则必须调用Looper.prepare()来创建一个Looper,将Looper放入ThreadLocal中,接着调用Looper.loop()不断遍历MessageQueue。而在主线程中启动时会默认创建一个Looper,所以在主线程中可以直接使用Handler。
Handler.sendMessage方法会将Message到MessagewQueue,Looper不断循环从MessageQueue中取出消息,回调handleMessage方法。
2.内存泄露和内存溢出有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
内存溢出一般理解为应用运行需要的内存,超出它可用的最大的内存。一般加载一个大的图片或者大量图片的时候会遇到。
内存泄露就是应用对某部分内存的使用,使用完成后没有释放。
内存优化方法:
在加载图片时,可以考虑将图片进行压缩,根据需要显示在View的大小进行压缩。使用LruCache缓存的目的来控制图片所能使用的内存。对比较消耗的对象及时的关闭。例如Service
3.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?
AsynTask运用的场景就是需要进行一些耗时的操作,一般就是进行网络请求。耗时操作完成后更新主线程或者在操作中对主线程UI进行更新。
缺陷:
AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓存队列,当线程池中已有128个线程,缓存队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。
解决:
由一个控制线程来处理AsyncTask的调用线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。
4.横竖屏切换时候Activity的生命周期
1.不设置Actvitiy的android:configChange时,切屏会重新调用各个生命。切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
切换横屏:
onSaveInstanceState–>onPause–>onStop–>onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume–>
切换竖屏:
onSaveInstanceState–>onPause–>onStop–>onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume–>
onSaveInstanceState–>onPause–>onStop–>onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume–>
2.设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
但切换竖屏时,会多打印一行onCongfigChanged。
切换横屏:
onSaveInstanceState–>onPause–>onStop–>onDestroy–>
onCreate–>onStart–>onRestoreInstanceState–>onResume–>
切换竖屏:
onSaveInstanceState–>onPause–>onStop–>onDestroy–>
onCreate–>onStart–>onRestoreInstanceState–>onResume–>
onConfigurationChanged–>
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
补充
当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState –> onPause –> onStop onRestart –>onStart—>onResume
Activity未被完全覆盖只是失去焦点:onPause—>onResume
5.AIDL的全称是什么?如何工作?
全称是:Android Interface Define Language
在Android中,每个应用程序都可以有自己的进程,在写UI应用的时候,经常要用到Service。
在不同的进程中,怎么传递对象呢?
Java中不允许跨进程内存共享。传递对象,只能把对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的。在J2EE中,采用RMI的方式,可以通过序列化传递对象。
在Android中,则采用AIDL的方式。理论上AIDL可以传递Bundle。
AIDL(android 接口描述语言)是一种接口描述语言:编译器通过aidl文件生成一段代码,通过预先定义达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象。需要先将对象转化成AIDL可识别的参数,然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的的对象。AIDL的IPC机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它是轻量级的。它使用代理类在客户端和实现层间传递值。
如果要使用AIDL,需要完成2件事情:
1.引入AIDL的相关类;
2.调用aidl产生的class。
AIDL的创建方法:
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递和返回值。由于远程调用的需要,这些参数和返回值并不是任何类型。
部分AIDL支持的数据类型:
1.不需要import声明的简单Java编程语言类型(int,boolean)
2.String,CharSequence不需要特殊声明
3.List,Map和Parcelables类型,这些类型内所包含的数据成员也只能是简单数据类型,String等其他支持的类型
6什么是Activity?
四大组件之一,一般的,一个用户交互界面对应一个activity。activity是Context的子类,同时实现了window.callback和keyevent.callback,可以处理与窗体用户交互的事件。
7如何将一个Activity设置成窗口的样式
方法一:
在AndroidManifest.xml文件当中设置当前activity的一个属性(系统自带的属性):
android:theme=”@android:style/Theme.Dialog”
方法二:
1.在styles.xml文件中一个parent为android:style/Theme.Dialog的自定义styles
2.在AndroidManifest.xml文件中,在需要显示为窗口模式的activity中添加属性
android:theme="@style/Theme.FloatActivity
8.怎么让在启动一个Activity是就启动一个service?
在activity的onCreate()方法里面startService();
9.Activity怎么和service绑定,怎么在activity中启动自己对应的service?
bindService(). 让activity能够访问到 service里面的方法
构建一个intent对象,
Intent service = new Intent(this,MyService.class);
通过bindService的方法去启动一个服务,
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
ServiceConnection 对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.
private class myconn implements ServiceConnection
{
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//可以通过IBinder的对象 去使用service里面的方法
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
10什么是Service以及描述下它的生命周期,Service有哪些启动方法,有什么区别,怎么停用Service?
Service生命周期:
onCreate,onStart,onDdstroy,onBind和onUnbind。
有两种启动方法,对Service的生命周期的影响不一样的。
1.通过startService
Service会经历onCreate到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。
如果调用者直接退出而没有调用stopService的话,Service会一直在后台运行。
2.通过bindService
Service会运行onCreate,然后调用onBind,这个时候调用者和Service绑定在一起。调用者退出了,Service就会调用onUnbind->onDestroyed方法
调用者也可以通过滴调用unbindService方法来停止服务,这时候Service就会调用onUnbind->onDesttroyed方法。
注意
一个原则就是Service的onCreate的方法只会被调用一次,无论多少次的startService又bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。
如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就top不掉了,只能先unbindService,再stopService。
如果一个service通过startService被start之后,多次调用startService的话,service会多次调用onStart方法。而多次调用stopService,service只会调用一次onDestroyed方法。
如果一个service通过bindService被start之后,多次调用bindService只会调用一次onBind方法。
多次调用unbindService的话会抛出异常。
11.什么是IntentService?有何特点?
普通的Service默认运行在UI主线程中。IntentService是Service的一个子类。IntentService自动实现多线程,会新建工作线程专门处理任务。同时使用队列来管理请求启动IntentService的各个Intent。
例如当有3个intent都请求该IntentService,那么IntentService会按照队列顺序依次去新建线程,处理任务,保证在同一时间内只有一个Intent在调用该IntentService。当调用完毕后IntentService会自动停止自身,并处理下一次的调用。直至最后。所以如果用户使用IntentService,用户不需要主动的使用stopService或者在IntentService中使用stopSelf()来停止。
继承IntentService必须实现onHandleIntent()方法,将耗时的任务放在这个方法内就可以。其他的方面,IntentService跟普通的Service一样。
7.如何退出Activity?如何安全退出已调用多个Acitvity的Application?
1、抛异常强制退出:
该方法通过异常,使程序Force Closse。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
2、记录打开的Actiivty:
每打开一个Activity,新记录下来。在需要时退出,关闭每一个Acticity即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Actiivty收到广播后,关闭即可。
4、递归退出
在打开新的Acticity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
5、通过Intent的flag来实现。Intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,然后在activity的onCreate方法里面finish掉。
8.Intent和IntentFilter
Intent:
Android中通过Intent对象来表示一条消息,一个Intent对象不仅含有这个消息的目的地,还可以包含消息的内容,这好比一封Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个Intent的对象,消息“目的地”是必须的,而内容是可选项。通过Intent可以实现各种系统组件的调用与激活。
IntentFilter:
可以理解为邮局或者是一个信笺的分拣系统
这个分拣系统通过3个参数来识别
Action:动作
Data:数据uri
Category:额外的附加信息
Action匹配
Action是一个用户定义的字符串,用于描述一个Android应用程序组件,一个IntentFilter可以包含多个Action。在AndroidMainfest.xml的Activity定义时可以在其节点指定一个Action列表用于标示Activity所能接受的“动作”。
<intent-filter>
<action android:name="android,intent.action.Main"/>
<action android:name="cn.itcast.action"/>
</intent-filter>
如果我们在启动一个Activity时使用这样的Intent对象:
Intent intent = new Intent();
intent.setAction("cn.itcast");
URI数据匹配
一个Intent可以通过URI携带外部数据给目标组件。在节点中你,通过节点匹配外部数据。
mimeType属性指定携带外部数据类型,scheme指定协议,host、port、path指定数据的位置、端口和路径。
如下:
<data
android:mimeType="mimeType"
android:scheme="scheme"
adnroid:host="host"
android:port="port"
adnroid:path="path"
/>
如果在IntentFilter中指定这些属性,那么只有所有的属性都匹配成功时URI数据匹配才会成功。
Category类别匹配
节点中可以为组件定义一个Category类别列表,当Intent中包含这个列表的所有项目时Category类型匹配才会成功。默认是DEFAULT
9.Intent传递数据时,可以传递那些类型数据?
1.一般的基本数据类型
Intent.putextra();
Intent.getextra();
2.数据的uri,intent.setData();intent.getData();
10.Android的数据存储方式
文件
数据库sqlite
SharedPreference
网络
11.Android中常用的五种布局
1、FrameLayout(框架布局)
从屏幕的左上角开始布局,叠加显示,实际应用 播放器的暂停按钮
2、LinearLayout(线性布局)
一个个罗列在屏幕上。分为垂直和水平布局
android:orientation=”vertical”
android:orientation=”horizontal”
3、AbsoluteLayout(绝对布局)
指定absolute属性,用XY坐标来指定元素的位置
android:layout_x=”20px”
android:layout_y=”12px”
指定机型的游戏开发中经常用到绝对布局
4、RelativeLayout(相对布局)
以某一个元素为参照物,来定位的布局方式。
5、TableLayout(表格布局)
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow。TableRow里面可以具体定义每一个元素,设定它的对齐方式android:gravity=”“
12.对一些资源以及状态的操作保存,最好是保存在生命周期的onStart()方法。
13.Intent的作用:可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
14.在android中,请简述jni的调用过程
1.安装和下载Cygwin吗,下载Android ndk
2.在ndk项目中jni接口的设计
3.使用c/c++实现本地方法
4.jni生成动态链接库.so文件
5.将动态链接库复制到android工程,在android工程中调用,运
行android工程即可
15.简述Android应用程序结构是哪些?
Android应用结构:
Linux Kernel(Linux内核)
Libbraries(系统运行库或者是c/c++核心库)ApplicationFramework(开发框架包)
Appliications(核心应用程序)
16.Android程序运行时权限与文件系统权限的区别
运行时权限 android授权
文件系统 linux内核授权
17.android中动画有哪几类,它们的特点和区别是什么?
两种。一种Tween动画、还有Frame动画。
Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
18.Android的IPC机制
IPC是内部进程通信的简称,是共享”命名管道”的资源。Android中IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中的该机制,只适用于Activity和Service之间通信,类似远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Service端实现IPC接口,Client端调用IPC接口本地代理。
19.Fragment的生命周期
Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
20.RemoteView在哪些功能中使用?
App widget和Notification中
21.SurfaceView和View的区别是什么?
SurfaceView中采用了双缓存技术,在单独的线程更新界面
View在UI线程中更定界面
22.Android中进程的优先级?
前台进程
可见进程
服务进程
后台进程
空进程
*
静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?
静态内部类:使用static修饰的内部类
内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类
匿名内部类:使用new生成的内部类
因为内部类的产生依赖于外部类,持有的引用是类名.this
ArrayList和Vector的主要区别是什么?
ArrayList在Java1.2引入,用于替换Vector
Vector:
线程同步
当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍
ArrayList:
线程不同步,但性能很好
当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小
service生命周期,可以执行耗时操作吗?
JNI开发流程
Java线程池,线程同步
自己设计一个图片加载框架
自定义View相关方法
http ResponseCode
插件化,动态加载
性能优化,MAT
AsyncTask原理
65k限制
Serializable和Parcelable
文件和数据库哪个效率高
断点续传
WebView和JS