前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android之activity详解

Android之activity详解

作者头像
李小白是一只喵
发布2021-04-23 11:25:49
7260
发布2021-04-23 11:25:49
举报
文章被收录于专栏:算法微时光算法微时光

image.png

Activity生命周期

image.png

接口函数

介绍

onCreate

当Activity第一次创建的时候调用。这个方法里主要是提供给我们做一些初始化操作,如:创建view、绑定数据到view。同时这个方法里还带有一个Bundle参数,这个参数的主要的用途会在后面的onSavedInstanceState方法的介绍里再来讲解。

onStart

紧接着onCreate方法执行的是onStart方法,该方法的执行表示Activity已经显示了但是还无法和用户交互,只有当执行到onResume方法的时候才可以进行交互。另

onResume

调用到onResume方法后,Activity就可以与用户开始进行交互了,此时Activity就会位于Activity栈的栈顶了。

onPause

当系统开始准备停止当前Activity的时候调用,在该方法中google给出的建议是存储一些变化的数据同时停止一些类似于动画等消耗CPU的工作。该方法的调用过程是很快的,否则会影响到后面的Activity的现实,所以在该方法里不宜做过多耗时操作。

onStop

紧接着onPause方法调用,此时Activity已经不再显示在用户面前了,此时新的Activity可能已经执行到onStart方法或者onResume方法了,所以此时可做一些较为重量级回收操作比方说关于数据库的一些读写操作等。

onRestart

onStop方法之后可能会调用到onRestart方法,这是因为代表的Activity正在被重新启动,然后紧接着就会继续走到onStart和onResume方法中。

onDestroy

该方法表示Activity生命周期中的最后一个方法,表示Activity方法将会被销毁,此时我们可以做一些回收操作。这里需要提到的一点是,即使一个Activity被销毁后app内部的static变量是不会被销毁的,因为static变量是全局的,activity销毁但是该app的进程并没有被杀死。所以说这一点尤为需要注意我们的static变量的使用,否则稍有不慎再次启动该activity的时候该static变量就会是一个dirty data!

image.png

与生命周期相关的一些方法

onSaveInstanceState与onRestoreInstanceState方法

onCreate执行的时候,方法中带有一个Bundle参数,在正常启动Activity的时候打印这个参数会发先它是为null的。

查看google文档可以发现,这个参数只有当Activity重新初始化的时候才不会为null。

那么什么叫重新初始化呢?

举一个简单的例子,比方说手机横竖屏切换的时候如果我们没有在manifest文件的configchange属性里指定orientation|screenSize。

在android4.0以上必须同时指定这两个属性,如果只写orientation不生效。

就会在onPause之后调用到onSaveInstanceState(Bundle)方法,此时我们就可以往Bundle里存储一些数据,随后系统会杀死Activity然后再重启它,此时我们发现onCreate方法中的Bundle参数不为空。

Activity的启动模式

Android应用程序都是由一个或多个Activity组成的,而Android内部则是通过栈来对Activity进行管理的。所谓栈就是一个先进后出的数据结构。

正常情况下栈顶的Activity就是当前Task显示的Activity,当我们按back键的时候该Activity便会出栈。

然而事实并不是这么简单,google在对Activity任务栈进行设计的时候考虑到了一些特殊需求所以便有了Activity的启动模式

Activity的启动模式包含四种,分别是:standard、singleTop、singleTask、singleInstance,我们可以在manifest里通过Activity的launchmode进行指定。

image.png

standard模式

Activity的标准启动模式,如果我们不对Activity做任何特殊处理的情况下就默认为该模式启动。

这个模式会导致一个任务栈里有多个该Activity的实例存在,很简单的一个例子就是我们在AcitivytA里启动ActivityA这样就会有两个ActivityA存在。

假如说该Activity非常消耗资源,那么就有必要考虑下更改下Activity的启动模式了。

singleTop模式

简单来说,启动的Activity已经在任务栈的栈顶话,那么再启动这个Activity的时候就不会创建该实例,同时会调用该Acitivity的onNewIntent方法(前面有提过该方法)。

但是如果该Activity不在栈定的话,那么启动它的行为与standard模式并没有什么区别。

singleTask模式

singleTask指的是一个任务栈中只能存在一个这样的Acitivity。

如果任务栈中没有该Activity的话系统就会创建一个Acitivity压入栈顶,但是如果存在该Activity的话就会销毁压在该Activity上的所有Activity最终让创建出来的Activity实例处于栈顶,同时也会回掉该Activity的onNewIntent方法。

singleInstance模式

四个模式当中最为特殊的一个,设置了该模式启动的Acitivyt会在一个独立的任务栈中开启,该任务栈有且只有一个这样的Activity实例,每次再启动这个Activity的时候就会在该任务栈里重用该Activity同时回掉onNewIntent方法。

singleInstace与singleTask的区别在于:singleTask启动的Activity在系统层面上来说是可以有多个实例的。

比如说应用程序A想调用singleInstance模式下的ActivityA,而应用程序B也同样调用了,那么在应用程序A和B中就会各有一个ActivityA的实例。

但如果该ActivityA是singleInstance模式的话,那么无论有多少个应用程序调用它,它都只可能在系统中存在一个实例同时该实例还是位于它自己的一个单独的任务栈中。

这个经常使用于系统中的应用,比如Launch、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。了解就可以。

image.png

启动模式的使用方式

  1. 在 Manifest.xml中指定Activity启动模式 例如:
代码语言:javascript
复制
 <activity android:name="..activity.MultiportActivity" android:launchMode="singleTask"/>
  1. 启动Activity时。在Intent中指定启动模式去创建Activity 例如:
代码语言:javascript
复制
         Intent intent = new Intent();
        intent.setClass(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);

Activity 的 Flags

  1. Intent.FLAG_ACTIVITY_NEW_TASK 使用一个新的任务栈来启动一个Activity,该flag通常用于在Service中启动Activity的场景,因为Service中并不存在有Activity任务栈所以通常通过这种方式来新启动一个Activity任务栈并创建新的Activity实例。
  2. Intent.FLAG_ACTIVITY_SINGLE_TOP 与在manifest文件里的launchmode指定"singleTop"作用一样
  3. Intent.FLAG_ACTIVITY_CLEAR_TOP 与在manifest文件里的launchmode指定"singleTask"作用一样
  4. Intent.FLAG_ACTIVITY_NO_HISTORY 设置了该Flags的Activity在启动其他Activity后该Activity就消失了,不会保留在Activity栈中,此Activity可以作为一个中转Activity来负责启动其他的Activity。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Activity生命周期
  • 与生命周期相关的一些方法
    • onSaveInstanceState与onRestoreInstanceState方法
    • Activity的启动模式
      • standard模式
        • singleTop模式
          • singleTask模式
            • singleInstance模式
            • 启动模式的使用方式
            • Activity 的 Flags
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档