android 4大组件相互启动,Android四大组件——Activity

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

简介:Activity的生命周期,开启及退出,Context 等。

1.1 Activity生命周期

Activity 即一个用户界面,可以理解成一个视图容器,容器内可以包裹和展示各类控件。全部 Activity 都需要在 Manifest 内声明。

Activity 的生命周期为:onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy()【或 onRestart() - onStart()…】。

需要注意的是:onStop() 在 Activity 不可见时才调用,例如 AActivity 启动 BActivity,若 BActivity 是透明或弹窗形式(android:theme="@android:style/Theme.Dialog"),则 AActiivty 不会调用 onStop()。

Activity 的 onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法,不同于生命周期方法,它们并不一定会被触发。当用户按 Home 键返回桌面、从多任务切换应用、锁屏、屏幕方向变化、启动新的 Activity时,或者当应用遇到意外情况(如内存不足)且 Activity 由系统销毁时,则 onSaveInstanceState() 会被调用。但是当用户主动销毁一个 Activity(例如在应用中按返回键)时,onSaveInstanceState() 就不会被调用。通常 onSaveInstanceState() 只适合用于保存一些临时性的状态,而 onPause() 适合用于数据的持久化保存。

如果一个 Activity 被打开过,然后被置入任务栈顶端(例如切换到另一个 Activity 且没有再次切换新 Activity),且此时处于 onPause()、onStop 状态,则当有一个 Intent 启动该 Activity,会先调用 onNewIntent(),然后才调用 onRestart() - onStart() - onResume()。

Activity 必须在 Manifest 中注册:1

2

3

4

5

6

7

8

android:name="lsl.demo.OtherModuleActivity">

1.2 Context

Activity、Application 都是 Context 的子类,而 Context 是抽象类 ContextImpl 的实现。context 维护当前 Activity 的生命周期,而 Application 维护整个应用的生命周期,因此一些全局变量可以放在 Application 中。

2. Activity的启动和退出

2.1 启动Activity

直接启动 Actiivty:1

2

3

4

5

6

7

8

9

10

11Intent intent = new Intent(context, DemoActivity.class);

// 直接插入数据

intent.putExtra("key1", value)

intent.putExtra("key2", value)

// 通过 Bundle

Bundle bundle = new Bundle();

bundle.putXXX(String key1, XXX value);

bundle.putXXX(String key2, XXX value);

intent.putExtra(bundle);

startActivity(intent);

启动跨 Module 的 Activity,需要先在目标 Activity 注册的 Manifest 文件中设置一个 Action:1

2

3

4

5

6

然后利用 Manifest 中设置的 demo.customActionName 来启动:1

2

3Intent intent = new Intent();

intent.setAction("demo.customActionName");

startActivity(intent)

需要注意的是:默认情况下,假如这里设置的 demo.customActionName 和别的 App 某个 Activity 设置的一样,则通过 setAction 启动时只会启动本 App 中的 Activity。如果想要让 Activity 可以被别的 App 唤起,则需要添加一个 export 属性(不显式设置该属性时默认为 false):1

2

3

4

5

6

android:name="demo.DemoActivity"

android:exported="true"

>

......

2.2 退出Activity当一个 Application 已开启了多个 Activity,则在安全退出时,可以发送预定义的广播,在所有被开启的 Activity 中注册广播监听,监听到广播后各自调用 finish() 即可。

当一个应用有层叠 Activity(即 AActivity 启动 BActivity,BActivity 启动 CActivity…)时,可在每个 Activity 启动新 Activity 时,使用 startActivityForResult() 替代 startActivity(),并在 onActivityResult() 中将自己 finish()。

用 List 等记录每个启动的 Activity,并在需要时分别关闭。需要注意的是,使用 List 存放 Activity 有内存泄露的风险,当 Activity 关闭后,要及时清掉对应 List 中的引用。

在启动 Activity 时,给 Intent 设置 Flag:intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP),则系统会在新 Activity 启动后将其上的所有 Activity 销毁,效果等效于给新 Activity 配置 SingleTop 启动模式。

3. Activity启动模式

Activity 有 4 种启动模式:standard

singleTop

singleTask

singleInstance

