时间:2021-12-07 编辑:
“有人觉得自己不找工作,不需要看面试题,真的是这样吗?试想?如果你一直待在一家公司,都不知道外面的情况如何的话,那是很可怕的,至少我这么认为。看面试题的目的不一定要跳槽,而是知道自己的优缺点是什么,知道市场需要什么样的人,只有这样才能和社会接上轨迹!”
1.点击应用图标后会去启动应用的LauncherActivity。
2.如果LauncherActivity所在进程没有创建,就会创建新进程(以Socket形式通知Zygote进程去fork新进程)。
3.整体的流程就是Activity的启动流程。
1.standard 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
2.singleTop 可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
3.singleTask 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
4.singleInstance 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
横竖屏切换根据Android系统版本会有差异,具体细节请参考:Activity横竖屏切换生命周期详解
1.AndroidManifest.xml不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,
切横屏时会执行一次,切竖屏时会执行两次。生命周期如下:
onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。生命周期如下:onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
1.PathClassLoader: 只能加载安装到Android系统的APK,即/data/data目录,是Android默认的类加载器。
2.DexClassLoader: 可以加载任意目录下的dex、jar、apk、zip文件。
1.大小限制大约是1MB:超过该限制可能导致 OOM。
2.解决办法
进程内:EventBus、文件缓存
进程间:通过ContentProvider进行进程间数据共享和传递。
总结:不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction 缓存为1MB)
1.Context抽象类
2.ContextImpl:Context的实现类
3.ContextWrapper:Context的包装类(内部是ContextImpl),Applicaiton、Activity、Service都间接或者直接继承自ContextWrapper
1.Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程(比喻成没有界面的activity),也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。
2.IntentService是Service的子类,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。
1.startService(onCreate-onStartCommand-onDestory)
服务与启动者没有必然联系,启动者销毁,服务也可以存在;除非主动调用StopService方法来停止服务。
2.bindService(onCreate-onBind-onUnbind-onDestory)
服务与启动者相互关联,启动者销毁,那么服务也会跟着销毁;比如activityA中bind服务,然后activityB中也在使用该服务,一旦activityA销毁那么服务也会销毁,这个时候activityB中服务也就没用了,除非再bind一次。
3.startService之后再bindService这样避免宿主死亡之后service跟着被销毁。
无序广播:无序广播类似于电视台播放新闻联播,不管你当时有没有准时收看,都会按时播放新闻联播。
发送方式:通过sendBroadcast(intent)发送
特点:①无法终止广播 ②无法修改数据
有序广播:有序广播就类似于中央发送的红头文件,比如说会首先发送到哪个省,然后发送到哪个市等等,按照优先级一级一级的进行接收,就比如中央给每个村民发送1千斤大米。
发送方式:通过sendOrderedBroadcast()发送
特点:①可以终止广播 ②可以修改数据
粘性广播:特定是Intent会一直保留到广播事件结束,没有10s限制。一般用来确保重要的状态改变后的信息被持久保存,并且能随广播给新的BroadcastReceiver,比如电源的改变。
发送方式:通过SendStickyBroadcast()发送。
1.前台进程: 用户当前操作所必须的进程
2.可见进程:没有任何前台组件,但是任辉影响屏幕上可见内容的进程。
3.服务进程:正在运行服务(该服务通过startService()启动),且不属于上面两者的进程。
4.后台进程:包含目前对用户不可兼得Activity的进程。
5.空进程:不包含任何活动组件的进程。
1.进程是资源管理的最小单位,线程是程序执行的最小单位。
2.每个进程都有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程。它包含独立的栈和cpu寄存状态,每个线程共享其所附属进程的所有资源,包含打开的文件,内存页面,信号标识以及分配内存等。
3.线程比进程花费更小的CPU资源。
4.在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器,并且减少进程上下文切换的开销。
5.线程和进程的关系是:①线程属于进程②线程运行在进程空间内③同一进程所产生的线程共享同一内存空间,当进程退出所产生的的线程会被强制退出并清除④一个进程至少需要一个线程来作为它的指令执行体⑤进程管理着资源(比如CPU,内存,文件等),将线程分配到某个CPU运行。
6.线程按照其调度这可分为用户级线程和内核级线程两种。
7.用户级线程要绑定内核级线程使用。
8.默认情况下不能保证新线程和调用线程的执行顺序。
9.每个进程内部的不同线程都有自己的唯一标识(ID),线程标识只在它所属的进程环境中有效。
10.Sleep线程告诉系统,自己在一段时间内不被调度。
1.接口
2.Handler机制
3.观察者模式(EventBus)
4.Android使用RunonUiThread可以切换到主线程
5.AsyncTask机制
6.BroadCast
1.Bundle,可以在一个进程中通过Intent将携带数据的Bundle发送到另一个进程的组件。
2.ContentProvider,多个App共享数据
3.AIDL(Android Interface Define Language)服务,客户端定义接口暴露给服务端使用
4.BroadCast
5.Socket
1.提升进程优先级,降低进程被杀死的概率。
2.拉活已经被杀死的进程。
● 利用广播拉活Activity
● 手机去监听系统广播:如开机广播,锁屏解锁广播等。
1.序列化:将数据结构或对象转换成二进制的过程
2.反序列化:将在序列化过程中生成的二进制串转换成数据结构或对象的过程
1.Serilizable是java实现的一套序列化方法,会触发频繁的IO操作,效率较低,适合将对象存储到磁盘上的情况。
2.Parcelable是Android提供的序列化方法。Parcelable将序列化后的字节流写入到一个共享内存中,其他对象可以从该共享内存中读出字节流,并反序列化成对象,效率较高,适合对象间和进程间传递信息。
1.产生原因:Dex文件中class、method的索引使用short类型,因此如果方法、类的总数超过了2字节的short-65535就会出问题。
2.解决办法:使用Google的Multidex
1.帧动画 指通过指定的每一帧的图片和播放时间,有序的进行播放的动画效果。
2.补间动画 指通过指定View的初始状态、变化时间、移动距离等方式实现的动画效果。
属性有scale、alpha、Translate、Rotate
注意:只是在视图层实现了动画效果,并没有真正改变View的属性。
3.属性动画 属性动画,通过不断地改变View的属性,不断重绘而形成动画效果。
相比较视图动画,View的属性是真正改变。