Android 面试题总结

Activity:

1.生命周期是怎样的?

onCreate- onStart-onResume-onPause-onStop-onRestart-onDestory
后台被回收回调函数:
onSaveInstanceState(Bundle onState){
} 当再次创建这个Activity时 会在onCreate方法中将Bundle取出。
对某些资源及操作状态进行保存最好放在onpause生命周期中 ,自动恢复。

2.Acitivity跳转回传参数方法?

  1. resultcode
  2. requestcode

3.Activity如何退出?

1.finish();
2.抛出异常强制退出当前Activity
3.System.exit(0); 退出所有的Activiy
4.Android中可以使用System.out.println(“”);在控制台中显示你想要显示的字符吗?
不能 只会在Logcat中


Service:

1.绑定生命周期是怎样的?

onCreate()—->onBind()—->onUnBind() –>onDestory()
通过startService()启动服务:
 onCreate()—->onStart()—->onDestory()
当采用startService()方法启动服务,访问者与服务之间是没有绑定在一起的,访问者退出,服务还在运行
采用bindService()方法启动服务时,访问者与服务是绑定在一起的,解绑才退出,如果Activity直接退出并不会,将服务销毁。


BroadCast

1.注册方式优缺点使用场景?

静态和动态

  1. 动态广播伴随程序的生命周期
  2. 静态广播伴随系统的生命周期

2.徒手写广播


    BroacastReceiver
    onReceive()
    IntentFilter filter=new Intentfilter("")
    BroadcastReceiver receiver=new Receiver();
    registerReciver(1,2)

    <receiver androidname="" >
    <Intenfilter>
            <action android:name="">
    <Interfilter>

内存泄漏如何处理?

1.什么是内存溢出,什么是内存泄漏,

一个不会被使用的对象,因为另一个正在使用的对象持有该对象的引用,导致它不能正常被回收,而停留在堆内存中,内存泄漏就产生了
Android系统为每个应用分配的内存是有限的,内存泄漏会使我们的应用内存随着时间不断的增加,造成应用OOM(Out Of Memory)错误,使应用崩溃.

2.如何检测并·进行处理的?

1首先用android studio 的图形监测工具,进行页面监测。首先进入一个界面,退出后界面内存没释放那么可能产生了内存泄漏。通过工具可分析出内存泄漏的位置 是数组还是图片。
然后分析:通常是如下原因

  1. Activity 对象被单例模式所持有,注册没解注所以伴随整个Applaction 销毁
  2. 集合中对象没处理干净,我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,
    并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
    所以要在退出程序之前,将集合里的东西clear,然后置为null,再退出程序。
  3. 流文件未关闭,cursor游标集合没关闭
  4. 手动设置null,解除引用关系
    5.BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
  5. 使用弱引用或者软引用,与gc有关! 例如 非静态匿名内部类 经常持有外部类的引用,例如handler 会持有Activity的引用导致Activity 无法回收,这时,通过软引用 将handler设置为静态 并将Activity 作为弱引用 。使其在下次一GC中进行回收。
  6. 静态变量导致内存泄漏,例如static context 持有Activity引用

3.OOM可能产生的原因?

Listview 没有优化处理 没用convertview
大图片没经过缩放处理 ,即时释放
使用9.png 不用整张图片


软引用,弱引用,强引用之间的关系?

强引用:

只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
//可直接通过obj取得对应的对象 如obj.equels(new Object());
而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。

软引用:

SoftReference sf = new SoftReference(obj);
obj = null;
非必须引用,内存溢出之前进行回收,可以通过以下代码实现
Object obj = new Object();
sf.get();//有时候会返回null
这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

弱引用:

