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?

更多相关文章

  1. No.11 使用firewall配置的防火墙策略的生效模式
  2. 浅谈Android下的Wifi&&安卓WIFI 移植
  3. 打造Android(安卓)MVP模式 retrofit+rxjava(二)
  4. Android安卓 PopupWindow工具类
  5. Android(安卓)OpenGL ES(九):绘制线段Line Segment
  6. Activity四种启动模式
  7. android EditText设置密码明文/密文显示(亲测可用,欢迎留言)
  8. GestureDetector部分源码分析
  9. Android中ConvenientBanner的使用

随机推荐

  1. Android Studio真机调试,数据库sqllite时,M
  2. Android第十五课 Jni自带的iconv库不支持
  3. Android常用高质量框架
  4. android使用WebView显示sdcard的html文件
  5. android 设置背景图片
  6. Android 音频系统:从 AudioTrack 到 Audio
  7. Android菜单操作之创建并响应菜单
  8. Android 中自定义控件和属性(attr.xml,de
  9. 亲测Android横竖屏切换小结,带测试结果
  10. android Studio修改生成apk文件的名称