Android 面试基础二

Service

Service是Android四大组件之一是运行在主线程的,最好不要在Service中做一些耗时操作,会导致ANR

1.Service和子线程的区别和场景

Thread :程序执行的最小单元,它是Cpu的基本单位,  
Android中主线程不能做耗时操作尽量把耗时操作放在子线程中

Thread的生命周期
Thread是无法控制的,是独立于Activity中,当Activity结束时是线程并没有结束,无法控制Thread

1.新建 创建线程
2.就绪 线程已经启动等待Cpu分配资源
3.运行 run方法线程已经获得资源正在运行
4.死亡 当线程执行完毕,或者被其他线程杀死时
5.阻塞  由于某种原因导致线程让出cpu资源

场景:需要连续不停地每间隔一段时间就要连接服务器一次做同步操作
此时就不适用与Thread 因为当Activity结束时Thread并没有结束,会无法监听Thread的状态此时Thread就会变成一个野线程,当我们遇到这个场景时我们就需要使用Service ,因为Service是运行在主线程中的所以我们还要在Service中new 一个新的Thread来进行操作,Service是运行在后台的没有界面,Service是安卓的一种机制,是运行在同一个进程的

2.Service的生命周期

startService声明周期

1.onCreate 创建一个服务
2.onStartComand 运行
3.onDestroy 销毁  

如果一个Service被startService启动多次的话会onCreate方法只会执行一次而onStartCommand方法会执行多次
stopService 会调用onDestroy 方法如果是绑定Service必须要解绑Service
bindService 生命周期

1.onCrate
2.onBind
3.onUnBind
4.onDestroy

3.Service和IntentService的区别?

Service :运行在后台服务,是运行在主线程中的,不是独立的线程,和进程,Google官方不建议我们在Service中编写逻辑和操作,否则会引起ANR

IntentService : 是继承并处理异步请求的类,内部有一个工作线程HandlerThread来处理耗时操作,启动和Service是一样的,不一样的是IntentService会自动被销毁不需要调用多次,而且IntentService可以被启动多次,每次启动都会以队列方式进行排队处理,每次只会执行一个工作线程
IntentService内部是通过消息的方式发送给HandelThread 由HandlerThread来执行异步操作 然后由Handler 中的Looper来处理消息

4.Service启动服务和绑定服务先后次序问题

绑定服务通过调用bindService方法来实现的 此时Serivice要实现OnBind方法,使用ServiceConnection来进行连接,同过bindService来进行启动,因为Service在Android中是只有一个实例的,所以有可能出现一个Service进行两种都存在这时候就会表现出两种问题?

1.先绑定服务后启动服务 
2.先启动服务后绑定服务

如果是第一种状态先绑定服务然后再启动服务,这个时候Service 会由绑定状态转为启动状态,如果之前的服务进行销毁,这个时候也不会出现问题,只有调用停止服务时才会销毁服务
第二种状态运行时,如果启动在进行绑定,启动服务会转为绑定服务进行运行,如果解除绑定不会对service进行任何影响只有在调用stopService时服务才会进行停止
启动服务是依托于Activity的而绑定服务是依托于内存的 所以

1.我们得出启动服务比绑定服务高
2.服务在其托管进程的主线程运行的(UI线程)

5.序列化Parcelable 和Serializable的区别

什么是序列化 :一般对象都是存储于内存当中的,当我们把内存中的写入磁盘这个过程我们就叫他序列化,
反序列化就是序列化的反向

在序列化中必须实现Serializable 和Parceable 这两个的区别
Serializable:实现一个空接口由编译期生成一个uid,序列化时会检测这个版本,如果不同就更新,这种方式实现比较简单,内存占用比较大
Parceable :所占用的内存比较小,代码量比较多,底层使用流方式来进行一个磁盘的读写性能要比Serialiable 比较小
如果用来传递比较推荐使用Parceable 如果用来对象的存储比较推荐Serialiable 来进行存储,因为Serialiable 操作比较简单

广播

接收到广播后会自动回调onReceive 方法

静态注册
放入AndroidMainfest xml 中进行注册,静态的不受影响即使app停止使用了 广播还在运行,例如 推送
动态注册
在Activity onResume 来进行注册,onPause方法里面进行销毁 在onPause 里面注册是因为  
onPause 一定会执行,为了防止内存泄漏

Webview的漏洞

1.常见的webview 坑

webView.addJavaScriptInterface 添加接口会暴露通过反射可以得到接口

2.Webview写在其他容器中会造成内存泄漏

例如写在linerLayout 方法中在销毁时一定要先销毁webview然后在removeAllViews

3.Webview 硬件加速导致页面渲染问题解决办法关闭硬件加速

4.onPageFinnished 方法会多次进行调用,使用webviewChromeClient.onPageChanged

5.后台耗电增加,解决办法就是在关闭页面时销毁webview

6.webview 的内存泄漏

因为webview是独立线程所以当Activity中销毁时,webview一直因为会造成泄漏  

解决办法

1.使webview独立进程简单暴力,会涉及到进程间的通信,使用完毕后直接关闭这个进程
2.动态添加webview对传入的webview使用弱引用,只在布局中创建容器,等activity进行创建时add  
进来webveiw ,关闭页面时先remove webview,然后在removeAllviews

你可能感兴趣的:(Android 面试基础二)