-
如果
IntentActivity
处于任务栈的顶端,也就是说之前打开过的Activity
,现在处于onPause
、onStop
状态的话,其他应用再发送Intent
的话 -
执行顺序为:
onNewIntent
,onRestart
,onStart
,onResume
。
==========================================================================
Activity
一共有四种launchMode
:standard
、singleTop
、singleTask
、singleInstance
。
Standard
模式(默认模式)
-
说明: 每次启动一个
Activity
都会又一次创建一个新的实例入栈,无论这个实例是否存在。 -
生命周期:每次被创建的实例
Activity
的生命周期符合典型情况,它的onCreate
、onStart
、onResume
都会被调用。 -
举例:此时
Activity
栈中以此有A
、B
、C
三个Activity
,此时C处于栈顶,启动模式为Standard
模式。若在C Activity
中加入点击事件,须要跳转到还有一个同类型的C Activity
。结果是还有一个C Activity
进入栈中,成为栈顶。
SingleTop
模式(栈顶复用模式)
-
说明:分两种处理情况:须要创建的
Activity
已经处于栈顶时,此时会直接复用栈顶的Activity
。不会再创建新的Activity
;若须要创建的Activity
不处于栈顶,此时会又一次创建一个新的Activity
入栈,同Standard
模式一样。 -
生命周期:若情况一中栈顶的
Activity
被直接复用时,它的onCreate
、onStart
不会被系统调用,由于它并没有发生改变。可是一个新的方法onNewIntent
会被回调(Activity
被正常创建时不会回调此方法)。 -
举例:此时
Activity
栈中以此有A
、B
、C
三个Activity
,此时C
处于栈顶,启动模式为SingleTop
模式。情况一:在C Activity
中加入点击事件,须要跳转到还有一个同类型的C Activity
。结果是直接复用栈顶的C Activity
。情况二:在C Activity
中加入点击事件,须要跳转到还有一个A Activity
。结果是创建一个新的Activity
入栈。成为栈顶。
SingleTask
模式(栈内复用模式)
-
说明:若须要创建的
Activity
已经处于栈中时,此时不会创建新的Activity
,而是将存在栈中的Activity
上面的其他Activity
所有销毁,使它成为栈顶。 -
如果是在别的应用程序中启动它,则会新建一个
task
,并在该task中启动这个Activity
,singleTask
允许别的Activity
与其在一个task
中共存,也就是说,如果我在这个singleTask
的实例中再打开新的Activity
,这个新的Activity
还是会在singleTask
的实例的task
中。 -
生命周期:同
SingleTop
模式中的情况一同样。仅仅会又一次回调Activity
中的onNewIntent
方法 -
举例:此时
Activity
栈中以此有A
、B
、C
三个Activity
。此时C
处于栈顶,启动模式为SingleTask
模式。情况一:在C Activity
中加入点击事件,须要跳转到还有一个同类型的C Activity
。结果是直接用栈顶的C Activity
。情况二:在C Activity
中加入点击事件,须要跳转到还有一个A Activity
。结果是将A Activity
上面的B
、C
所有销毁,使A Activity
成为栈顶。
SingleInstance
模式(单实例模式)
-
说明:
SingleInstance
比较特殊,是全局单例模式,是一种加强的SingleTask
模式。它除了具有它所有特性外,还加强了一点:只有一个实例,并且这个实例独立运行在一个task
中,这个task
只有这个实例,不允许有别的Activity
存在。 -
这个经常使用于系统中的应用,比如
Launch
、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。了解就可以。 -
举例:比方
A Activity
是该模式,启动A
后。系统会为它创建一个单独的任务栈,由于栈内复用的特性。兴许的请求均不会创建新的Activity
,除非这个独特的任务栈被系统销毁。
- 在
Manifest.xml
中指定Activity
启动模式
-
一种静态的指定方法
-
在
Manifest.xml
文件里声明Activity
的同一时候指定它的启动模式 -
这样在代码中跳转时会依照指定的模式来创建
Activity
。
- 启动
Activity
时。在Intent
中指定启动模式去创建Activity
-
一种动态的启动模式
-
在
new
一个Intent
后 -
通过
Intent
的addFlags
方法去动态指定一个启动模式。
- 注意:以上两种方式都能够为
Activity
指定启动模式,可是二者还是有差别的。
-
优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。
-
限定范围:第一种方式无法为
Activity
直接指定FLAG_ACTIVITY_CLEAR_TOP
标识,另外一种方式无法为Activity
指定singleInstance
模式。
这四种模式中的
Standard
模式是最普通的一种,没有什么特别注意。而SingleInstance
模式是整个系统的单例模式,在我们的应用中一般不会应用到。所以,这里就具体解说SingleTop
和SingleTask
模式的运用场景:
SingleTask
模式的运用场景
-
最常见的应用场景就是保持我们应用开启后仅仅有一个
Activity
的实例。 -
最典型的样例就是应用中展示的主页(
Home
页)。 -
假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用
SingleTask
模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。
SingleTop
模式的运用场景
-
假设你在当前的
Activity
中又要启动同类型的Activity
-
此时建议将此类型
Activity
的启动模式指定为SingleTop
,能够降低Activity的创建,节省内存!
- 注意:复用
Activity
时的生命周期回调
-
这里还须要考虑一个
Activity
跳转时携带页面參数的问题。 -
由于当一个
Activity
设置了SingleTop
或者SingleTask
模式后,跳转此Activity
出现复用原有Activity
的情况时,此Activity
的onCreate
方法将不会再次运行。onCreate
方法仅仅会在第一次创建Activity
时被运行。 -
而一般
onCreate
方法中会进行该页面的数据初始化、UI
初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心此问题 -
若页面展示的数据就是通过
getInten()
方法来获取,那么问题就会出现:getInten()
获取的一直都是老数据,根本无法接收跳转时传送的新数据!
- 以下,通过一个样例来具体解释:
-
以上代码中的
CourseDetailActivity
在配置文件里设置了启动模式是SingleTop
模式,依据上面启动模式的介绍可得知,当CourseDetailActivity
处于栈顶时。 -
再次跳转页面到
CourseDetailActivity
时会直接复用原有的Activity
,并且此页面须要展示的数据是从getIntent()
方法得来,可是initData()
方法不会再次被调用,此时页面就无法显示新的数据。 -
当然这样的情况系统早就为我们想过了,这时我们须要另外一个回调
onNewIntent(Intent intent)
方法。此方法会传入最新的intent
,这样我们就能够解决上述问题。这里建议的方法是又一次去setIntent
。然后又一次去初始化数据和UI
。代码例如以下所看到的:
- 这样,在一个页面中能够反复跳转并显示不同的内容。
- 这个问题其实也是比较简单的,就是不要在
Activity
的onCreate
方法中执行过多繁重的操作,并且在onPasue
方法中同样不能做过多的耗时操作。
-
注意!这里并不是要回答
Activity
的生命周期!
-
标记位既能够设定Activity的启动模式,如同上面介绍的,在动态指定启动模式,比方
FLAG_ACTIVITY_NEW_TASK
和FLAG_ACTIVITY_SINGLE_TOP
等。它还能够影响Activity
的运行状态 ,比方FLAG_ACTIVITY_CLEAN_TOP
和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
等。 -
以下介绍几个基本的标记位,切勿死记,理解几个就可以,须要时再查官方文档。
FLAG_ACTIVITY_NEW_TASK
- 作用是为
Activity
指定“SingleTask”
启动模式。跟在AndroidMainfest.xml
指定效果同样
FLAG_ACTIVITY_SINGLE_TOP
- 作用是为
Activity
指定“SingleTop”
启动模式,跟在AndroidMainfest.xml
指定效果同样。
FLAG_ACTIVITY_CLEAN_TOP
-
具有此标记位的
Activity
,启动时会将与该Activity
在同一任务栈的其他Activity
出栈。 -
一般与
SingleTask
启动模式一起出现。 -
它会完毕
SingleTask
的作用。 -
但事实上
SingleTask
启动模式默认具有此标记位的作用
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
-
具有此标记位的
Activity
不会出如今历史Activity
的列表中 -
使用场景:当某些情况下我们不希望用户通过历史列表回到
Activity
时,此标记位便体现了它的效果。 -
它等同于在
xml
中指定Activity
的属性.
这个是启动模式中的了,当此 Activity
的实例已经存在,并且此时的启动模式为 SingleTask
和 SingleInstance
,另外当这个实例位于栈顶且启动模式为 SingleTop
时也会触发 onNewInstent()
。
========================================================================
3.1 Activity 间通过 Intent 传递数据大小限制
-
Intent
在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB
之内(1024KB
) -
我们采用传递
Bitmap
的方法,发现当图片大小超过1024
(准确地说是1020
左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同) -
因此可以判断
Intent
的传输容量在1MB
之内。
3.2 内存不足时系统会杀掉后台的Activity,若需要进行一些临时状态的保存,在哪个方法进行
-
Activity
的onSaveInstanceState()
和onRestoreInstanceState()
并不是生命周期方法,它们不同于onCreate()
、onPause()
等生命周期方法,它们并不一定会被触发。 -
onSaveInstanceState()
方法,当应用遇到意外情况(如:内存不足、用户直接按Home
键)由系统销毁一个Activity
,onSaveInstanceState()
会被调用。 -
但是当用户主动去销毁一个
Activity
时,例如在应用中按返回键,onSaveInstanceState()
就不会被调用。 -
除非该
activity
不是被用户主动销毁的,通常onSaveInstanceState()
只适合用于保存一些临时性的状态,而onPause()
适合用于数据的持久化保存。
3.3 onSaveInstanceState() 被执行的场景
-
系统不知道你按下
HOME
后要运行多少其他的程序,自然也不知道activity A
是否会被销毁 -
因此系统都会调用
onSaveInstanceState()
,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则:
-
当用户按下
HOME
键时 -
长按
HOME
键,选择运行其他的程序时 -
锁屏时
-
从
activity A
中启动一个新的activity
时 -
屏幕方向切换时
一般情况下比如说有两个 activity
, 分别叫 A
, B
,当在 A
里面激活 B
组件的时候, A
会调用 onPause()
方法,然后 B
调用 onCreate()
, onStart()
, onResume()
。
这个时候 B
覆盖了窗体, A
会调用 onStop()
方法. 如果 B
是个透明的,或者 是对话框的样式, 就不会调用 A
的 onStop()
方法。
3.5 用 Intent 去启动一个Activity 之外的方法
- 使用
adb shell am
命令
-
am
启动一个activity
-
adb shell am start com.example.fuchenxuan/.MainActivity
-
am
发送一个广播,使用action
-
adb shell am broadcast -a magcomm.action.TOUCH_LETTER
3.6.1 定义
-
服务器可以定制化跳转
app
页面 -
app
可以通过Scheme
跳转到另一个app
页面 -
可以通过
h5
页面跳转app
原生页面
3.6.2 协议格式:
-
qh
代表Scheme
协议名称 -
test
代表Scheme
作用的地址域 -
8080
代表改路径的端口号 -
/goods
代表的是指定页面(路径) -
goodsId
和name
代表传递的两个参数
3.6.3 Scheme使用
- 定义一个
Scheme
- 获取
Scheme
跳转的参数
- 调用方式
- 原生调用
- html调用
- 判断某个Scheme是否有效
- 关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远
Android产品研发(十一)–>应用内跳转Scheme协议
=============================================================================
4.1 Context , Activity , Appliction 的区别
-
相同:
Activity
和Application
都是Context
的子类。 -
Context
从字面上理解就是上下文的意思, 在实际应用中它也确实是起到了管理 上下文环境中各个参数和变量的总用, 方便我们可以简单的访问到各种资源。 -
不同:维护的生命周期不同。
Context
维护的是当前的Activity
的生命周期,Application
维护的是整个项目的生命周期。 -
使用
context
的时候, 小心内存泄露, 防止内存泄露
-
它描述的是一个应用程序环境的信息,即上下文。
-
该类是一个抽象(
abstract class
)类,Android
提供了该抽象类的具体实 现类(ContextIml
)。 -
通过它我们可以获取应用程序的资源和类, 也包括一些应用级别操作, 例如:启动一个
Activity
,发送广播,接受Intent
,信息,等。
4.2.1 附加一张 Context 继承关系图
- 使用 ActivityLifecycleCallbacks
-
面试官问这个问题,想看看大家对Activity了解是否深入:
-
什么是 ActivityRecord
-
什么是 TaskRecord
-
什么是 ActivityManagerService
-
四大组件之一,通常一个用户交互界面对应一个
activity
。 -
activity
是Context
的子类,同时实现了window.callback
和keyevent.callback
,可以处理与窗体用户交互的事件。 -
开发中常用的有
FragmentActivity
、ListActivity
、TabActivity
(Android 4.0
被Fragment
取代)
========================================================================
- 前台 / 可见 / 服务 / 后台 / 空
5.1.1 前台进程:Foreground process
-
用户正在交互的
Activity
(onResume()
) -
当某个
Service
绑定正在交互的Activity
-
被主动调用为前台
Service
(startForeground()
) -
组件正在执行生命周期的回调(
onCreate()
、onStart()
、onDestory()
) -
BroadcastReceiver
正在执行onReceive()
5.1.2 可见进程:Visible process
-
我们的
Activity
处在onPause()
(没有进入onStop()
) -
绑定到前台
Activity
的Service
5.1.3 服务进程:Service process
- 简单的
startService()
启动。
5.1.4 后台进程:Background process
-
对用户没有直接影响的进程 —
Activity
处于onStop()
的时候。 -
android:process=":xxx"
5.1.5 空进程:Empty process
尾声
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《2017-2021字节跳动Android面试历年真题解析》
之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
[外链图片转存中…(img-Lsib58gp-1719256715621)]
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
[外链图片转存中…(img-cQXdIJVW-1719256715621)]
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-clTGyaXl-1719256715621)]
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-SKJ8bGSd-1719256715622)]
《2017-2021字节跳动Android面试历年真题解析》
[外链图片转存中…(img-2Hg29FyR-1719256715622)]