2016 Android面试题(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值