您的位置:首页 > 职场人生

Android常见面试题解答

2015-10-05 10:40 531 查看
1. Activity与Fragment的生命周期。







onCreate过程

01-22 15:30:28.091: E/HJJ(10315): Activity &&&& onCreate...

01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onAttach...

01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onCreate...

01-22 15:30:28.115: E/HJJ(10315): ArrayListFragment **** onCreateView...

01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onActivityCreated...

onStart过程

01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onStart...

01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onStart...

onResume过程

01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onResume...

01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onResume...

onPause过程

01-22 15:31:26.748: E/HJJ(10315): ArrayListFragment **** onPause...

01-22 15:31:26.748: E/HJJ(10315): Activity &&&& onPause...

onStop过程

01-22 15:31:27.638: E/HJJ(10315): ArrayListFragment **** onStop...

01-22 15:31:27.638: E/HJJ(10315): Activity &&&& onStop...

onStart过程

01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onStart...

01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onStart...

onResume过程

01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onResume...

01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onResume...

onPause过程

01-22 15:32:47.412: E/HJJ(10315): ArrayListFragment **** onPause...

01-22 15:32:47.412: E/HJJ(10315): Activity &&&& onPause...

onStop过程

01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onStop...

01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop...

onDestroy过程

01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroyView...

01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroy...

01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDetach...

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)
在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
(2)
在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3) 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,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) JSON和XML同样拥有丰富的解析手段。

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

(8) JSON与JavaScript的交互更加方便。

(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
plaincopy





/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package com.cpic.jscx.android.utils;

import android.app.Activity;

import android.app.Application;

import java.util.LinkedList;

import java.util.List;

/**

*

* @author user

*/

public class AppUtils extends Application{

private List<Activity> activityList = new LinkedList<Activity>();

private static AppUtils instance;

private AppUtils()

{

}

//单例模式中获取唯一的app实例

public static AppUtils getInstance()

{

if(null == instance)

{

instance = new AppUtils();

}

return instance;

}

//添加Activity到容器中

public void addActivity(Activity activity)

{

activityList.add(activity);

}

//遍历所有Activity并finish

public void exit()

{

for(Activity activity:activityList)

{

activity.finish();

}

System.exit(0);

}

}

在每一个Activity中的onCreate方法里添加该Activity到AppUtils对象实例容器中

AppUtils.getInstance().addActivity(this);

[java] view
plaincopy





public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

AppUtils.getInstance().addActivity(this);

setContentView(R.layout.main);

findViews();

}

在需要结束所有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》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: