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

Android面试总结-中高级

2016-03-14 09:00 465 查看
1、 Service的启动方式?怎么保证Service不被杀死?

A.两种启动方式,分别是Context.startService与Context.bindService

启动时的生命周期:

启动时,startService -> onCreate() -> onStart()

停止时,stopService -> onDestroy()

在服务启动时,多次调用context.startService只会调用onStart()方法,并不会多次创建服务。

绑定时的生命周期:

绑定时,bindService -> onCreate() –> onBind()

解绑定时, unbindService ->onUnbind() -> onDestory()

如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

B.  onstartCommond返回值START_STICKY
在onDestory发送广播,重新启动service
提升service优先级(android:priority = "1000")


提升service进程优先级,使用startForeground 将service放到前台状态

Application加上Persistent属性

将APK安装到/system/app,变身系统级应用

双进程守护

2、 View以及ViewGroup的事件分发机制?

A. 整个View的事件转发流程是:

View.dispatchEvent->View.setOnTouchListener->View.onTouchEvent

在dispatchTouchEvent中会进行OnTouchListener的判断,如果OnTouchListener不为null且返回true,则表示事件被消费,onTouchEvent不会被执行;否则执行onTouchEvent。

在OnTouchEvent中的主要有DOWN、MOVE、UP三个事件:

115ms

500ms

Down中,115ms内没有触发UP,将标志位置PRESSED,清楚PREPRESSED,检查长按

MOVE中,主要检测用户是否划出控件,115内划出直接移除mPendingCheckForTap,115后划出,将移除PRESSED标识

UP中:115内,此时标志位PREPRESSED

115-500ms,执行onClick回调

500ms以后,看是否设置了OnLongClickListerner,如长按的Onclick返回true,点击事件的Onclick将不会执行;如果没有设置长按监听,或者设置的长按监听返回false,则点击事件的onClick还是会执行。

B、ViewGroup的事件分发:

大体的事件流程为:

ViewGroup的dispatchTouchEvent -> ViewGroup的onInterceptTouchEvent -> 子View的dispatchTouchEvent ->子View的onTouchEvent

关于拦截:

复写ViewGroup的onInterceptTouchEvent方法:默认是不拦截的,即返回false;如果你需要拦截,只要return true就行了,这要该事件就不会往子View传递了,并且如果你在DOWN retrun true ,则DOWN,MOVE,UP子View都不会捕获事件;如果你在MOVE return true , 则子View在MOVE和UP都不会捕获事件。原因很简单,当onInterceptTouchEvent(ev) return true的时候,会把mMotionTarget 置为null ;

如何不被拦截:

在子View的dispatchTouchEvent中添加getParent().requestDisallowInterceptTouchEvent(true); 这样即使ViewGroup在MOVE的时候return true,子View依然可以捕获到MOVE以及UP事件。

3、 对app做了哪些性能优化,为什么要那样优化?

a) 布局优化,布局层数不能过深,使用,标签

b) 绘制优化,在自定义view中的onDraw方法中不能创建对象,且不能执行耗时任务操作

c) 内存泄露优化

d) 响应速度优化,在主线程中不能执行耗时操作

e) ListView和Bitmap优化,ViewHolder,控制异步,硬件加速;采样率

f) 线程优化,线程池

g) 其他优化,枚举,软引用、弱引用、特有数据结构、创建对象

4、 如何避免内存泄露

a) 对象的引用没有释放造成—及时释放有对象的引用的,少应用对象,弱引用

b) 资源对象没有关闭造成—及时关闭资源,选择LruCache对BitMap处理

c) 查询数据库后没有关闭游标cursor

d) 构造Adapter时,没有使用 convertView 重用

e) Bitmap对象不在使用时调用recycle()释放内存

f) 对象被生命周期长的对象引用,如activity被静态集合引用导致activity不能释放

减小对象的内存占用

使用更加轻量级的数据结构—ArrayMap/AparseArray

避免使用枚举类型

减小BitMap对象占用的内存

使用更小的图片

内存对象重复利用

复用系统自带的一些资源、如图片、颜色等

ListView、GridView的ConvertView的复用

BitMap对象的复用

避免在onDraw中执行对象的创建操作

StringBuffer代替过多的字符串“+”

避免对象的内存泄露

活动、BitMap的回收、游标的关闭、监听器的注销

内存优化策略

5、 MVC与MVP、MVVM架构

在MVC中V与M直接通信,V依赖M

