1、Activity的四种状态:
Running/Paused/Stopped/Killed
2、Activity的生命周期:
由启动到关闭:onCreate()-onStart()-onResume()-Running-onPause()-onStop()-onDestroy()-ShutDown
当处于暂停状态后恢复:onPause()-onResume()
进程被杀:从头再来
当处于停止状态后恢复:onRestart()-onStart()-onResume()
回桌面:onPause()-onStop();
3、Activity的启动模式:
standard:不会复用Activity栈中的已有Activity,只会再多启动新Activity。
singletop:即栈顶复用模式,当要启动的Activity,已有,并存在于Activity栈顶,则不会启动新Activity,会复用已有Activity。但如果不在栈顶,则仍会启动新Activity。
singletask:即栈内复用模式,栈内若存在要启动的Activity,则将该Activity提到栈顶,该Activity之上的所有Activity全部销毁,同样,不会多启动新Activity。
singleinstance:要启动的Activity在栈内有且只有一个,并独占Activity栈。
4、Fragment的加载方式:
静态加载:将Fragment写入Activity的XML布局文件中。
动态加载:动态在Activity中添加Fragment。
通过FragmentManager实例化FragmentTransaction对象,再通过FragmentTransaction对象加载Fragment。
5、FragmentPagerAdapter与FragmentStatePagerAdapter的区别:
FragmentPagerAdapter多用于页面较少的情况,FragmentStatePagerAdapter多用于页面较多的情况。
在切换页面时:
FragmentStatePagerAdapter用remove方法移除Fragment直接释放了资源。
FragmentPagerAdapter用的是detach方法,只使Fragment脱离并没有释放资源。
所以页面多时,用FragmentStatePagerAdapter更省资源。
6、Fragment的生命周期:
onAttach()-onCreate()-onCreateView()-onViewCreated()-[Activity:onCreate()]-onActivityCreated()-[Activity:onStart()]-onStart()-[Activity:onResume()]-onResume()-onPause()-[Activity:onPause()]-onStop()-[Activity:onStop()]-onDestoryView()-onDestory()-onDetach()-[Activity:onDestory()]
onCreate方法:初次创建Fragment时调用
onCreateView方法:在Fragment首次绘制界面时调用。
onViewCreated方法:Fragment界面完全绘制好后被调用,在这里可以进行初始化控件等操作。
onActivityCreated方法:Activity的onCreate方法完全结束后被调用,此时Activity已被渲染绘制成功。
onStart方法:在Activity的onStart方法结束后被调用。此时Fragment启动,但仍无法使用。
onResume方法:在Activity的onResume方法结束后被调用,此时的Fragment已准备就绪,获取焦点。
onPause方法:当进行回退等操作时,onPause方法被调用,Fragment失去焦点,无法交互。
onStop方法:当Activity的onPause方法结束后被调用。
onDestoryView方法:当Activity的onStop方法结束后被调用,Fragment即将结束。
onDestory方法:当onDestoryView方法结束后被调用,此时Fragment并未被销毁。
onDetach方法:当onDestory方法结束后被调用,Fragment被销毁。
7、Fragment交互:
(1)在Fragment中调用Activity的方法:
在Fragment中可以通过getActivity方法获取Activity对象,通过Activity对象可以调用Activity中的方法。
(2)在Activity中调用Fragment中的方法或获取Fragment中的数据:
在Fragment中定义接口,并由Activity去实现。
(3)Fragment中调用其他Fragment中的方法:
可以通过getActivity方法获取Activity对象,通过该Activity对象的findViewById方法获得相应的Fragment。
8、和Fragment有关的replace方法与add方法切换的区别:
replace方法是FragmentManager的方法,add方法是将Fragment添加到Activity中,而replace方法是将Activity中的Fragment替换为要加入的Fragment。
9、Service是什么?
Service是一个可以在后台长时间运行的,非可视化的程序组件。
10、有Service为什么还要用Thread?
Service与Thread无关,Service也在主线程中执行,所以Service仍然不能直接做耗时操作,如要在Service中执行耗时操作,则仍要借助子线程来执行,因此Service和Thread不能互相替代。
11、Service的两种启动方式的特点:
start方式:Service与启动源无联系,无法得到Service对象,要停止则需要调用stopService或者stopSelf等方法来停止。
bind方式:可以与绑定者交互,通过Binder接口的方式,也能获取到Service对象。当与所有绑定者的联系解除后,该Service自行停止。
12、广播是什么?
广播是一种广泛运用的传输信息的机制,我们发送的广播内容是一个Intent对象,这个Intent对象可以携带一定信息。
13、广播使用场景:
同一程序的多个进程之间的消息通信。
不同程序间的消息通信。
14、广播的种类:
普通广播:所有监听该广播的BroadcastReceiver都能收到该广播。
有序广播:按照BroadcastReceiver的优先级顺序接收广播,可以终止广播的继续传播,也可以对广播进行处理。
本地广播:只在自身程序内传播。
15、BroadcastReceiver的两种模式:
静态:将BroadcastReceiver记录进XML记录文件中,特点是可以一直接收广播,无依赖。
动态:在Activity相关代码里开启,将跟随Activity生命周期,当Activity彻底结束,该BroadCastReceiver也将结束。
16、Android程序的BroadcastReceiver的实现机制:
(1)自定义BroadcastReceiver,并重写onRecvice()方法;
(2)BroadcastReceiver通过Binder机制向AMS进行记录。
(3)广播发送方通过Binder机制向AMS发送广播;
(4)AMS查找符合相应条件(如IntentFilter等)的BroadcastReceiver,将广播发送到BroadcastReceiver相应的消息队列中;
(5)拿到广播,调用BroadcastReceiver中的onReceive()方法。
17、LocalBroadcastManager的作用:
(1)使用它来发送广播将只在自身程序内传播,不会造成隐私泄露。
(2)其他程序无法对它自身以外的程序发送该广播,不会有安全隐患。
(3)因为它的sendBroadcast方法是使用handler机制发送Message实现的,所以比全局广播使用Binder机制更高效,又因为是使用handler机制实现,所以广播无法发送到程序外,也就保证了该广播只在程序内传播。
18、什么是AsyncTask?
AsyncTask是一个封装了线程池和Handler的异步框架,用它可以实现异步操作和用接口反馈异步执行的进度,比Thread+Handler的方式更便捷。
19、AsyncTask的实现机制:
(1)AsyncTask的本质是一个静态的线程池(注:线程池是一种多线程处理形式),AsyncTask的子类可以实现不同的异步任务,这些异步任务都是交给静态的线程池执行。
(2)线程池中的工作线程执行doInBackground(mParams)方法执行异步任务。
(3)当任务状态改变后,工作线程会向主线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关方法。
20、什么是HandlerThread?它有什么特点?
HandlerThread本质是一个线程类,他继承自Thread。
在应用场景中,子线程默认是没有Looper对象的,而HandlerThread有自己的内部Looper对象,可以进行looper循环。
通过获取HandlerThread的looper对象传递给Handler对象,就可以在Handler对象的handleMessage方法中执行异步任务。
特点是不会阻塞主线程,减少了对性能的消耗。但是不能同时进行多任务的处理,需要等待进行处理。处理效率低。
HandlerThread只有一个线程。
21、ListView的RecycleBin机制:
ListView采用Adapter方式加载数据,每当ListView要加载Item,都要调用Adapter的getView方法,为了避免OOM,ListView采用RecycleBin机制。
ListView继承的是AbsListView类,而RecycleBin类就是AbsListView的内部类。
当有Item从ListView中滑出屏幕就会被放置到RecycleBin机制里,然后当有Item即将滑进屏幕,它会复用之前的item
22、什么是ANR?
ANR为Application Not Responding缩写。
例如有时程序中的控件点击不灵敏,系统会提示一个对话框,这个对话框的内容就是提示ANR。
Activity中,任务执行时间最长为5秒钟,超过5秒不响应就会提示ANR。
在BroadcastReceiver中,最长时间为10秒,超出10秒不响应就会提示ANR。
ANR总的来说就是程序无响应,常见原因是在主线程中做了耗时操作。
23、ANR的产生原理:
程序的响应性是由AMS和WindowManagerService监视的,当它们发现程序超时无响应,系统就会弹出ANR提示。
原因例如,主线程进行网络操作、主线程存在耗时计算。
24、主线程会执行哪些常见操作?
Activity的所有生命周期方法都是主线程执行。
Service默认在主线程执行,所以它不能直接进行耗时操作,必要情况下开启子线程来做。
BroadcastReceiver的onReceive方法是在主线程执行的。
没有使用子线程的Looper的Handler的handleMessage方法和post方法是在主线程执行的。
AsyncTask除doInBackground方法外,其他方法都在主线程执行。
25、如何解决ANR?
避免方针:将耗时操作放在子线程里来做,需要主线程的场合,通过Handler机制来通知。
具体解决方案:使用AsyncTask处理耗时操作。使用Thread开启子线程,使用HandlerThread,并提高优先级。
26、什么是OOM?
OOM是Out of memory的缩写,也叫内存溢出。指的是当前占用的内存加上申请的内存超过了虚拟机的最大内存限制,就会抛出OOM异常。
常见于图片加载。
27、Android中常见的内存泄漏有哪些?
(1)单例模式:如果某个类要被销毁,而单例类还持有那个类的实例,那么因为单例模式的静态特性,占用的资源无法被回收,也就造成了内存泄漏。
(2)内部类:非静态内部类默认会持有外部类对象,而这个非静态内部类中,如果有静态成员,那么这个外部类对象就会被这些静态成员占用,导致内存无法回收。
(3)Handler:以非静态内部类的方式定义Handler时,Handler将会持有外部类对象,而消息队列中的Message对象又持有该Handler对象,例如当Activity要销毁时,消息队列中还在处理Message,这就会导致Message对象的内存不会被回收,进而导致Handler对象不会被回收,进而导致Activity占用的内存也无法被回收,造成内存泄漏。
(4)关闭:一些类中提供了close方法供调用,如果在这些对象使用完毕后调用close方法,可能会导致内存泄漏。
(5)AsyncTask:和Handler的情况类似。
28、View和ViewGroup有什么关系?它们的区别是什么?
ViewGroup是View的子类,它继承自View,可以形容为一个容器,它可以用来装其他的View或其他的ViewGroup,而ViewGroup又是布局(如,FrameLayout,LinearLayout等)的父类。
View类是所有Android控件(包括ViewGroup)的父类,是构成Android UI的基本块,负责事件的处理和控件绘制。
29、Android有几种动画类型?它们有什么区别?
有三种,分别是:
Tween(补间动画),包括平移,旋转,透明,缩放。
Frame(帧动画),通过顺序播放排列好的图片来实现。
但前两种方式不能对非View对象进行动画操作,且没有实质对View对象作出改变,仅提供了视觉效果,动
画效果单一。
所以Property Animation(属性动画)于Android 3.0后推出,不局限于平移、旋转、透明缩放,且不局
限于View对象,并能实质对对象作出改变。
它的实现原理是通过不断控制值的变化,再不断的赋值给对象的属性,从而实现了动画效果。
1、Java的九种基本数据类型以及他们的封装类都是什么?
基本类型:byte,short,int,long,float,double,boolean,char,void。
他们的封装类:Byte,Short,Integer,Long,Float,Double,Boolean,Character,Void。
2、switch语句能否用String对象做参数?
在Java1.7版本之前不可以,Java1.7版本后对switch语句加入了String支持。
3、equals方法与==有什么区别?
==:如果==用于比较基本数据类型,那么则会直接比较其值是否相等。如果用来比较其他如String对象,则比较的是该对象的内存地址。
equals方法:equals方法是Object类的公有方法,如果Object类的子类没有对该方法进行重写,那么比较的是对象的内存地址。
如果像String等类,对equals方法进行了重写,则比较的是对象内的相关值。
4、Vector,ArrayList,LinkedList有什么区别?
Vector和ArrayList都是通过数组实现的,LinkedList是通过双向循环链表实现的。
ArrayList在扩充时会扩充当前大小的50%,Vector则会扩充当前大小的100%,ArrayList会更省资源。
LinkedList查找操作慢,增加和删除操作快。
ArrayList和Vector查找操作快,增加和删除操作慢。
Vector线程同步,ArrayList和LinkedList不是。
5、Java内存的分配策略:
(1)静态存储区:放置静态数据,在编译时确定,在此放置的内存数据,在程序运行期间都存在。
(2)栈区:方法内的局部量,在栈中获取内存空间,在方法执行结束后自行释放。
(3)堆区:也就是动态内存分配,大多是new出来的对象所占用的内存,这部分内存在不使用的时候,将会由Java的gc回收。
6、什么是内存泄漏?
Java中内存泄漏指的是不再使用的对象所占用的内存未被释放,导致内存的浪费称为内存泄漏。
内存泄漏的不断积累,就会最终导致Out of Memory,也就是内存溢出。
7、什么是HTTP协议?
HTTP就是超文本传输协议,是通信协议的一种。它可以使客户端和服务端借由HTML传输数据
8、HTTP相关的GET和POST的主要区别是什么?
GET主要用于获取资源,POST主要用于提交资源。
GET请求将数据以“量名=具体值”的形式,添加到URL后面作为参数,并且将两者用“?”连接,各个参数之间用“&”连接,用于告知服务器所需要何种数据。
POST则是将数据放置到HTML header内一起传送到指定的URL地址。
GET请求对数据大小有限制,而POST没有。
服务器端取值方法不同,GET方式使用Request.QueryString方法,POST方式使用Request.From方法取值。
因为GET方式提交数据时,是通过添加到URL明文提交的,所以会有其安全问题。
而POST的所有操作对用户都不可见。
9、什么是Cookie?
Cookie是服务器端发给客户端的特殊数据,这些数据以文本的方式存放在客户端,每次客户端向服务器端发送请求的时候,可以带上这些数据。
由服务器端返回的Cookie,存放在响应头(Response Header)中,然后客户端接到Cookie后,再向服务器端发送请求时,可以带上Cookie,这时,Cookie存放在请求头(Request Header)。
10、什么是Session?
Session是不同于Cookie的另一种记录客户状态的机制,它不像Cookie保存在客户端,Session保存在服务器。
客户端访问服务器时,服务器把客户端信息以某种形式记录在服务器上,这就是Session。
当客户端再次访问服务器时,服务器只需要查找Session中记录的状态就可以。
工作步骤如下:
(1)创建Session。
(2)创建Session时,服务器会为该Session生成唯一的Session ID,该ID会被发给客户端。
(3)Session被创建后,就可以调用Session的相关方法往Session中增加内容。
(4)当客户端再次发送请求,它会将服务器端发给客户端的Session ID带上,服务器接到请求后,会依据Session ID找到相应的Session。
总结他们的区别:
(1)存放位置不同,Cookie客户端,Session服务端。
(2)存取方式不同,Cookie保存的是ASCII字符,Session可以存取任何类型。
(3)安全性不同,因为Cookie保存在客户端,可能会被本机修改,Session则是保存在服务端,不存在信息泄漏,客户端有的只是一个Session ID,所以安全性方面Session较Cookie强。
(4)有效期不同,Cookie的有效期可以更长。
(5)服务器负担不同,因为Session在服务端,所以在Session数量多的时候,就会对服务器造成负担,而Cookie本身在客户端,所以不占服务器资源。
11、什么是HTTPS?它有什么弊端?
HTTPS并不是一个单独的协议,它实质上就是在HTTP协议的基础上追加了SSL/TLS加密层。
通过在TCP层和HTTP层之间加入加密层,使用非对称或对称方式加密、证书等技术,以此来保证传输的安全。
弊端:
因为HTTPS要额外处理SSL/TLS通信,所以相应的通信速度会较HTTP慢。
因为SSL层必须进行加密处理,也就是说,客户端和服务端都要进行加密和解密处理,所以会较HTTP更消耗资源。
12、什么是SSL/TLS协议?
SSL协议是一种安全传输协议,TLS则是对SSL的应用,具体来说TLS是SSL V3.0的升级版。
SSL层采用对称加密与非对称加密的方式加密数据。
13、什么是非对称加密?
非对称加密又称为公钥加密,是指加密和解密用不同的秘钥,使用公开的公钥进行加密,私有的私钥进行解密。
(1)如A发送,B接收,首先由B生成一对公私钥。
(2)A拿到B的公钥,A用B的公钥加密信息发送给B。
(3)B用自己的私钥进行解密,拿到信息。
反之,使用私钥加密,公钥解密也可。
但要注意的是,给定的公钥只有与其匹配的私钥可以解密,反之,给定的私钥也只有与其匹配的公钥才可以解密。