Android中Activity的四种启动模式和onNewIntent()

作者:苏意民 时间:2022-09-05 23:15:02 

写在前面

Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程。用户启动Activity的方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面;另一种是在应用程序中,进入一个新的Activity。前者,桌面其实是系统应用launcher的界面,点击应用程序图标,会进行应用程序的主界面,实质是从一个应用的Activity进入另一个应用Activity。

       因此,不管是从桌面进入应用主界面,还是在应用里进入一个新的Activity,最终都会调用Activity$startActivity方法。

       值得一提的是,Android 5.0,7.0等版本中启动Activity的源码有点小差异,版本的升级只是对代码做了一些封装,最终都会把启动Activity的任务交给ApplicationThread来处理。

Android中Activity启动模式详解

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。

Android总Activity的启动模式分为四种下面看下哪四种:

Activity启动模式设置:

        <activity android:name=".MainActivity" android:launchMode="standard" />

Activity的四种启动模式:

    1. standard

        默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

    2. singleTop

        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

    3. singleTask

        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

    4. singleInstance

        在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中

       大家遇到一个应用的Activity供多种方式调用启动的情况,多个调用希望只有一个Activity的实例存在,这就需要Activity的onNewIntent(Intent intent)方法了。只要在Activity中加入自己的onNewIntent(intent)的实现加上Manifest中对Activity设置lanuchMode=“singleTask”就可以。

       onNewIntent()非常好用,Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。

     当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。

总结

以上所述是小编给大家介绍的Android中Activity的四种启动模式和onNewIntent()网站的支持!

来源:https://blog.csdn.net/suyimin2010/article/details/81148605

标签:android,activity,启动模式,onNewIntent()
0
投稿

猜你喜欢

  • Android 判断SIM卡属于哪个移动运营商详解及实例

    2023-08-25 15:29:39
  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    2022-02-17 21:24:09
  • 关于C#调用C++dll传指针释放内存问题

    2021-12-20 06:56:34
  • Java数据结构顺序表的详细讲解

    2023-11-20 23:01:35
  • android 之Spinner下拉菜单实现级联

    2023-01-24 04:15:45
  • Java通过SSM完成水果商城批发平台流程

    2023-01-04 01:32:04
  • Android 中 ActivityLifecycleCallbacks的实例详解

    2022-08-12 06:03:34
  • 以实例简介Java中线程池的工作特点

    2023-08-11 23:04:19
  • 完美解决springboot项目出现”java: 错误: 无效的源发行版:17“问题(图文详解)

    2023-08-29 02:15:32
  • java集合求和最大值最小值示例分享

    2022-10-11 04:15:10
  • Java多线程之Park和Unpark原理

    2023-03-29 15:46:11
  • 使用@符号让C#中的保留字做变量名的方法详解

    2022-06-07 20:22:48
  • 解决android studio 打开java文件 内容全变了的问题

    2022-03-18 19:31:44
  • 浅谈java+内存分配及变量存储位置的区别

    2022-07-09 00:46:47
  • JavaWeb验证码校验功能代码实例

    2022-07-18 23:46:52
  • Android 自定义弹性ListView控件实例代码(三种方法)

    2022-04-14 15:00:33
  • Java多线程事务管理的实现

    2023-07-26 22:58:20
  • Java 数组获取最大和最小值的实例实现

    2021-06-18 15:53:06
  • Java数据结构学习之二叉树

    2023-04-25 12:08:27
  • C#中参数个数可变的方法实例分析

    2022-12-16 20:02:32
  • asp之家 软件编程 m.aspxhome.com