在MVP中View并不直接使用Model,V与M通信是通过Presenter来进行,V与P是通过接口进行交互的。

Model-View-ViewModle, 数据访问-UI界面–View的抽象,负责View与Model之间的信息转换,将View的Command传送到Model;MVVM在概念上是真正将页面与数据逻辑分离的模式,在开发方式上,它是真正将前台代码开发者(JS+HTML)与后台代码开发者分离的模式

6、 Android5.0的新控件的了解

RecylclerView、CardView、Palette

RecycView是更加高级更加灵活ListView

LayoutManager负责重用不在视野范围内的item、

Item可以设置动画

ItemDecoration 自定义分割线

onClick

多选

充满大量自定义功能

标准化了ViewHolder,Adapter面向的是ViewHolder而不是view

7、 Handler、Looper、Message、MessageQueue

一个消息处理器有这自己的Lopper,MessageQueue,Lopper是个轮询器,不停的轮询MessageQueue的消息,在获取到消息只有交个Handler处理

Handler , sendMessage到MessageQueue,Looper不断

从MessageQueue中取出消息,回调handleMessage方法。

8、 项目是个什么样的架构?

功能层、网络架构、数据解析的封装、数据的存储

UI层、XML文件,Activity、Fragment、自定义View

业务层、一些工具类的封装、service

9、 怎么做好屏幕适配?

使用wrap_content、match_parent、weight

使用相对布局

使用尺寸限定符

使用最小宽度限定符

使用布局别名

使用.9.png图片

动态测量高度

10、 图片缓存策略及图片缓存的优化?

采样率,LruCache,LruDiskCache进行内存缓存、磁盘缓存

11、 项目中用到哪些设计模式?有何作用?单列模式又哪几种书写方式?

单例模式、观察者模式(接收短信中用到)、迭代器模式、适配器模式(适配器)、工厂模式(对话框中用到)

单例模式有7种写法:

静态内部类

1. public class Singleton

2. {

3. private Singleton(){

4. }

5.

6. private static class InstanceHolder{

7. private static final Singleton instance = new Singleton();

8. }

9.

10. public static Singleton getInstance(){

11. return InstanceHolder.instance;

12. }

13.

14. }

双重校验锁DCL,线程安全

1. public class Singleton {

2.

3. private volatile static Singleton sSingleton;

4.

5. private Singleton() {

6. }

7.

8. public static Singleton getInstance() {

9. if (sSingleton == null) { // line A

10. synchronized (Singleton.class) { // line C

11. if (sSingleton == null)

12. sSingleton = new Singleton(); // line B

13. }

14. }

15.

16. return sSingleton;

17. }

18.

19. }

12、 XML解析之DOM、SAX、PULL解析

SAX解析是事件驱动的,按顺序解析,效率快、占用内存少

DOM解析整个文档存储在内存中,通过树形结构存储XML

PULL解析与SAX类似,parse.next();

13、 内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?

内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。

内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。

内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。

还有对于比较耗资源的对象及时的关闭,例如Database Conn , 各种传感器 , Service 等等。

14、 AsyncTask的使用场景?缺陷?及解决方式?

执行耗时操作需要对主线程的UI进行更新操作

缺陷:只有长度为128的线程池,可以同时并发5个线程,3.0以前

3.0以后,默认是串行的,并发数可以自己控制

当到达最大缓存数128时,可以开启一个线程来监控,以免发生异常

15、 ContentProvider的了解?

为存储和获取数据提供统一接口,可以在不同应用进程中共享数据。提供增删改查等方法,每一个ContentProvider都有一个公共的URI,这个URI标书该contentprovider提供的数据

16、 View是如何刷新的?简述什么是双缓冲?

在主线程中调用invalidate(),在非主线程中调用postInvalidate()。双缓冲:使用后台画布,先把所有绘制操作都放在上面进行,等图画好之后,然后把backCanvas拷贝到屏幕关联的canvas中。

17、 项目中的哪个模块你觉得最有挑战、最有难度,你怎么实现的?

18、 子线程更新UI的方式有哪几种?

Handler

在子线程中通过runOnUiThread()方法更新UI

View.post(Runnable r)

异步任务

19、 异步任务的并发数和最大缓存书,当到达最大缓存数,怎么处理?

Android 3.0以上默认是串行,在3.0以前是并行执行的,最大并发数是5个,可以调用executeOnExecutor来并行的执行任务。

最大缓存

20、 全局变量和局部变量的区别,怎么保证异步带来全局变量读写问题?

