Android面试大总结.docx
- 文档编号:3813444
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:83
- 大小:201.34KB
Android面试大总结.docx
《Android面试大总结.docx》由会员分享,可在线阅读,更多相关《Android面试大总结.docx(83页珍藏版)》请在冰豆网上搜索。
Android面试大总结
Android面试题大总结
1.View的刷新:
在需要刷新的地方,使用handle(hande).sendmessage(僧的嘛首去)发送信息,然后在handle的getmessage里面执行inaliate(in耐需特)或者postinvaliate(破四特in耐需特).
2.GC内存泄露出现的情况可能有哪几种?
1).数据库的cursor(口所)没有关闭
2).构造adapter(额打不特)时,没有使用缓存contentview(坑拆次U)
衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/
3).Bitmap(B买谱)对象不使用时采用recycle()[V赛可]释放内存
4).activity中的对象的生命周期大于activity
调试方法:
DDMS==>HEAPSZIE==>dataobject==>[TotalSize]
3.对activity的理解之一
(简答:
①Activity是用户操作程序的接口。
实际上就是一个控件的容器,我们要把控件摆放在这个Activity中,来完成一个完整的功能。
通常一个activity对应一个布局文件
②Activity其实是Context的子类
)
在一个Activity正常启动的过程中,他们被调用的顺序是onCreate(可唉次)->onStart(思到特)->onResume,在Activity被干掉的时候顺序是onPause->onStop->onDestroy,这样就是一个完整的生命周期.但是有人问了,程序正运行着呢来电话了,这个程序咋办?
中止了呗,如果中止的时候新出的一个Activity是全屏的那么:
onPause->onStop,恢复的时候onStart->onResume,如果打断这个应用程序的是一个Theme为Translucent或者Dialog的Activity那么只是onPause,恢复的时候onResume。
onCreate:
在这里创建界面,做一些数据的初始化工作;
onStart:
到这一步变成用户可见不可交互的;
onResume:
变成和用户可交互的,(在activity栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity);
onPause:
到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。
在这里保存的数据,应该在onResume里读出来,注意:
这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动;
onstop:
变得不可见,被下一个activity覆盖了;
onDestroy:
这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个ProgressDialog在线程中转动,请在onDestroy里
把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。
onPause,onstop,onDestroy,三种状态下activity都有可能被系统干掉为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库)。
实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?
因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制[Handler,Message]来处理多线程和界面交互的问题。
4.DDMS与TraceView的区别?
DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,TraceView是序
性能分析器.
5.activity被回收了怎么办?
答案:
只有另起了!
6.在Java中如何引入C语言或者本地语言?
可以用JNI接口。
在JAVA中如果要调用C语言,需要将接口写成动态链接库的形式,然后在JAVA中调用.具体过程如下:
首先在JAVA程序中写上要引用的动态链接库,如:
static
{
System.loadLibrary("test");
}//动态链接库为test.dll
在程序中要声明本地方法,如:
publicnativevoiddisplay(Stringname);
然后对此JAVA程序编译,如:
javacHelloWorld.java
成功后再用如下命令生成对C语言的.h文件:
javah-jni-otest.hHelloWorld
打开生成的test.h文件,对对应写好test.c文件.
用如下命令生成动态链接库(test.dll):
cl-IC:
\j2sdk1.4.2\include-IC:
\j2sdk1.4.2\include\win32-LDtest.c
//其中C:
\j2sdk1.4.2\include为jdk的安装目录
这样就可以完成了.在原来的JAVA程序中可以方便地调用C接口.但在此过程中可能会遇到一些系统库文件无法找到的错误,只需要根据错误提示找到相应的文件考到相应的文件夹下就行了.
7.通过Intent传递一些二进制数据的方法有哪些?
1).使用Serializable接口实现序列化,这是Java常用的方法。
(Bundle.putSerializable(key,Object));
2).实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在AndroidAIDL中交换数据也很常见的.(Bundle.putParcelable(key,Object)).
8.说说HashSet和HashTable的区别?
HashSet相对于HashMap就是不能存放重复的数据,对于HashTable来说,存放的数据不能出现key或value为null这样的情况。
9.handler机制的原理
andriod提供了Handler和Looper来满足线程间的通信。
Handler先进先出原则。
Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper:
一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler:
你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从MessageQueue取出)所送来的消息。
3)MessageQueue(消息队列):
用来存放线程放入的消息。
4)线程:
UIthread通常就是mainthread,而Android启动程序时会替它建立一个MessageQueue。
10.如何退出打开的多个Activity?
(简答:
对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法
多个:
1、抛异常强制退出2)、记录打开的Activity3)、发送特定广播4)、递归退出
)
1、抛异常强制退出:
该方法通过抛异常,使程序ForceClose。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出ForceClose的窗口。
2)、记录打开的Activity:
每打开一个Activity,就记录下来。
在需要退出时,关闭每一个Activity即可。
3)、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
基于前面所做项目,对这个的处理:
把每一个打开的activity存放到栈里面,最后关闭程序的时候直接调用remove()方法。
11.请介绍下ContentProvider是如何实现数据共享的。
ContentProvider负责:
•组织应用程序的数据;
•向其他应用程序提供数据;
ContentResolver则负责:
•获取ContentProvider提供的数据;
•修改/添加/删除更新数据等;
ContentProvider向外界提供数据操作的接口:
query(Uri,String[],String,String[],String)
insert(Uri,ContentValues)
update(Uri,ContentValues,String,String[])
delete(Uri,String,String[])
12.如何启用Service,如何停用Service。
两种方式的区别是?
1)第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service;
2)第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
一.步骤
第一步:
继承Service类
publicclassSMSServiceextendsService{}
第二步:
在AndroidManifest.xml文件中的
name=".DemoService"/> 二.Context.startService()和Context.bindService 服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。 这两个方法都可 以启动Service,但是它们的使用场合有所不同。 1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。 2.采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法, 接着调用onStart()方法。 如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。 采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。 3.采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法, 接着调用onBind()方法。 这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。 如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。 如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。 13.请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系。 简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理。 14.AIDL的全称是什么? 如何工作? 能处理哪些类型的数据? AIDL的英文全称是AndroidInterfaceDefineLanguage 当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的 A工程: 首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。 ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。 说明一: aidl文件的位置不固定,可以任意 然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。 在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。 其次需要在AndroidManifest.xml文件中配置MyService类,代码如下: --注册服务--> name=".MyService"> --指定调用AIDL服务的ID--> name="net.blogjava.mobile.aidlservice.RemoteService"/> 为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。 说明: AIDL并不需要权限 B工程: 首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务 绑定AIDL服务就是将RemoteService的ID作为intent的action参数。 说明: 如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。 如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件 bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE); ServiceConnection的onServiceConnected(ComponentNamename,IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。 15.什么是ANR如何避免它? ANR: ApplicationNotResponding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。 当出现下列情况时,Android就会显示ANR对话框了: 1)对输入事件(如按键、触摸屏事件)的响应超过5秒; 2)意向接受器(intentReceiver)超过10秒钟仍未执行完毕 Android应用程序完全运行在一个独立的线程中(例如main)。 这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。 因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intentbroadcast)。 因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。 特别是活动生命周期中的重要方法如onCreate()和onResume()等更应如此。 潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。 但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束—也不需要调用Therad.wait()或者Thread.sleep()方法。 取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing: 可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。 使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。 这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。 16.简要解释一下activity、intent、intentfilter、service、Broadcase、BroadcaseReceiver? 一个activity呈现了一个用户可以操作的可视化用户界面; 一个service不包含可见的用户界面,而是在后台无限地运行; 可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信; 一个broadcastreceiver是一个接收广播消息并作出回应的component,broadcastreceiver没有界面; intent: contentprovider在接收到ContentResolver的请求时被激活; activity,service和broadcastreceiver是被称为intents的异步消息激活的; 一个intent是一个Intent对象,它保存了消息的内容。 对于activity和service来说,它指定了请求的操作名称和待操作数据的URI; Intent对象可以显式的指定一个目标component。 如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。 但如果一个目标不是显式指定的,android必须找到响应intent的最佳component; 它是通过将Intent对象和目标的intentfilter相比较来完成这一工作的。 一个component的intentfilter告诉android该component能处理的intent。 intentfilter也是在manifest文件中声明的。 17.横竖屏切换时候activity的生命周期? 总结: 1、不设置Activity的android: configChanges时,切屏会重新调用各个生命周期, 切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity的android: configChanges="orientation"时,切屏还是会重新调 用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android: configChanges="orientation|keyboardHidden"时, 切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 总结一下整个Activity的生命周期 补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变 Activity运行时按下HOME键(跟被完全覆盖是一样的): onSaveInstanceState-->onPause-->onStop onRestart-->onStart--->onResume Activity未被完全覆盖只是失去焦点: onPause--->onResume 18.如何将SQLite数据库(dictionary.db文件)与apk文件一起发布? 可以将dictionary.db文件复制到EclipseAndroid工程中的resaw目录中。 所有在resaw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。 可以将dictionary.db文件复制到resaw目录中 19.如何将打开resaw目录中的数据库文件? 在Android中不能直接打开resaw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。 复制的基本方法是使用getResources().openRawResource方法获得resaw目录中资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。 在AndroidSDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。 20.Android引入广播机制的用意? a: 从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。 android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互; b: 程序间互通消息(例如在自己的应用程序内监听系统来电); c: 效率上(参考UDP的广播协议在局域网的方便性); d: 设计模式上(反转控制的一种应用,类似监听者模式)。 21.android的优势与不足? (具体的请参见网络详细解释) Android平台手机5大优势: 一、开放性; 二、挣脱运营商的束缚; 三、丰富的硬件选择; 四、不受任何限制的开发商; 五、无缝结合的Google应用; 再说Android的5大不足: 一、安全和隐私; 二、首先开卖Android手机的不是最大运营商; 三、运营商仍然能够影响到Android手机; 四、同类机型用户减少; 五、过分依赖开发商缺少标准配置。 22.谈谈Android的IPC机制 IPC是内部进程通信的简称,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 面试 总结