android系统性学习 2.1.0 —— 四大组件之Activity
Android Activity
目录
activity相关问题自测:
Q1: 说下Activity的生命周期?
Q2: onStart()和onResume()/onPause()和onStop()的区别?
Q3:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个对话框Activity呢?
Q4:谈谈onSaveInstanceState()方法?何时会调用?
......
参考答案:https://blog.****.net/qq_36478274/article/details/103000599
正文:
一、启动模式
在实际的项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。
启动模式一共有4种。standard、singleTop、singleTask和singleInstance
通过在AndroidManifest.xml中给<activity>
标签指定android:launchMode
属性来选择启动模式。
-
1、standard
活动的默认启动模式。在该模式下,每当启动一个新活动,它就会在返回栈中入栈,并处于栈顶的位置,并且,不管此活动是否已经存在于返回栈中,每次启动都会创建该活动的一个新实例。
-
2、singleTop
在启动活动时,如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
-
3、singleTask
使用 single Top模式可以很好地解决重复创建栈顶活动的问题,但是如你在上一节所看到的,如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。那么有没有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?这就要借助 singleTask模式来实现了。当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
-
4、singleInstance
singleInstance模式算是4种启动模式中最复杂的一个了,不同于以上三种模式,该模式下活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。
那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singlelnstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
二、启动过程
三、Intent/flag
四、taskAffinity
五、生命周期
活动(activity)表示一个单一屏幕上的用户界面。
例如,电子邮件应用程序可能是一个活动,显示新的电子邮件列表是另一个活动,撰写电子邮件,阅读电子邮件可能又是其它的活动。如果应用程序有一个以上的活动,那么应该将其中的一个活动标记为活动启动应用程序。
C,C++ 或者 Java 语言编程,这些程序从 main() 函数开始。
Android系统是从一个Activity 的 onCreate() 方法调用开始启动程序。一个回调方法 - 启动一个活动,以及其它回调方法,如销毁一个活动,活动的生命周期如下图所示序列:
Activity类定义了以下的回调方法,即事件。并不需要实现所有的回调方法。需要了解每一个变化以及实现,以确保应用程序如用户所期望的行为或方式。
回调 |
描述 |
onCreate() |
这是第一个回调,在活动第一次创建时调用 |
onStart() |
这个回调在活动为用户可见时被调用 |
onResume() |
这个回调在应用程序与用户开始可交互的时候调用 |
onPause() |
被暂停的活动无法接受用户输入,不能执行任何代码。 在当前活动将要被暂停,上一个活动将要被恢复时调用 |
onStop() |
当活动不在可见时调用 |
onDestroy() |
当活动被系统销毁之前调用 |
onRestart() |
当活动被停止以后重新打开时调用 |
参考:
活动的四种启动模式:https://www.jianshu.com/p/b4472dc6911e