欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发艺术探索——1.Activity的生命周期和启动模式

程序员文章站 2022-03-15 21:15:01
1.1 Activity的生命周期1.1.1典型情况的生命周期onCreate: Activity正在被创建,可以做一些初始化工作,比如调用setContentView加载界面布局资源,初始化Activity所需的数据。onRestart: Activity正在重新启动,一般情况,当前Activity从不可见变为可见3.onStart: Activity正在启动,这时Activity可见,但是还没有出现在前台,无法和用户进行交互,还在后台onResume: Activity已经可见了,并且出现在...

1.1 Activity的生命周期

1.1.1典型情况的生命周期

  1. onCreate: Activity正在被创建,可以做一些初始化工作,比如调用setContentView加载界面布局资源,初始化Activity所需的数据。
  2. onRestart: Activity正在重新启动,一般情况,当前Activity从不可见变为可见
  3. onStart: Activity正在启动,这时Activity可见,但是还没有出现在前台,无法和用户进行交互,还在后台
  4. onResume: Activity已经可见了,并且出现在前台开始活动
  5. onPause: Activity正在停止,紧接着onStop就会被调用
  6. onStop: Activity即将停止,做一些稍微重量级的回收工作
  7. onDestroy: Activity即将被销毁,生命周期的最后一个回调,做一些回收工作和最终资源的释放

Android开发艺术探索——1.Activity的生命周期和启动模式
几种情况:

  1. 针对一个特定的Activity,第一次启动,回调如下:onCreate -> onStart -> onResume.
  2. 当用户打开新Activity或切换到桌面时,onPause -> onStop ,如果新Activity采用了透明主题,当前Activity不会回调onStop
  3. 再次回到原Activity时,回调如下 onRestart -> onStart -> onResume
  4. 按Back键退回,onPause -> onStop -> onDestroy
  5. 从整个生命周期来说,onCreate和onDestory是配对的,分别标志着Activity的创建和销毁,并且只可能有一次调用。
    从Activity是否可见来说,onStart和onStop是配对的,从Activity是否在前台来说,onResume和onPause是配对的
    几个问题:
    1.onStart和onStop从Activity是否可见的角度进行回调,onResume和onPause从Activity是否位于前台的角度来回调
    2.当前Activity为A,新打开一个ActivityB,ActivityA先onPause,然后新ActivityB再启动
    ActivityA: onPause -> ActivityB: onCreate -> onStart -> onResume -> ActivityB:onStop

1.1.2 异常情况下的生命周期

1.资源相关配置发生改变导致Activity被杀死并重新创建

当系统配置改变后,Activity会被销毁,onPause,onStop,onDestroy均会被调用,由于是在异常情况下终止,系统会调用onSaveInstanceState保存当前Activity的状态,调用时机是onStop之前,和onPause没有既定的时序关系,这个方法只会出现在Activity被异常终止的情况下,当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,可以取出之前保存的数据并恢复,onRestoreInstanceState调用时机在onStart之后
Android开发艺术探索——1.Activity的生命周期和启动模式

2.资源内存不足导致低优先级的Activity被杀死

Activity按照优先级从高到低
1.前台Activity——正在和用户交互的Activity
2.可见但非前台——可见,位于后台无法和用户交互
3.后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低
如果一个进程中没有四大组件在执行,这个进程很快会被系统杀死,因此一些后台工作不适合脱离四大组件独自运行在后台中,比较好的是将后台工作放入Service中从而保证进程有一定的优先级

当系统配置发生变化时,Activity会被重新创建,若不想系统重新创建Activity,给Activity指定configChanges属性
例如不想让Activity在屏幕旋转时重新创建:

android:configChanges="orientation"

Android开发艺术探索——1.Activity的生命周期和启动模式

1.2 Activity的启动模式

