一、ANR提示的问题是什么?简述原因
ANR:Android Not Response,在当前时间没有得到处理或当前时间正在处理但超时的情况下产生的无响应提示。
(1)、KeyDispatchTimeout:按键或触摸事件在一定时间内无响应,一般为5s;
(2)、BroadcastTimeout:BroadcastReceiver在一定时间内无法完成处理,一般为10s;
(3)、ServiceTimeout:Service在一定时间内无法完成处理,一般为20s。
为了避免这样的情况发生,需要遵循一定的设计规则,比如:UI线程只负责UI相关的操作,尽量不要进行数据的处理;耗时的数据处理操作启用新的线程处理,而UI线程以外的线程和UI线程的数据交互使用Handler机制进行。
二、Application与Activity在作为Context时的区别
(1)、Aplication context:Application作为Context时是一个全局的静态变量,生命周期为整个应用程序,不会导致内存泄漏;一般在不破坏软件设计规则的情况下使用,这样便于代码测试和项目维护。
(2)、Activity context:生命周期随着Activity的存在而存在,消亡而消亡,使用不当会导致内存泄漏,特别在跨Activity的使用;一般和UI相关的context最好使用Activity作为context来处理,这样可以尽量减少内存泄漏的发生。
三、Handler作用及运行机制
(1)、作用:Handler主要由于线程间通信,一般在我们需要开启子线程处理一些耗时操作(网络访问、数据处理等)。
(2)、机制:首先,Handler内部包含一个消息队列MessageQueue,消息的输入输出都靠它来管理;其次,使用Looper.Loop方法不断从MessageQueue中获取消息进行处理,没消息时阻塞;然后,调用HandMessage方法,执行数据结果操作。
四、Touchevent传递机制
在Touchevent传递的过程中,涉及三个重写函数:
public boolean dispatchTouchEvent(MotionEvent ev);//分派event
public boolean onInterceptTouchEvent(MotionEvent ev);//拦截event
public boolean onTouchEvent(MotionEvent ev);//处理event
1、事件传递流程是由dipatchTouchEvent()控制,默认从上至下依次传递(返回false,不拦截),直到最底层的View;
2、在底层onTouchEvent()处理成功则返回true,若处理失败返回false;
3、在onTouchEvent每一层返回成功的情况下,终止传递,处理失败则会继续向上传递。
4、若在dipatchTouchEvent()过程中被使用onInterceptTouchEvent()拦截了事件的传递,则被拦截以下的事件处理终止。
五、简述Activity LaunchMode的几个模式
1、standard mode
Activity默认启动模式,可以在<activity>配置中设置android:launchMode属性,也可以不设置;这种模式没有Activity的复用功能,在需要的时候都会在task中重新创建,处理不当比较耗费资源。
2、top mode
复用task栈顶Activity,也就是说在task栈顶有Activity的情况下,不需要重新创建相同类型的Activity;而在栈顶没有相同Activity的情况下,需要重新创建。
3、singleTask mode
复用task整个栈Activity,在整个task栈中不会出现两个相同类型的Activity,在当前task栈已有Activity的情况下,不创建新的相同类型的Activity,否则重新创建。
4、singleInstance mode
重新创建新的task栈,该任务栈中只存在这一个Activity,并且不同的App共用被设置为singleInstance模式的Activity,一般情况下很少会用到。
另外,还有一种方式来启动Activity的启动模式:Intent Flag,通过设置Intent的Flag可以达到以上效果。
六、ADIL
AIDL:Android Interface Definition Language(Android接口定义语言)。
目的:实现进程间通信,特别是在多进程多并发情况下。
1、服务端:服务端首先要创建一个远程Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可。
2、客户端:首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转化成AIDL接口所属的类型,接着调用AIDL方法。
七、IPC的几种方式
1、Bundle:在Bundle中附加数据并通过Intent传输
2、文件共享:两个进程读写一个文件来交换数据
3、AIDL:Android Interface Definition Language
4、Message:基于消息的进程间通信
5、ContentProvider:用于不同应用间数据共享
6、Socket:进程间会用TCP和UDP协议进行网络通信
八、xml布局文件中tools属性的作用
tools可以告诉编译器,被标记的属性在设计布局显示的时候是有效的,而在应用程序运行的时候就会被忽略,不会被打包带进apk中。
九、Manifest作用
Manifest是操作系统用来与应用交互的元数据。
十、介绍Service的两种启动方式
1、Context.startService():调用者与服务之间没有关联,即使调用者推出,服务仍可运行
2、Context.bindService():调用者与服务绑定在一起,调用者一旦退出,服务也就终止
十一、介绍Fagment的动态添加
使用FragmentManager对Fragment进行动态加载
十二、MQTT是什么?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)十IBM开发的一个即时通讯协议,是物联网通信的主要部分
十三、描述socket、UDP、TCP
socket:是TCP/IP网络的API,定义啦一些列的网络通信接口
UDP:用户数据报协议,是传输层的一种无连接协议
TCP:传输控制协议,是传输层的一种面向连接的协议
十四、Activity什么情况下销毁
0、资源相关配置发生变化,导致Activity销毁后重建,例如:横竖屏切换
1、正常销毁,在按下Back键或者activity调用finish()方法
2、资源内存不足,会导致低优先级Activity销毁
十五、描述Activity与Fragment生命周期
1、Activity生命周期:
2、Fragment生命周期
3、Activity与Fragment生命周期对比
十六、Handler、Looper、MessageQueue、Message作用及关联
1、Handler:用于发送和处理消息队列消息,在主线程和子线程间传递消息
2、Looper:形成一个循环体,不断的从消息队列读取数据,然后传递到HandleMessage进行处理
3、MessageQueue:消息队列,存储Handler发送的消息
4、Message:线程之间传递的消息
Tips:Thread-->SendMessage-->Looper(MessageQueue(Message)-->HandleMessage)