第二次垃圾回收时回收,可以通过如下代码实现
Object obj = new Object();
WeakReference wf = new WeakReference(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。


Android中数据存储有那几种方式?

  • sqltite3
  • shareprefrence
  • 本地存储
  • 网络存储
  • 使用ContentProvider存储数据

SQlite为数据库的存储方式

1.oncreate()
2.onUpgroude()
Sqlite数据库文件可以保存在SD卡中

SharedPreference 保存路径为/data/data//shard_prefs/……xml 文件 (保存的方式是Key-value)


ANR异常:

Main 5s
BroadCastReceiver 10s
Service 20s


设计模式

MVC:

C控制器:Activity 实现了这个职责
V: xml文件
M: ListView 中的Adapter


四种启动方式!

Standard 标准 的栈方式 对于使用频度适中 构造成本 开销一般的
Singletop 启动目标恰好在栈顶就不会创建了 eg:接收消息后续不希望弹出
SingleTask 最多只有一个activty实例! 存在栈中。没有重复的 如果有重复的之前所有都移除, 并在栈顶重新创建。
SingleInstance 创建新的activty 新开一个Task
StartActivityForsult()具体过程,传递数据方式 启动方式!
版本号,对应是那个Activity 开启它的。
内存泄漏 gc机制,Oom出现的情况和解决?


Android源码阅读情况

1.Handler机制?

Handler 是一种线程间通信的机制

创建handler 时在线程中会有一个LOACALthread 关联一个LOOPER
是一个轮询器 在这个轮询器的内部会创建一个MessageQUEUE 消息队列这个队列的数据结构其实是个单链表 对message 进行插入和取出。

Looper 不断的取出消息 发送给Hanlder 进行处理 一般是两种处理方式 messgag what: 或者是runnable 接口的方式,处理的方法是在创建handler 的线程中执行的,这样就可以达到在A线程中发送消息,在B处理

2.AsyncTask源码?

四个方法,三个主线程来改变UI一个子线程方法来执行耗时操作 线程池中调用。

本质上是封装了Thread和handler

3.AsyncTask 的优缺点?

串行要排队执行,可能

4.触控事件的机制?

三个方法
Ondisaptch 分发时调用 返回值决定了后续时间是否传递回来 返回值由下面两个方法共同决定(举例down move up )
Oninterapt 拦截时调用
Ontouchevent 执行触摸事件

Boolean Ondisaptch(){
Flag =flase;
if(oninterept()){
Ontouchenwent;
}
Else{
View(chled.disapthcj())
}
}
如不进行拦截则点击事件是向下传递的, 如果不进行消耗则从上而下依次调用一次ontouchEvent();
处理滑动冲突:
Down 和 up 不消耗不拦截 move 需要就进行拦截不需要就不拦

5.View 的绘图机制?

Onmeasure
确定view的大小,三个标记方式
尤其是 当设定为weithcontext 时 这是这个需要进行处理
修改super 的宽高~
通过Measuresprc类的Mode和size,判断自行填写大小(覆写父类setMeasuredDimension(,))

Onlayout 这个方法是确定 自己在父布局的位置
特别是 viewGroup 的话 通常要遍历一下子onmeasure测量view大小然后通过 子 view的layout方法确定子view摆放的位置
onDraw :
通过 画板画笔 画布,进行绘制。

6.AIDL源码的理解和跨进程通信的方式?

跨进程通信。
通常的话是service 中的一个Ibinder 连接成功后会返回这个Binder
自定义的binder 中实现一个接口方法
我们将A工程中的接口文件修改成AIDL文件
然后复制到B工程
b工程会编译成一个JAVA文件看源码的话可以知道是
生成一个代理类;

通过代理类实现操作A工程中的方法。
当服务断开申请重连
或者,当A工程触发时设置监听器,  RemoteCallbackLis(同步注解容器)解决不是 序列化 和反序列化不是一个对象的问题。

7.Asky使用过程中出现过那些问题?

 AsyncTask必须在主线程创建 
说排队,串行执行的!

开源框架部分

1.EventBus优缺点?

2. Retrofit 源码阅读?

网络框架主要分为三个部分:

  1. request
  2. executor
  3. Httpcall(真正的底层请求方式)
  4. 最终返回callback

对于retrofit 而言,request部分是通过注解的形式将http 所需要的参数进行拼接的,executor 是一个网络请求框架最重要的部分,httpcall则采用okhttp进行处理,并支持反序列化

从retrofit build开始说起,建造者模式,主要判断如下是否存在如果存在则使用存在的如果不存在则使用默认的

  1. 底层httpclient 目前只支持okhttp
  2. 调度器,如果自己没有实现,那么使用的是Handler实现的调度器
  3. CallAdapterFactory
  4. conventerFactory

retrofit.create 则产生一个动态代理。进行拦截,将之前http请求和参数进行拼接。并封装一个OkhttpCall。
最终交由前面的调度器,进行调度主要是将异步请求的返回的对象,然后进行反序列化,最终将对象返回到主线程中。

这其中我们如果要进行加解密,那么在自定义conventer则可以实现。

okhttp 原理相同
执行器主要做的是,一个子线程和三个队列,将异步和同步执行的方法,返回。
向下传递给一连串的过滤器,责任链模式。


用过一些三方的 动画 hellochart 百度地图 科大讯飞
三方开源框架 xutils 异步图片网络加载 unvertil-imageloader
动态注入原理:
Imageloader原理:
了解过一些开源框架 volloy picasso Rxjava 等

大概的思想和原理:


项目细节部分

1.大图片如何进行缓存?

Lrucache 数据结构。近期使用最少算法
Hashmap linkedhashmap
Disklrucatch
先内存后文件。
图片错位发生? 线程慢,出现错位。设置flag 判断flag是不是最新的。



Intent:

1.Intent作用?

联系四大组件,启动并交换信息(Bandle对象)七个属性
七种属性:Component ,action,Category,Data,Type,Extra,Flag,url。
Intent.setFlags(IntentFlag.Acitivity.NewTASK)
在新线程中
newIntent(Intent.ACTION.VIEW.URI.parse(“http://mail.google.com”))
上面语句是在浏览器浏览这个网址。

2.IntentFilter?

是用于筛选一般不在代码中使用

3.Intent可以传递那些数据类型?

不可以传递Thread();
可以传递Sevializable(这是java 常用的方法), parcelable ,File (实现了Sevializble接口)Bundle ChareSequence 基本数据类型。 传递二进制数据方法。Bitmap实现了Parcelable 接口。

XML文件:

起名的范围:(a~z)(0~9)(_.);
属性标签android 不可以大写:

Style 和Theme 本质上是一个东西 用Activity 上的叫theme, 用view上的style
Style 可以用在Activity 上,但是theme不能用在View上。

manifest文件

:声明API的最低级别
:权限级别
Activity资源

AlertDialog:

AlertDialog.Builder create 和show方法都返回AlertDailog对象。
AlertDialog 创建:
通过内部类创建,AlertDialog.Builder builder=new AlerDialog.Buleder(context);
ProgressDialog构造方法。是public方法。
ProgressDialog dialog=new ProgressDialog(context);

IntentService 是Service的子类:会开启新的线程执行任务

动画分类:

Frame : 帧动画 translate 和rotate
Tween:补间动画 包含 alpha 和Scale
Animation! 这个是属性不是动画X

线程销毁的方式: onDestory();

Padding 和 Margin 区别

Toast:

1两种默认时常
2Toast不可编辑
3.没有焦点
4.不能获得用户输入

三种菜单:
1.Options menus(选项菜单): 一个Activity 只有一个按下Menu建,在屏幕下方。和ActionBar
onCreateOptionsMenu 创建方法
onOptionsItemSelected 响应方法
2.Contextmenus: 为任何一个视图注册.一个上下文菜单
onCreateContextMenu 创建
onCreateItemSelected 响应

Listview

ListView :有多种不同形式,需要重写那些方法:
1.getItemViewType()
2.getViewTypeCount()

SimpleAdapter还支持,TextView,ImageView,和继承了Cheakable接口 eg:CompoundButton

ContentProvider :

Uri uir=Uri.parse(“content://com.~~.proude./”)

数字证书:

1.必有
2.可以自签名,不需要机构认证
3.只有安装时才会检查证书的有效日期,如果安装之后过期也没事
4.如果要发布必须要发布签名后的数字证书

GLSurFaceView特性

1.管理一个SurFace,这个平面式一个特殊的内存块可以和android 视图系统混合
2.管理一个EGL显示,能够让OpenGL:渲染到平面上
3.接受一个用户提供的实际显示的Renderer对象
4.使用专门的线程渲染和UI线程解耦
5.支持按需渲染和连续渲染(ondemand)(ontinous)

进程:

进程的重要性排序:
前台进程(屏幕显示的)>可见进程(例如输入法)>服务进程>后台进程

Dvm的进程和Linux进程:

Android dvm 的进程和Linux 进程应用进程是同一个概念。
每个Anroid都运行在自己的进程中,都拥有一个独立的Dalik 虚拟机实例,每个DVM都是在Linux 中的一个进程
他们都是进程中的一种,dvm是android 的虚拟机
Linux的进程是程序的具体实现,是执行程序的过程

A.Message提供了消息池,有静态方法Obtain从消息池中取对象;
B.Thread默认不提供资源池,除非使用线程池ThreadPool管理;
C.AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务;
D.Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;

重载和重写?

重写:出现在子继承中。或者接口实现中
函数同名 参数列表相同 。返回值小于父类的返回值
访问权限大于等于父类的。
重载:在同一个类中 是一种方法的多态, 只要方法名相同其他随便(但是只有返回值不同不行)
五种android 体系?
Applaction frameWorker libraries linux

Fragment 生命周期?

动画?

ObjectAnimator:
ValuAnimation:
注意这个本身不提供任何动画效果,而是类似于一个插值器。 他不需要属性

横竖屏问题:

ConfigChanges不设置,切横屏生命周期调用一次,切竖屏调用两次
设置:orientation时 且横屏切竖屏时各调用一次。
设置:orientation|KeyboardHidden 时 切屏并不会调用生命周期,只会调用onConfigurationChanged方法。
但在3.2之后只有设置:onConfigurationchanged 方法才会执行方法。
ScreenOrientation=”Parttrait”无法切换屏幕,所以也无法调用方法。

计算机网络?

七层
基本协议arp ip tcp udp
Arp 攻击

抓包协议。Tcp 协议三次握手。
1确认 a-b syn 标志位码修改。
2b-a syn ack
3.A-B ACK

http 和https 加密

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值