1、横竖屏切换时Activity的生命周期?
不设置android:configChanges="keyboardHidden|screenSize|orientation"
,切换屏幕方向会依次执行onPause 、onSaveInstanceState 、onStop 、onDestory 、onCreate 、onStart 、onRestoreInstanceState 、onResume 等方法;
设置后切换屏幕只会执行onConfigurationChanged方法。
2、什么是ANR 如何避免它?
定义:在Android上,如果应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。
避免:1)将潜在的耗时操作放到子线程中去完成,或者通过异步任务的方式完成,主线程为子线程提供一个Handler,以便子线程完成任务后能及时通知主线程更新UI;2)通过ProgressBar、ProgressDialog、SplashScreen来提升用户体验。
3、Android Handler工作机制
1)在Android中,一个线程对应一个Looper对象,而一个Looper对象又对应一个MessageQueue(消息队列),MesageQueue中存放的消息按先进先出的原则执行。
2)Looper.prepare()方法会在当前线程创建一个Looper对象,Looper.loop()方法启动Looper,循环从消息队列中获取消息交给相应的Handler处理。
3)Handler将Message或Runnable发送到MessageQueue中,当MessageQueue循环到该Message时,调用相应的Handler对象的handleMessage()方法处理。
4)我们也可以在子线程中创建Handler,然后使用这个Handler的实例在任何其他线程中发送消息,但是最终处理消息的代码还是在创建Handler的子线程执行。
5)产生一个Message对象可以通过new一个Message的实例,也可以使用Message.obtain()获取,但是建议使用obtain()方法,因为Message内部维护了Message池用于Message的复用,避免使用new造成重新分配内存。
4、Android Service的启动方式及区别
1)Context.startService()或Context.bindService()这两个方法都可以启动Service。
2)使用startService()方法启动服务,调用者与服务之间没有关联,即使调用者退出了,服务仍然在后台运行。
3)使用bindService()方法启动服务,调用者与服务绑定在一起,调用者一旦退出,服务也就终止了。
4)通过startService()方法启动服务,在服务未被创建时,系统会调用onCreate()方法,接着调用onStartCommand ()方法,如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStartCommand ()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。不管调用多少次startService() ,只需要调用一次 stopService() 就可以停止service。
5)采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定,也就是说onCreate()和onBind()方法并不会被多次调用。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。
5、Listview加载不同布局、ListView优化
1.1)重写 getViewTypeCount() – 该方法返回Item有多少个不同的布局
1.2)重写 getItemViewType(int) – 根据position返回指定Item的布局类型
1.3)在getView()方法中针对不同的布局类型为Item设置布局。
2.1)重用convertView,不用每次都inflate;
2.2)静态内部类ViewHolder,不用每次都findViewById;
2.3)万能ViewHolder,万能Adapter。
6、Android中动画的类型和各自的特点;
1)Android中的动画分为Tween(补间动画)和Frame(逐帧动画);
2)Tween通过使视图组件旋转、缩放、移动、透明来实现;
3)Frame通过顺序播放排列好的图片来实现。
7、谈谈Android的五种存储数据的方式
1) SharedPreferance:它是Android提供的用来存储简单配置信息的机制,采用xml格式将数据存储在设备中,只能在同一个包内使用;
2) 文件存储数据:文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件;
3) Sqlite数据库:SQLite是Android自带的一个标准数据库,支持SQL语句,是一个轻量级的嵌入式数据库;
4) ContentProvider:主要用于应用程序之间进行数据交换,从而能够让其他应用程序存入或读取此ContentProvider中各种类型的数据;
5) 网络存储数据:通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
8、注册广播接收器的两种方式及优缺点;
1) 静态注册:在配置文件中注册,当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行;
2) 动态注册:在Java代码中注册,动态注册的优先级高于静态注册,但是广播跟随程序的生命周期,也就说注册广播接收器的Activity关闭后,广播也失效了。
9、内存溢出和内存泄漏的区别?何时会产生内存泄漏?
1) 内存溢出:应用程序运行所需要的内存超出了可用的最大内存;
2) 内存泄漏:对某一内存空间使用完后没有释放;
3) 产生内存泄漏的情况:资源对象(Cursor、流)没关闭造成的内存泄露;注册(广播接收器)没取消造成的内存泄露;Bitmap没调用recycle();构造Adapter时,没有使用缓存的 convertView;Context泄漏(比如我们使用一个static的Drawable给View设置背景,设置完后,Drawable拥有View的引用,View拥有Activity的引用,这就导致Activity销毁后内存不会释放) 。
10、谈谈对Android NDK的理解
NDK全称:Native Development Kit。
1、 NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so文件和java应用一起打包成apk。
2、 NDK集成了交叉编译器,并提供了相应的mk文件来隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件,就可以创建出相应so文件。
11、AIDL的全称是什么?如何工作?
AIDL(Android Interface Define Language)是一种接口定义语言。Android系统中,各应用程序都运行在自己的进程中,进程间一般无法直接进行数据交换。为了实现这种跨进程通信(IPC:Inter Process Communication),Android提供了AIDL Service。
1) 创建AIDL文件(定义进程间通信接口,定义了可供客户端访问的属性好方法);
2) ADT工具会根据AIDL文件自动编译生成Java接口,这个Java接口中包含一个名为Stub的内部类,它实现了IBinder接口。
3) 客户端通过bindService获取远程Service的IBinder对象的代理之后,就可以通过该代理去回调远程Service的属性和方法。
12、Android系统架构;
Android系统架构分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。