1、横竖屏切换时Activity的生命周期变化?
1.如果没有在AndroidManifest.xml配置android:ConfigChanges,切屏会销毁当前Activity,然后重新加载调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;此时Activity的生命周期如下:onPause,onStop: , onDestroy: , onCreate: ,onStart: onRestoreInstanceState,onResume。
2.如果设置 android:configChanges=“orientation|keyboardHidden|screenSize”>,此时Activity的生命周期不会重走一遍,Activity不会重建,只会回调onConfigurationChanged方法。
经过机型测试
在 Android5.1 即 API 3 23 级别下,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
在 Android9 即 API 8 28 级别下,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged方法
官方纠正后,原话如下
如果您的应用面向 Android 2 3.2 即 API 级别 3 13 或更
高级别(按照 minSdkVersion 和 targetSdkVersion)
2、activity的startActivity和context的startActivity区别?
1.从Activity中启动新的Activity时可以直接 mContext.startActivity(intent)就好,
2.从非Activity中用Context中启动Activity则必须给intent设置Flag:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
mContext.startActivity(intent);
3、Activity启动模式有哪些,分别有什么不同?
Activity有四种启动模式,分别是standard,singleTop,singleTask,singleInstance
1、standard标准模式: 这个是android默认的Activity启动模式, 每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,此模式的 Activity 默认会进入启动它的 Activity 所属的任务栈中,并位于栈顶。
2、singleTop栈顶复用模式:如果当前要启动的Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,会复用该Activity,并且不会重走onCreate方法,会直接走它的onNewIntent方法,如果新 Activity 实例已经存在但不在栈顶,那么Activity 依然会被重新创建。如果当前activity已经在前台显示着,突然来了一条推送消息,此时不想让接收推送的消息的activity再次创建,那么此时正好可以用该启动模式,如果之前activity栈中是A–>B–>C如果点击了推动的消息还是A–>B–C,不过此时C是不会再次创建的,而是调用C的onNewIntent。而如果现在activity中栈是A–>C–>B,再次打开推送的消息,此时跟正常的启动C就没啥区别了,当前栈中就是A–>C–>B–>C了。
3、singleTask栈内复用模式:只要 Activity 在一个任务栈中存在,那么多次启动此 Activity 都不会重新创建实例,并回调onNewIntent 方法,比如之前activity栈中有A–>B–>C—D,再次打开了B的时候,在B上面的activity都会从activity栈中被移除。下面的acitivity还是不用管,所以此时栈中是A–>B,一般项目中主页面用到该启动模式。
4、singleInstance:该种情况就用得比较少了,主要是指在该activity永远只在一个单独的栈中,且此任务栈中只有唯一一个实例。一旦该模式的activity的实例已经存在于某个栈中,任何应用在激活该activity时都会重用该栈中的实例,解决了多个task共享一个activity。其余的基本和上面的singleTask保持一致。
4、App启动流程
从Linux内核系统到init进程的分裂,以及后面会启动一个叫Zygote的进程开始,而Zygote会分裂出系统的核心服务进程SystemServer,也就是SystemServer里面包括了底层的ActivityManagerService、PackageManagerService、WindowManagerService等,这些核心服务都是通过Zygote.init启动的,ActivityManagerService就是我们后面通过binder的ipc通信机制来与客户端ActivityThread建立通信的。
当我们点击了应用之后,系统的Launcher应用会通过startActivity的方式启动应用,而Intent的获取会经过如下几部:
(1) ActivityManagerService会通过PackageManager的resolveIntent()收集这个intent对象的指向信息。
(2)指向信息被存储在一个intent对象中。
(3)下面重要的一步是通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。
(4)如果有权限, ActivityManagerService会检查并在新的task中启动目标activity.
(5)现在, 是时候检查这个进程的ProcessRecord是否存在了。
所以如果ProcessRecord不是null,ActivityManagerService会创建新的进程来实例化该activity。
ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程. Zygote孵化自身, 并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。
随后就是我们熟悉的ActivityThread.main方法通过Looper.prepare和Looper.loop方法开启消息循环
紧接着就是创建Application对象的过程,先是创建好ContextImpl对象,然后通过makeApplication方法将app进程与Application建立联系,这里的Application创建交给了Instrumentation的对象,其实后面activity的创建,生命周期的回调都是通过它来触发的。
创建完Application后,紧接着就是我们熟悉的Activity,activity的创建同样交给了Instrumentation对象,上面说过ActivityManagerService会将携带的Intent对象交给了Lanucher应用,Lanucher的startActivity经过一系列的操作,最终会走Instrumentation的execStartActivity方法,该方法里面会去请求ActivityManagerService服务,最终通过binder通信将信息传给了客户端的ApplicationThread,最终会触发ApplicationThread的scheduleLaunchActivity方法,该方法将消息发送给了ActivityThread的handler对象,最终交给了Instrumentation对象创建activity。后面也就触发一系列的生命周期方法。
4、Activity的生命周期,能否改?
5、如何理解Activity的任务亲和性
6、Activity的启动过程
7、推送到达率如何提高
判手机系统,小米使用小米推送,华为使用华为推送,其他手机使用友盟推送
8、说下 Activity 跟 跟 window , view 之间的关系?
Activity 创建时通过 attach()初始化了一个 Window 也就是PhoneWindow,一个 PhoneWindow 持有一个DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于 View,Activty 通过setContentView 将xml 布局控件不断 addView()添加到 View 中,最终显示到 Window 于我们交互;
9、Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么?
所有的框架都是基于反射 和 配置文件(manifest)的。 普通的情况: Activity 创建一个 view 是通过 ondraw
画出来的, 画这个 view 之前呢,还会调用 onmeasure方法来计算显示的大小.复制代码 特殊情况: Surfaceview
是直接操作硬件的,因为 或者视频播放对帧数有要求,onDraw 效率太低,不够使,Surfaceview 直接把数据写到显存。复制代码
10、Android中任务栈的分配
Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。
Activity有不同的启动模式, 可以影响到task的分配
11、Activity间通过Intent传递数据大小有没有限制?
Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之内(1024KB),笔者采用的是传递Bitmap的方法,发现当图片大小超过1024(准确地说是1020左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB之内。