需要先了解到,Android 中 Activity 是存在堆栈(任务栈)中的,启动一个 Activity 时会将其压栈,销毁时弹出,当然不同启动模式会导致 Activity 任务栈产生不同的行为。同时一个 App 进程也可以拥有多个 Activity 任务栈,例如 singleInstance 模式。

3.1 Standard模式

Standard 就是标准默认模式,启动一个 Activity 时,不论 Activity 在任务栈中是否已经有实例,都新建一个实例并压入往当前任务栈。当前 Activity 在当前任务栈可以有多个实例,每个实例也可以在不同任务栈。

简单来说,也就是每次启动一个 Activity 都当做一个新的 Actviity 创建实例并压进对应的任务栈。需要注意的是,Standard 模式并不会创建任务栈,这也是为什么使用 ApplicationContext 启动,或在 Service 中以 Standard 方式启动 Activity 时会报错:1android.util.AndroidRuntimeException: Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

因为 ApplicationContext 和 Service 并没有任务栈。

Standard 启动方式任务栈的行为实例如下(其中 “/” 表示 栈底,“>” 表示 栈顶):当前任务栈如果返回执行任务/A>退出Standard Start B

/AB>/A>Standard Start B

/ABB>/AB>Standard Start A

/ABBA>/ABB>-

3.2 SingleTop模式

SingleTop 即栈顶唯一模式,启动一个 Activity 时,如果该 Activity 已在栈顶则不会新建一个 Activity 实例而是复用它,否则其行为和 Standard 模式一致。

SingleTop 启动方式任务栈的行为实例如下(其中 “/” 表示 栈底,“>” 表示 栈顶):当前任务栈如果返回执行任务1/A>退出SingleTop Start B

2/AB>/A>SingleTop Start B

3/AB>/A>SingleTop Start A

4/ABA>/AB>SingleTop Start B

5/ABAB>/ABA>-

3.3 SingleTask模式

SingleTask 即任务栈唯一模式,启动一个 Activity 时,如果任务栈中存在该 Activity 实例,则复用它,否则才创建一个新的 Activity 实例。SingleTask 和 SingleTop 的区别在于,SingleTop 只在栈顶 Activity 和要启动的 Activity 相同时才复用,而 SingleTask 是每个 Activity 在当前整个任务栈中都只有一个实例。

SingleTask 启动方式任务栈的行为实例如下(其中 “/” 表示 栈底,“>” 表示 栈顶):当前任务栈如果返回执行任务1/A>退出SingleTask Start B

2/AB>/A>SingleTask Start B

3/AB>/A>SingleTask Start A

4/BA>/B>Standard Start B

5/BAB>/BA>-

3.4 SingleInstance模式

SingleInstance 即唯一实例模式),启动一个 Activity 时,寻找所有的任务栈,如果某个任务栈中存在该 Activity 实例,则切换到该任务栈,否则新建一个任务栈并创建该 Activity 实例。

重点在于:任务栈不是唯一的,一个 App 可以有多个任务栈,就像 Android 系统的后台应用列表一样,里面包括了多个应用,而每个应用又管理自己的多个任务栈(可以理解为任务栈的总栈),每个任务栈又分别管理包含的 Activity。

SingleInstance 启动方式任务栈的行为实例如下(其中 “/” 表示 栈底,“>” 表示 栈顶,任务栈之间用 “-” 连接,右侧的任务栈为最新任务栈,M 为最开始以 Standard 启动的 Activity):当前任务栈如果返回执行任务1/M>退出SingleInstance Start A

2/M> - /A>/M>SingleInstance Start B

3/M> - /A> - /B>/M> - /A>SingleInstance Start A

4/M> - /B> - /A>/M> - /B>Standard Start C

5/B> - /A> - /MC>/B> - /A> - /M>返回

6/B> - /A> - /M>/B> - /A>返回

7/B> - /A>/B>返回

8/B>退出-

前 3 步都比较好理解,反正就是整个 App 所有任务栈都只允许有一个实例。重点在从第 4 步开始,由于最开始的 M 是 Standard 模式启动的,而第 4 步中 C 也是 Standard 模式,也就导致本来在最底下的任务栈 /M> 被移到了 “任务栈的总栈” 的栈顶,并将 C 压入了 /M> 所在的这个栈顶,因此从 C 返回的时候会先返回到 M,然后才是按顺序下来的 A → B。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值