【转载】2015Android 面试题 01

1.如何避免ANR?

  答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。

    当出现下列情况时,Android就会显示ANR对话框了:   

    对输入事件(如按键、触摸屏事件)的响应超过5秒   

    意向接受器(intentReceiver)超过10秒钟仍未执行完毕

  Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。   

  因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。

  潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。

  但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前        我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。

  这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。

  2. handler机制的原理

  答 :andriod提供了 Handler 和 Looper 来满足线程间的通信

    Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。  

    1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。  

    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。   

    3) Message Queue(消息队列):用来存放线程放入的消息。  

    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue

 

  3. Android引入广播机制的用意?

  答:

  a:从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。

  android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。   

  b:程序间互通消息(例如在自己的应用程序内监听系统来电)   

  c:效率上(参考UDP的广播协议在局域网的方便性)  

  d:设计模式上(反转控制的一种应用,类似监听者模式)

 

  4.什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

  答:一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误。

 

 5.如何将一个Activity设置成窗口的样式。

  讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的地方一句话:  

 Xml代码 1. android :theme="@android:style/Theme.Dialog"    

    这就使你的应用程序变成对话框的形式弹出来了,

  或者Xml代码   1. android:theme="@android:style/Theme.Translucent"  就变成半透明的,

  [友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable   

  上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' < --注意:这个是文章内容不是笑脸)

  就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。

  (简单来说直接在配置文件引入风格。追求效果的应用此用法用到挺多);

  6、IntentService有何优点?

  Acitivity的进程,当处理Intent的时候,会产生一个对应的Service Android的进程处理器现在会尽可能的不kill掉你 非常容易使用

  (这回答其实比较。。。其实我也不知道干嘛使,因为看帮助文档就说了一个用来处理异步请求的service,工作完了自己停止。没用过,不做评价)。

  7、 广播的生命周期?

  广播的生命周期非常短,当发送之后intent会到AndroidManifest.xml方法中找是不是匹配的action,如果有就调用Receiver,然后获得Receiver对象,再执行onReceiver方法,这时候Receiver对象就没有用了,

  当我们再次点击按钮的时候就会重新获得对象,这就是BroadcastReceiver的生命周期。

  在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出ANR(Application No Response)的对话框。

  如果需要完成一项耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束,BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver的所在线程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死,所以采用子线程来解决是不可靠的。

  8、启动service的两种方法?有什么区别?

  一种是startService(),另一种是bindService()。

  这两者的区别是第一种方式调用者开启了服务,即会与服务失去联系,两者没有关联。即使访问者退出了,服务仍在运行。如需解除服务必须显式的调用stopService方法。

  主要用于调用者与服务没有交互的情况下,也就是调用者不需要获取服务里的业务方法。比如电话录音

  而后者调用者与服务绑定在一起的。当调用者退出的时候,服务也随之退出。用于需要与服务交互。

  

  

  9.android获取图片有哪几种方式:

方式一:

Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);  

  •         img.setImageDrawable(drawable);  

方式二:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),  

  •                 R.drawable.ic_launcher);  
  • img.setImageBitmap(bitmap); 

方式三:

AssetManager assetManager = getResources().getAssets();  

  • try {  
  •     InputStream is = assetManager.open("ic_launcher.png");  
  •     Bitmap bitmap = BitmapFactory.decodeStream(is);  
  •     img.setImageBitmap(bitmap);  
  • catch (IOException e) {  
  •     e.printStackTrace();  
  • }  

方式四:

AssetManager assetManager = getResources().getAssets();  

  • try {  
  •     InputStream is = assetManager.open("ic_launcher.png");  
  •     Drawable drawable = Drawable.createFromStream(is, null);  
  •     img.setImageDrawable(drawable);  
  • catch (IOException e) {  
  •     e.printStackTrace();  
  • }  

 当然,还有网络获取图片等方法

以下java的相关知识点:

1. ArrayList,Vector, LinkedList 的存储性能和特性

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按 序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchroni zed 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后 向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 

 

2.Collection 和 Collections 的区别

Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

 

3.HashMap 和 Hashtable 的区别

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于 Hashtable。 HashMap 允许将 null  作为一个 entry 的 key 或者 value,而 Hashtable 不允许。 
HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 继承自 Dictionary 类,而 HashMap  是 Java1.2 引进的 Map interface 的一个实现。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的 方法实现同步,而 HashMap 就必须为之提供外同步。
Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。 

 

4.sleep() 和 wait() 有什么区别

sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时 后会自动恢复。调用 sleep 不会释放对象锁。 
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发 出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 

 

5.Overload 和 Override 的区别

Overloaded 的方法是否可以改变返回值的类型? 方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写  (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类 中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的 方法是可以改变返回值的类型。 

 

6.同步和异步有何异同,在什么情况下分别使用他们?

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了, 那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程, 在很多情况下采用异步途径往往更有效率。

posted on 2015-07-08 11:06  涛涛的小马甲  阅读(195)  评论(0编辑  收藏  举报

导航