一、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.产生了一个down事件,activity–>phoneWindow–>ViewGroup–>ListView–>botton,中间如果有重写了拦截方法,则事件被该view拦截可能消耗;
- 二)、移动点击按钮的时候:
- 1.产生move事件,listView中会对move事件做拦截;
2.此时listView会将该滑动事件消费掉;
3.后续的滑动事件都会被listView消费掉;
- 1.产生move事件,listView中会对move事件做拦截;
- 三)、手指抬起来时候:前面建立了一个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