Android 四大组件之Activity

本文详细解读Android Activity的核心概念,包括生命周期的七个阶段(onCreate、onStart、onResume、onPause、onStop、onDestroy和onRestart),以及四种启动模式standard、singleTop、singleTask和singleInstance的区别。重点讲解了Activity在应用切换中的执行顺序和内存管理策略。
摘要由CSDN通过智能技术生成

Android 四大组件之Activity

​ Android有四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。

活动(Activity)

​ 介绍:Activity是Android的四大组件之一,是用户操作可视化界面;它为用户提供了一个操作的页面。在我创建一个新的Activity之后,需要调用setContenView()方法来显示页面,以此来为用户提供交互。在Android APP中只要能看到的页面都是依附于Activity显示的,同样Activity是在开发中使用最多最频繁的一种组件。

1、 Activity生命周期

​ 在一个Activity从页面开始到显示再到结束一共有7个生命周期方法

img

  • onCreate()

    create表示创建,生命周期的第一个方法,也是在Android开发中接触最多的生命周期方法,表示Activity正在创建。一般会在这个方法中做一些初始化工作比如:setContentView加载布局,对一些控件和变量进行初始化等。此时Activity还在后台,不可见。

  • onStart()

    start标识Activity正在启动,这时Activity还没有显示在前台页面上,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。

  • onResume()

    resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备

  • onPause()

    pause标识页面暂停,当Activity页面跳转到另一个Activity页面时或者应用正常退出时都会执行这个方法。此时Activity还处于前台可见状态,因此可以在此方法做一些轻量级的数据存储工作但是不能太耗时。因为在跳转Activity时只有当前Activity执行了onPause方法后另一个新的Activity方法才能启动,而且在Android中指定了onPause在500ms内没用完全执行完毕的话会强制关闭Activity。

  • onStop()

    stop标识停止,此时Activity已经处于不可见的状态,但是Activity还在内存中没有被完全的关闭销毁。这里主要做一些资源回收的工作。

  • onDestroy()

    destroy表示销毁,这个阶段说明页面已经完全被销毁了,不可见,我们可以将一些没有没有被释放的资源进行释放,以及进行一些回收工作

  • onRestart()

    restart表示重新开始,Activity这里是可见的,当Activity_A页面转到Activity_B页面,又从Activity_B页面返回到Activity_A页面或者当用户直接按Home键返回到桌面上后又切换到Activity页面就会触发这个方法。这里一般不进行操作

当Activity_A页面切换到Activity_B页面的执行顺序是:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sq2euACh-1644817774816)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210095135989.png)]

其实Activity的生命周期除了onRestart方法其余六个是两两对应的,那么相邻的方法有什么区别呢?

1.1、onCreate和onStart之间有什么区别?

​ 1、可见与不可见的区别,onCreate是正在创建为不可见,onStart处于正在启动状态处于可见的状态

​ 2、执行次数的区别,onCreate方法只有在Activity创建的时候执行一次,而onStart方法在重新进入或者切换到Activity页面的过程中都会被多次调用,因为Bndle数据恢复在onStart中进行比在onCreate进行要更加合适

​ 3、onCreate能做的事其实onStart都能做,但是onStart能做的事onCreate未必都能做到;比如setContentView和资源初始化在两者都能做。但是初始化动画onCreate就不能做,因为onCreate是处于不可见状态所以不会显示效果,所以在onStart做初始化动画比较合适。

1.2、onStart和onResume之间有什么区别?

​ 1、两者因为都处于可见状态,但是不是都处于前台可操作的状态,比如:onStart是处于可见状态但是不在前台,不能进行交互,而onResume处于前台可见状态,因此可以行数据交互。

​ 2、职责不同,onStart方法还是主要进行一些初始化的工作,而onResume方法,根据官方的建议可以做一些开启动画和可与用户交互的工作

1.3、onPause和onStop之间有什么区别?

​ 1、可见与不可见的区别;onPause是暂停状态但是还是可见的状态,而onStop处于已经停止了也不可见的状态但是Activity还在内存中。

​ 2、在系统存在内存不足时可能不会执行onStop方法,因为在做数据存储、状态保存以及程序状态保存时最好在onPause中进行,但是不要太耗时。

1.4、onStop和onDestroy之间有什么区别

​ 1、onStop处于停止状态但是Activity还处于内存中,可以通过切换页面来唤醒Activity页面;但是onDestroy已经表示Activity已经被销毁了。

1.5、为什么切换Activity时各方法的执行次序是

(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop

​ 而不是

(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume

​ 1、因为Activity或多或少都会占用一些内存在官方的建议,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。

2、 Activity启动方式

​ Activity有四种启动方式分别为:默认启动模式standard、栈顶复用模式singleTop、栈内复用模式singleTask、全局唯一模式singleInstance四种模式,这四种也有不同的特征和区别,下面就一一介绍。

一个android应用程序功能通常会被拆分为多个Activity,而各个Activity之间通过Intent进行连接,android系统通过栈结构来保存整个程序的Activity,栈底的元素是整个栈任务的发起者。
正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,而启动它的Activity虽然功成身退,但依然保留在任务栈中,处于停止状态(如果没有finish),当用户按下返回键或者调用finish()方法时,系统会移除顶部的Activity,让后面的Activity恢复活动状态。但是,可以给Activity设置一些“特权”,来打破这种“和谐”的模式。这种特权,就是通过在AndroidManifest.xml文件中的属性android:launchMode来设置或者通过Intent的flag来设置的。

  <activity android:name=".MainActivity"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
              
              
 
1.1、默认启动模式standard

​ 如果开发时不在manifest设定,那么Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1uLW4Et0-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210102239166.png)]

返回页面时也是依次销毁页面的,这是最简单的一个模式。

1.2、栈顶复用模式singleTop

​ 在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity而是直接切换到该Acitvity;如果栈顶Activity不是我们要新建的Activity才会去新建一个Activity。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-an0K2YUI-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210103854059.png)]

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
 
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Activity2"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="ONETEXT_TWOACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".Activity3">
        <intent-filter>
            <action android:name="ONETEXT_THREEACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

可以手动设置通过:android:launchMode="singleTop"对当前Activity进行设置启动模式

通过这种设置可以避免已经创建过的Activity被重复创建

1.3、栈内复用模式singleTask

与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例会将:将task内的对应Activity实例之上的所有Activity弹出栈。将对应Activity置于栈顶,获得焦点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQUHyNUn-1644817774818)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210105422872.png)]

1.4、全局唯一模式singleInstance

这是第四种模式,也是相对于比较复杂的一种模式:在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

这种启动模式和singleTask几乎一样,它也只允许系统中存在一个目标Activity,包括上面我们所说的SingleTask的一些特性singleInstance都有。singleInstance翻译过来是单例的意思:TA有两层含义:1.告诉系统,我是独一无二的,2.告诉任务栈我是独一无二的,也就是说,任务栈中除了我不能再有其他Activity。

所以,如果要启动singleInstance模式的Activity,那只能新创建一个任务栈用来放它,因为人家说了,“我是独一无二的!”。同样的,如果从这种启动模式的Activity中启动别的Activity,那不好意思,我不管你是不是和我处在同一个应用,我所在的任务栈只能拥有我一个人,您呐,另外让系统给你创建一个任务栈待着去吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值