Android常见面试题解答

1. Activity与Fragment的生命周期。




  1. onCreate过程  
  2. 01-22 15:30:28.091: E/HJJ(10315): Activity &&&& onCreate...  
  3. 01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onAttach...  
  4. 01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onCreate...  
  5. 01-22 15:30:28.115: E/HJJ(10315): ArrayListFragment **** onCreateView...  
  6. 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onActivityCreated...  
  7.   
  8. onStart过程  
  9. 01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onStart...  
  10. 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onStart...  
  11.   
  12. onResume过程  
  13. 01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onResume...  
  14. 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onResume...  
  15.   
  16. onPause过程  
  17. 01-22 15:31:26.748: E/HJJ(10315): ArrayListFragment **** onPause...  
  18. 01-22 15:31:26.748: E/HJJ(10315): Activity &&&& onPause...  
  19.   
  20. onStop过程  
  21. 01-22 15:31:27.638: E/HJJ(10315): ArrayListFragment **** onStop...  
  22. 01-22 15:31:27.638: E/HJJ(10315): Activity &&&& onStop...  
  23.   
  24. onStart过程  
  25. 01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onStart...  
  26. 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onStart...  
  27.   
  28. onResume过程  
  29. 01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onResume...  
  30. 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onResume...  
  31.   
  32. onPause过程  
  33. 01-22 15:32:47.412: E/HJJ(10315): ArrayListFragment **** onPause...  
  34. 01-22 15:32:47.412: E/HJJ(10315): Activity &&&& onPause...  
  35.   
  36. onStop过程  
  37. 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onStop...  
  38. 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop...  
  39.   
  40. onDestroy过程  
  41. 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroyView...  
  42. 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroy...  
  43. 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDetach...  
  44. 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onDestroy...  

2. Acitivty的四种启动模式与特点。

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置

 

1. Standared模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

 

2. SingleTop模式

这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

 

3. SingleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

 

4. SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity


3. Activity缓存方法。

使用内存缓存:不回收,容易爆内存溢出。内存缓存速度很快,但是您无法确定图片是否在缓存中存在。像
GridView 这种控件可能具有很多图片需要显示,很快图片数据就填满了缓存容量。
同时您的程序还可能被其他任务打断,比如打进的电话 — 当您的程序位于后台的时候,系统可能会清楚到这些图片缓存。一旦用户恢复使用您的程序,您还需要重新处理这些图片。

使用硬盘缓存:当这些图片在内存缓存中不可用的时候,可以从磁盘缓存中加载从而省略了图片处理过程。
当然, 从磁盘载入图片要比从内存读取慢很多,并且应该在非UI线程中载入磁盘图片。

注意: 如果缓存的图片经常被使用的话,可以考虑使用ContentProvider ,例如在图库程序中就是这样干的。


4. Service的生命周期,两种启动方法,有什么区别。

Service有两种使用方法:

1>以调用Context.startService()启动,而以调用Context.stopService()结束

2>以调用Context.bindService()方法建立,以调用Context.unbindService()关闭

service重要的生命周期方法

当用户调用startService ()或bindService()时,Service第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法,通常用于初始化设置。注意:多次调用startService()或bindService()方法不会多次触发onCreate()方法

      通过startService()方法启动的服务

      初始化结束后系统会调用该方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法

void onStart(Intent intent)

通过bindService ()方法启动的服务

      初始化结束后系统会调用该方法,用来绑定传递给bindService 的Intent 的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法

IBinder onBind(Intent intent)

5. 怎么保证service不被杀死。

(1)建立两个service互相监听,当一个service被kill掉的时候马上启动另一个

(2)在onDestory里自监听。service +broadcast  方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service

(3)提升进程优先级(有6个优先级)

(4)将APK安装到/system/app,变身系统级应用(流氓方法,一般不使用,只在做测试demo的时候用)


6. 广播的两种注册方法,有什么区别。

(1)在AndroidManifest.xml文件中注册。

         好处:一旦应用程序被安装到手机里,BroadCast Receiver就开始生效。无论应用程序进程是否运行,运用程序是否在开启状态下都可以接受到广播事件。
(2)通过代码的方式注册广播
          好处:一旦运用程序停止,广播也跟着停止

7. Intent的使用方法,可以传递哪些数据类型。

  • 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
  • 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
Intent/Bundle 支持传递基本类型的数据和基本类型的数组数据,以及 String/CharSequence 类型的数据和 String/CharSequence 类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递 Parcelable (包裹化,邮包)和 Serializable (序列化)类型的数据,以及它们的数组/列表数据。


8. ContentProvider使用方法。

为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider,比如联系人、短信、图片信息、通话记录等等;

ContentProvider使用表的形式来组织数据,无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格;

提供的方法:增删改查获取回调;

每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中。


