Android面试大总结.docx

上传人:b****3 文档编号:3813444 上传时间:2022-11-25 格式:DOCX 页数:83 大小:201.34KB
下载 相关 举报
Android面试大总结.docx_第1页
第1页 / 共83页
Android面试大总结.docx_第2页
第2页 / 共83页
Android面试大总结.docx_第3页
第3页 / 共83页
Android面试大总结.docx_第4页
第4页 / 共83页
Android面试大总结.docx_第5页
第5页 / 共83页
点击查看更多>>
下载资源
资源描述

Android面试大总结.docx

《Android面试大总结.docx》由会员分享,可在线阅读,更多相关《Android面试大总结.docx(83页珍藏版)》请在冰豆网上搜索。

Android面试大总结.docx

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是内部进程通信的简称,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1