1.2.1 Activity的LaunchMode

  1. standard:标准模式。每次启动一个Activity都会重新创建一个新的实例。这是一种典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
  2. singleTop栈顶复用模式。 新的Activity已经位于任务栈的栈顶,此Activity不会被重新创建,同时他的onNewIntent方法会被回调,通过此方法可以取出当前请求的信息,onCreate,onStart不会被系统调用,因为它并没有发生改变。
  3. singleTask栈内复用模式单实例模式,只要Activity在一个栈中存在,多次启动此Activity都不会重新创建实例,也会毁掉onNewIntent。例如:在此模式下的Activity请求启动后,比如ActivityA,系统先寻找是否存在A想要的任务栈,若不存在,重新创建一个任务栈,然后创建A的实例把A放到栈中;若存在,系统把A调到栈顶并调用它的onNewIntent方法,同时singleTask默认具有clearTop的效果,会导致栈内所有在A上面的Activity全部出栈,如果实例不存在,就创建A实例并把A压入栈中。
  4. singleInstance单实例模式,一种加强的singleTask模式,具有此种模式的Activity只能单独的位于一个任务栈中,当ActivityA启动后,系统为他建一个新的任务栈,A独自在这个新的任务栈里,由于栈内复用特性,后续的请求均不会创建新的 Activity,除非这个独特的任务栈被系统销毁了。
  5. 一种情况:
    Android开发艺术探索——1.Activity的生命周期和启动模式
    Android开发艺术探索——1.Activity的生命周期和启动模式
    1.Activity所需的任务栈:TaskAffinity,这个参数标识了一个Activity所需的一个任务栈的名字,默认情况,所有Activity所需的任务栈的名字为应用的包名,也可以单独指定。 TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。(任务栈分为前台任务栈和后台任务栈)

2.TaskAffinity和singleTask:他是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
TaskAffinity和allowTaskReparenting:当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。

3.给Activity指定启动模式:
一.通过AndroidMenifest
二.通过Intent设置标志位为Activity指定启动模式

        Intent intent = new Intent();
        intent.setClass(MainActivity.this,SecondActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

第二种的优先级高于第一种,第一种无法为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为Activity指定singleInstance模式。

例:
Android开发艺术探索——1.Activity的生命周期和启动模式

Android开发艺术探索——1.Activity的生命周期和启动模式

1.2.2 Activity的Flags

标记位可以设定Activity的启动模式,可以影响Activity的运行状态
FLAG_ACTIVITY_NEW_TASK:为Activity指定“singleTask”启动模式。
FLAG_ACTIVITY_SINGLE_TOP:为Activity指定“singleTop”启动模式。

1.3 IntentFilter的匹配规则

启动Activity分为显式调用和隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。IntentFilter中的过滤信息有action,category,data。一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter,即可成功启动对应的Activity。

1.3.1 action的匹配规则

action是一个字符串,匹配规则是Intent中的action存在且必须和过滤规则中的action匹配,字符串值完全一样,区分大小写。

1.3.2 category的匹配规则

category是一个字符串,与action的不同,action是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,category匹配要求Intent可以没有category,一旦有category,不管几个,每个都要能够和过滤规则中的任何一个category相同。

1.3.3 data的匹配规则

和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
data由mimeType和URI组成,mimeType指媒体类型,URI包含很多
????/:/[ ||] ,URI默认值为content和file,如果要为Intent指定完整的data,必须调用setDataAndType方法,不能分开调用setData,setType,这两个方法会彼此清除对方的值。

当通过隐式方式启动一个Activity时,做一下判断,判断方法有两种,采用PackageManger的resolveActivity或Intent的resolveActivity方法,如果他们找不到匹配的Activity就会返回null。另外PackageManager还提供了queryIntentActivities方法,和resolveActivity不同的是,不是返回最佳匹配的Activity信息而是返回所有成功匹配的Activity信息。

本文地址:https://blog.csdn.net/zhougongjinxuan/article/details/114272316

相关标签: android