Android面试汇总-Android基础面试

一、Activity生命周期?

  • 答:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
    1.a启动b,后退键再到a的生命周期流程:a.create–>a.start–>a.resume–>a.pause–>b.create–>b.start–>b.resume–>b界面绘制–>a.stop–>b.pause–>b.stop–>b.destroy–>a.restart–>a.start–>a.resume
    2.意外销毁会调用saveInstance,重新恢复的时候回调用restoreInstance。储存数据的时候使用了委托机制,从activity–>window–>viewGroup–>view 会递归调用save来保持本view的数据,restore则是递归恢复本view数据。我们可以在里面做一些自己需要的数据操作。

二、Activity之间的通信方式

  • 答: Intent
    借助类的静态变量
    借助全局变量/Application
    借助外部工具
    借助SharedPreference
    使用Android数据库SQLite
    赤裸裸的使用File
    Android剪切板
    借助Service

三、Activity与Fragment之间生命周期比较

  • 答:Fragment生命周期
    onAttach
    onCreate
    onCreateView
    onActivityCreate ______以上相当于Activity的onCreate方法
    onStart ______相当于Activity的onStart方法
    onResume ______相当于Activity的onResume方法
    onPause ______相当于Activity的onPause方法
    onStop ______相当于Activity的onStop方法
    onDestroyView
    onDestroy
    onDetach ______以上相当于Activity的onDestroy方法

四、Activity上有Dialog的时候按Home键时的生命周期

  • 答:这里分两种情况去分析:一种情况下是我们使用正常的Dialog,这种Dialog是Activity的组件,所以Activity处于运行在前台的状态,如果我们这是按下Home键,Activity将进入后台,此时回调用onPause->onStop方法。一种情况下是使用另一个theme为Dialog的Activity,当这个Dialog存在时,Activity进入透明状态即调用onPause,当点击Home键后,Activity调用onStop方法。

五、两个Activity之间跳转必然会执行哪几个方法?

  • 答: 存在A,B两个Activity;
    当A调换到B时,会先调用onPause方法;
    如果B存在于Activity栈中,B会调用onReStart,onStart,onResume方法,如果B不存在于Activity栈中,B会调用onCreate,onStart,onResume方法;
    当B调用完onResume方法后,如果B不是透明窗体或对话框,则A调用onStop方法,否则A不调用onStop方法。

六、Activity的启动过程(不要回答生命周期)

  • 1、app启动的过程有两种情况,第一种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity来启动一个新的activity。
    2、我们创建一个新的项目,默认的根activity都是MainActivity,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。
    3、而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。
    4、当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。

七、Acitivity四种LaunchMode及其使用场景

  • 1、standard 模式:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
    2、singleTop 模式:如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
    3、singleTask 模式:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
    4、singleInstance 模式:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

八、A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的

  • 1.这个题目需要深入了解activity的启动模式
    2.最后的答案是:两个栈,前台栈是只有D,后台栈从底至上是A、B、C

九、Activity缓存方法

  • 答:配置改变导致Activity被杀死,横屏变竖屏:在onStop之前会调用onSaveInstanceState()保存数据在重建Activity之后,会在onStart()之后调用onRestoreInstanceState(),并把保存下来的Bundle传给onCreate()和它会默认重建Activity当前的视图,我们可以在onCreate()中,回复自己的数据。

十、Service生命周期?

  • 答:1、service 启动方式有两种,一种是通过startService()方式进行启动,另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样.
    2、通过startService()这种方式启动的service,生命周期是这样:调用startService() --> onCreate()–> onStartConmon()–> onDestroy()。这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用,当我们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当我们通过startService启动时候,通过intent传值,在onStartConmon()方法中获取值的时候,一定要先判断intent是否为null。
    3、通过bindService()方式进行绑定,这种方式绑定service,生命周期走法:bindService–>onCreate()–>onBind()–>unBind()–>onDestroy() , bingservice 这种方式进行启动service好处是更加便于activity中操作service,比如加入service中有几个方法,a,b ,如果要在activity中调用,需要activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象

十一、怎么保证service不被杀死

  • 答:1.提升service优先级;
    2.提升service进程优先级;
    3.onDestroy方法里重启service;

十二、静态的Broadcast 和动态的有什么区别

  • 1.动态的比静态的安全;
    2.静态在app启动的时候就初始化了 动态使用代码初始化;
    3.静态需要配置 动态不需要;
    4.生存期,静态广播的生存期可以比动态广播的长很多;
    5.优先级动态广播的优先级比静态广播高;

十三、Broadcast注册方式与区别

  • 第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
    第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露。

十四、Android中跨进程通讯的几种方式

  • 1、Android 跨进程通信,像intent,contentProvider,广播,service都可以跨进程通信。
    2、intent:这种跨进程方式并不是访问内存的形式,它需要传递一个uri,比如说打电话。
    3、contentProvider:这种形式,是使用数据共享的形式进行数据共享。
    4、service:远程服务,aidl
    5、广播

十五.Intent可以传递哪些数据类型

  • 1.Serializable
    2.charsequence: 主要用来传递String,char等
    3.parcelable
    4.Bundle

十六、Json有什么优劣势、解析的原理

  • 1、JSON的优点:
      A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
      B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
      C.支持多种语言,便于服务器端的解析;
      E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
    2、JSON的缺点
      A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;
      B.JSON格式目前在Web Service中推广还属于初级阶段。
    3、与XML比较
    json轻便、解析简单,对客户端更加友好。
    XML更加笨重,解析为DOM树并遍历节点来取数据,优点是结构清晰,扩展性好。