作用域不同

21、 事件分发机制?

Android事件分发机制,有一个向下分发过程,该过程主要调用dispatchTouchEvent,还有一个向上返回过程,主要依靠onTouchEvent方法

Android事件从父视图分发到子视图,如果事件被拦截,则事件不会继续向下分发,而被当前视图消耗。此时上述的向下分发过程提前结束

没有被消耗的事件,从子视图逐级返回到父视图,最后又回到Activity,被Activity中的onTouchEvent()消耗。此时上述的向上返回过程提前结束

22、 滑动冲突问题?

23、 通讯录中一共有几张表,用什么样的方式可以快速查询某条记录?

24、 用过哪几种设计模式?

工厂模式、单例模式、观察者模式、代理模式

25、 简述MVC模式?MVC模式中M是怎么更新V的?

接口回调、实例对象调用方法

26、 多线程安全问题?

加锁机制synchronized

27、 怎么检测你手机APP性能问题?AS和EC中怎么检测评估?

28、 怎么对你手机APP在Android6.0上兼容性的评估?

29、 http、https的区别?https的管道安全性是在后台还是在客户端处理?

https协议需要到ca申请证书,一般免费证书很少,需要交费。

http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议

http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

30、 Sqlite是可以在子线程中操作吗?如果能,怎么保证数据的数据的正确性?

保持单个SqliteOpenHelper实例

同时对所有数据库操作的方法添加synchronized关键字

31、 当数据変更时,怎么重新绘制UI视图?

Invalidate与requestLayout操作

RequestLayout要求parent view重新调用他的onMeasure与onLayout来重新设置自己的位置。

Invalidate是本身调用迫使view的重画

32、 JAVA中的ArrayList对应于C++ JNI的什么数据类型?

JArray

33、 你说你负责整个项目的架构,说说你项目的架构是什么?

根据UI及需求,来分析项目的架构设计

活动-业务-数据-网络之间的关系

34、 MVC模式中,你项目中是怎么体现MVC模式的?

好处在于,便于UI界面部分的显示 与 业务逻辑、数据处理分开

M层:做一些业务逻辑的处理,比如数据库存取操作、网络操作、负责的算法、耗时的任务等都在M层中

V层:处理数据显示的部分、XML、html、js都属于V层,显示M层的数据结果

C层:处理用户交互问题,Activity,如读取View的数据、控制用户输入、并向model发送数据请求

35、 数据库升级操作,保留数据的升级?

onCreate()

onUpGrade()升级操作在此方法中执行,先判断数据库版本号,再执行sql相应操作,例如:

扩展一个字段:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//旧数据库版本为1,才为表pedant添加一个student_name字段

if(oldVersion < 2) {

db.execSQL(“ALTER TABLE pedant ADD COLUMN student_name text”);

}

}

删除表已有字段,需要重新创建一个临时表,完成数据迁移,而不能直接用drop命令:

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//旧数据库版本为1,删除表pedant的c字段

if(oldVersion < 2) {

db.beginTransaction();

try {

db.execSQL(“CREATE TEMPORARY TABLE pe_backup (a, b);”);

db.execSQL(“INSERT INTO pe_backup SELECT a, b FROM pedant;”);

db.execSQL(“DROP TABLE pedant;”);

db.execSQL(“CREATE TABLE pedant(a text, b text);”);

db.execSQL(“INSERT INTO pedant SELECT a, b FROM pe_backup;”);

db.execSQL(“DROP TABLE pe_backup;”);

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

}

}

onDownGrade()在数据库降级时用到

// 因为我们无法预知未来版本的表结构,向下兼容时最稳妥的方法就是将该版本自己需要的表重构一次

@Override

public void onDowngrade (SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(“DROP TABLE IF EXISTS t1;”);

db.execSQL(“DROP TABLE IF EXISTS t2;”);

db.execSQL(“DROP TABLE IF EXISTS t3;”);

db.execSQL(“DROP TABLE IF EXISTS t4;”);

….

onCreate(db); // 建表

}

36、 Android下的Https通信?

Android使用DefaultHttpClient建立HTTPS连接,关键需要加入对Https的支持

SchReg.register(new Scheme(“https”,SSLSocketFactory.getScoketFactory(),443))

http://blog.csdn.net/wzy_1988/article/details/39288831

37、 在同等网络的情况下,怎么提高传输速度?

38、 图片时怎么压缩的??

按比例压缩

按质量压缩

39、 JS回调APP和APP回调JS?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息