近期面试总结(Android)
Posted yjpjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了近期面试总结(Android)相关的知识,希望对你有一定的参考价值。
关于近期面试总结(2018年下半年)
有些是老生常谈有些是没有遇到的。
1.HTTP和HTTPS的区别
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2.LaunchMode
- standard
标准模式下,只要启动一次Activity,系统就会在当前任务栈新建一个实例。
使用场景:正常的去打开一个新的页面,这种启动模式使用最多,最普通 。
- :SingleTop 栈顶复用
1、当前栈中已有该Activity的实例并且该实例位于栈顶时,不会创建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent()方法;
2、当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例;
3、当前栈中不存在该Activity的实例时,其行为同standard启动模式。
使用场景:新闻详情页,收到推送打开新闻详情如果每次都创建新的实例显然浪费资源,如果singleTop复用,每次通过intent传入相应URI即可。 - SingTask 栈内复用
1、如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中。
2、如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例
a、如果不存在该实例,则会在该任务栈中新建Activity实例。
b、如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁。
使用场景:通过情况下我们把需要长时间保留在栈中的界面做成这种模式如APP首页,扫描二维码等。 - SingleInstance
启动该模式Activity的时候,会查找系统中是否存在: 1、不存在,首先会新建一个任务栈,其次创建该Activity实例。
2、存在,则会直接引用该实例,并且回调onNewIntent()方法。 特殊情况:该任务栈或该实例被销毁,系统会重新创建。
使用场景:相机,相册,电话拨号等
3.Service不被杀死
①onStartCommand的时候手动返回START_STICKY会在内存充足的时候重新创建serivce,不保留传入的Intent
@Override public int onStartCommand(Intent intent, int flags, int startId) { flags = START_STICKY; return super.onStartCommand(intent, flags, startId); }
②提升service优先级在androidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,越大优先级越高
③可以在service的onDestory方法中通过广播触发重启service
④监听系统某些广播拉起service比如重启手机,界面唤醒,网络切换等缺点是可能混乱
⑤双进程互相监听,主流应用搜狐,360,微信等都是。
4.Handler与weakReference解决可能导致内存泄漏
为解决handler持有activity的引用可能导致内存泄漏,我们通常将Handler定义为静态内部类,但是这样我们不能操作activity中的内容,通过使用弱引用可以解决。
static class MyHandler extends Handler { WeakReference<Activity > mActivityReference; MyHandler(Activity activity) { mActivityReference= new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { final Activity activity = mActivityReference.get(); if (activity != null) { mImageView.setImageBitmap(mBitmap); } } }
WeakReference弱引用,与强引用(即我们常说的引用)相对,它的特点是,GC在回收时会忽略掉弱引用,即就算有弱引用指向某对象,但只要该对象没有被强引用指向(实际上多数时候还要求没有软引用,但此处软引用的概念可以忽略),该对象就会在被GC检查到时回收掉。对于上面的代码,用户在关闭Activity之后,就算后台线程还没结束,但由于仅有一条来自Handler的弱引用指向Activity,所以GC仍然会在检查的时候把Activity回收掉。这样,内存泄露的问题就不会出现了。
以上是关于近期面试总结(Android)的主要内容,如果未能解决你的问题,请参考以下文章
997页手淘Android面试真题解析火爆全网,近期有面试的必看