十七、Android中的几种动画

  • 1、帧动画:指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
    2、补间动画:指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。
    3、属性动画:在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。

十八、AIDL理解

  • AIDL: aidl就类似与两个进程之间的桥梁,使得两个进程之间可以进行数据的传输,跨进程通信有多种选择,比如 BroadcastReceiver , Messenger 等,但是 BroadcastReceiver 占用的系统资源比较多,如果是频繁的跨进程通信的话显然是不可取的;Messenger 进行跨进程通信时请求队列是同步进行的,无法并发执行。

十九、Binder机制原理

  • 在Android系统的Binder机制中,是有Client,Service,ServiceManager,Binder驱动程序组成的,其中Client,service,Service Manager运行在用户空间,Binder驱动程序是运行在内核空间的。而Binder就是把这4种组件粘合在一块的粘合剂,其中核心的组件就是Binder驱动程序,Service Manager提供辅助管理的功能,而Client和Service正是在Binder驱动程序和Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供设备文件/dev/binder与用户控件进行交互,Client、Service,Service Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。而Binder Manager是一个守护进程,用来管理Service,并向Client提供查询Service接口的能力。

二十、Handler的原理

  • 1、Android中主线程是不能进行耗时操作的,子线程是不能进行更新UI的。所以就有了handler,它的作用就是实现线程之间的通信。
    2、handler整个流程中,主要有四个对象,handler,Message,MessageQueue,Looper。当应用创建的时候,就会在主线程中创建handler对象,我们通过要传送的消息保存到Message中,handler通过调用sendMessage方法将Message发送到MessageQueue中,Looper对象就会不断的调用loop()方法不断的从MessageQueue中取出Message交给handler进行处理,从而实现线程之间的通信。

二十一、Fragment与Fragment、Activity通信的方式

  • 1.直接在一个Fragment中调用另外一个Fragment中的方法
    2.使用接口回调
    3.使用广播
    4.Fragment直接调用Activity中的public方法

二十二、Android UI适配

  • 字体使用sp,使用dp,多使用match_parent,wrap_content,weight
    图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。

二十三、ANR理解

  • ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框.
    产生原因:
    (1)5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).
    (2)BroadcastReceiver在10s内无法结束
    (3)Service 20s内无法结束(低概率)
    解决方式:
    (1)不要在主线程中做耗时的操作,而应放在子线程中来实现。如onCreate()和onResume()里尽可能少的去做创建操作。
    (2)应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。
    (3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
    (4)service是运行在主线程的,所以在service中做耗时操作,必须要放在子线程中。

二十四、RecyclerView和ListView的区别

  • 1、RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平);
    2、RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了;
    3、RecyclerView可以进行局部刷新;
    4、RecyclerView提供了API来实现item的动画效果;
    5、在性能上:
    如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。
    如果只是作为列表展示,则两者区别并不是很大。
    注:RecyclerView使用方法:http://blog.csdn.net/lmj623565791/article/details/45059587

二十五.listview内点击buttom并移动的事件流完整拦截过程:

  • 一)、点下按钮的时候:
    • 1.产生了一个down事件,activity–>phoneWindow–>ViewGroup–>ListView–>botton,中间如果有重写了拦截方法,则事件被该view拦截可能消耗;
      2.没拦截,事件到达了button,这个过程中建立了一条事件传递的view链表;
      3.到button的dispatch方法–>onTouch–>view是否可用–>Touch代理;
  • 二)、移动点击按钮的时候:
    • 1.产生move事件,listView中会对move事件做拦截;
      2.此时listView会将该滑动事件消费掉;
      3.后续的滑动事件都会被listView消费掉;
  • 三)、手指抬起来时候:前面建立了一个view链表,listView的父view在获取事件的时候,会直接取链表中的listView让其进行事件消耗;

二十六.bundle的数据结构,如何存储

  • 1.键值对储存;
    2.传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组;
    3.当Bundle传递的是对象或对象数组时,必须实现Serializable 或Parcelable接口;

二十七.Serializable和Parcelable 的区别

  • 1.P 消耗内存小
    2.网络传输用S 程序内使用P
    3.S将数据持久化方便
    4.S使用了反射 容易触发垃圾回收 比较慢

二十八.android的IPC通信方式,线程(进程间)通信机制有哪些

  • 1.ipc通信方式:binder、contentprovider、socket
    2.操作系统进程通讯方式:共享内存、socket、管道

二十九.Android的线程如何实现

  • 1.继承Thread类
    2.实现Runnale接口
    3.AsyncTask
    4.线程池
    参考答案:https://www.jianshu.com/p/f97dbaa9ac60?utm_source=oschina-app

三十.HandlerThread是什么

  • HandlerThread继承自Thread,因此HandlerThread其实就是一个线程。
    MessageQueue + Looper + Handler

三十一.IntentService是什么

  • 含有HandlerThread的Service,可以多次startService()来多次在子线程中进行 onHandlerIntent()的调用。

三十二、怎样退出终止App

  • 自己设置一个Activity的栈,然后一个个finish();

三十三、Fragment如果在Adapter中使用应该如何解耦?

  • 答:
    1、接口回调,实时性比较强
    2、广播
    参考答案:https://blog.csdn.net/qq629290/article/details/78142998
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值