9. Thread、AsycTask、IntentService的使用场景与特点。

Thread:线程

AsycTask:是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

使用的优点:简单,快捷,过程可控

IntentService: 异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。

IntentService有以下特点:

(1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2)  创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3)  不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4)  默认实现的onBind()返回null

(5)  默认实现的onStartCommand()的目的是将intent插入到工作队列中


10. 五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout各自特点及绘制效率对比。


11. Android的数据存储形式。

SharedPeferences、文件存储、ContentProvider、SQLite数据库存储、网络存储


12. Sqlite的基本操作。


13. Android中的MVC模式。

MVC:模型(model)-视图(view)-控制器(controller)


14. Merge、ViewStub的作用。


15. Json有什么优劣势。(ps.阿里有fastjson,Google有Gson,还有json-smart,速度最快

JSON  XML 优缺点的比较

(1)    在可读性方面,JSONXML的数据可读性基本相同。JSONXML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

(2)   在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3)       在编码难度方面,XML有丰富的编码工具,比如Dom4jJDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

(4)       在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5)       在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6)       JSONXML同样拥有丰富的解析手段。

(7)       JSON相对于XML来讲,数据的体积小。

(8)       JSONJavaScript的交互更加方便。

(9)       JSON对数据的描述性比XML较差。

(10)   JSON的速度要远远快于XML


16. 动画有哪两类,各有什么特点?


17. Handler、Loop消息队列模型,各部分的作用。


18. 怎样退出App。

//在onCreate() 中将Activity 实例 放到 线性容器中, 退出时不停地((Activity)list.gert(i)).finsh();

Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!

AppUtils类(储存每一个Activity,并实现关闭所有Activity的操作)

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * To change this template, choose Tools | Templates 
  3.  * and open the template in the editor. 
  4.  */  
  5. package com.cpic.jscx.android.utils;  
  6.   
  7.   
  8. import android.app.Activity;  
  9. import android.app.Application;  
  10. import java.util.LinkedList;  
  11. import java.util.List;  
  12.   
  13.   
  14. /** 
  15.  * 
  16.  * @author user 
  17.  */  
  18. public class AppUtils extends Application{  
  19.     private List<Activity> activityList = new LinkedList<Activity>();  
  20.     private static AppUtils instance;  
  21.             private AppUtils()  
  22.             {  
  23.             }  
  24.              //单例模式中获取唯一的app实例   
  25.              public static AppUtils getInstance()  
  26.              {  
  27.                             if(null == instance)  
  28.                           {  
  29.                              instance = new AppUtils();  
  30.                           }  
  31.                  return instance;               
  32.              }  
  33.              //添加Activity到容器中  
  34.              public void addActivity(Activity activity)  
  35.              {  
  36.                             activityList.add(activity);  
  37.              }  
  38.              //遍历所有Activity并finish  
  39.              public void exit()  
  40.              {  
  41.                           for(Activity activity:activityList)  
  42.                          {  
  43.                            activity.finish();  
  44.                          }  
  45.                            System.exit(0);  
  46.             }  
  47. }  


在每一个Activity中的onCreate方法里添加该Activity到AppUtils对象实例容器中
 AppUtils.getInstance().addActivity(this);


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState)  
  2. {  
  3.     super.onCreate(savedInstanceState);  
  4.     AppUtils.getInstance().addActivity(this);  
  5.     setContentView(R.layout.main);  
  6.     findViews();  
  7. }  


在需要结束所有Activity的时候调用exit方法

AppUtils.getInstance().exit();





19. Asset目录与res目录的区别。

20. Android怎么加速启动Activity。

21. Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。

22. Android中弱引用与软引用的应用场景。

23. Bitmap的四种属性,与每种属性队形的大小。

24. View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。

25. Touch事件分发机制。

26. Android长连接,怎么处理心跳机制。

27. Zygote的启动过程。

28. Android IPC:Binder原理。

29. 你用过什么框架,是否看过源码,是否知道底层原理。

30. Android5.0、6.0新特性。


31.Android ANR异常及解决方法

ANRs (“Application Not Responding”),意思是”应用没有响应“。


 

在如下情况下,Android会报出ANR错误:

– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件

– BroadcastReceiver 没有在10秒内完成返回

通常情况下,下面这些做法会导致ANR

 

1、在主线程内进行网络操作

2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)

应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢”…等等

逻辑应该是
1. new出一个新的线程,进行数据请求
2. 获取数据后,调用handler.sendMessage方法
3. 在handler的handle()方法中更新UI

 





Android的话,多是一些项目中的实践,使用多了,自然就知道了,还有就是多逛逛一些名人的博客,书上能讲到的东西不多。另外android底层的东西,有时间的话可以多了解一下,加分项。

推荐书籍:《疯狂android讲义》《深入理解android》

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值