Activity中onNewIntent()方法触发及注意事项

2023-05-16

Activity的onNewIntent()方法何时会被调用?

前提:

ActivityA已经启动过,处于当前应用的Activity堆栈中;

当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法;

当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时再次启动会调用onNewIntent()方法;

当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法.

一、一个Activity的正常生命周期流程:

  1. onCreate
  2. onStart
  3. onResume
  4. onPause
  5. onStop
  6. onDestroy

##重点:

在上述前提中,如果当前Activity之前已经被打开过,现在处于onPause、onStop状态的话,其他应用再发送Intent的话,执行顺序为:

onNewIntent,onRestart,onStart,onResume

首先,在默认情况下,当您通过Intent启到一个Activity的时候,就算已经存在一个相同的正在运行的Activity,系统都会创建一个新的Activity实例并显示出来。为了不让Activity实例化多次:

我们可以设置launchMode 为 singleTask(实现单任务模式) 通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法。如下所示:

protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);//must store the new intent unless getIntent() will return the old one
    processExtraData();
}

注意注释://must store the new intent unless getIntent() will return the old one

所以最好是调用setIntent(intent),这样在使用getIntent()的时候就不会有问题了。

当然还有一点做法就是:

系统可能会随时杀掉后台运行的 Activity ,如果这一切发生,那么系统就会调用 onCreate 方法,而不调用 onNewIntent 方法,一个好的解决方法就是在 onCreate 和 onNewIntent 方法中调用同一个处理数据的方法,如下所示: 

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		processExtraData();
	}

	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		setIntent(intent);
		processExtraData();
	}

    private void processExtraData(){
        Intent intent = getIntent();
        //use the data received here
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Activity中onNewIntent()方法触发及注意事项 的相关文章

  • 每天进步一点点之Android基础(3)—— Activity的onNewIntent

    onNewIntent 的触发时间 xff1a 如图所示 xff0c onCreate 和 onNewIntent 不会被同时调用 如果在 AndroidManifest xml 中 xff0c 将 Activity 的 launchMod
  • onNewIntent()的使用

    我对 onNewIntent 的理解 当我们由于某些原因 xff0c 可能会反复启动一个 Activity 时 xff0c 你可能会想不就是通过 startActivity intent xff0c 来启动嘛 xff0c 反复走 onCre
  • Activity

    1 注册 在AndroidManifest中 lt application gt 添加标签 lt activity gt lt activity gt lt application gt 属性 android label 61 34 34
  • Activity onNewIntent注意事项

    数据上报发现 xff0c onNewIntent 以后 xff0c onResume和onPause可能不会执行 xff0c 直接执行onStop
  • 关于Activity onNewIntent方法的调用时机

    在官方API上的说明如下 http developer android com reference android app Activity html onNewIntent android content Intent protected
  • Activity onNewIntent方法的调用时机

    首先看下官方的API说明 xff1a This is called for activities that set launchMode to singleTop in their package or if a client used t
  • ViewBinding 初探-在Activity和Adapter中使用

    升级android studio后 xff08 主要是gradle升级后 xff09 xff0c butterknife 不再被支持 xff1b 现在google主推ViewBinding 一下就是我用ViewBinding 做的一个小de
  • activity getIntent() 方法获取不到值的问题分析

    之前有同事小伙伴问我说 xff0c 他在activity里边调用getIntent 方法没有获取到应该传递过来的值 看了下他这个activity是single task属性的 xff0c 怀疑是由于activity的single task属
  • android:onNewIntent

    本文编写目的 xff1a 供自己查阅 1 通过Intent启到一个Activity的时候 xff0c 就算已经存在一个相同的正在运行的Activity 系统也会创建一个新的Activity实例 为了不让Activity实例化多次 xff0c
  • Activity launchmode和Intent flag详解

    学习安卓 xff0c 首先就要接触和学习Activity xff0c 想必大家在学习activity的过程中一定对activity的launchmode有过困惑 好在网络上关于activity launchmode的博客 解释一大堆 xff
  • Activity中使用onNewIntent方法避免多次实例化同一个Activity

    最近写的项目中有一个搜索 搜索结果 搜索这样一个循环的过程 xff0c 发现了几个问题 xff1a 1 循环导致多次实例化这两个类 xff1b 解决方案 xff1a 在Manifest里面对应activity下面设置启动模式为singleT
  • 被其他Activity覆盖不触发onStop的情况

    被其他Activity覆盖不触发onStop的情况 xff1a 一般情况下当一个Activity被其他Activity覆盖时 被覆盖的Activity都会调用onStop xff08 xff09 方法 但是有两种情况除外 一个是上层Acti
  • Android Activity onNewIntent() 详解

    阅读更多 阅读难度 xff1a 中 阅读前提 xff1a 1 需要了解 Android 的生命周期 xff0c 每个方法的触发时机以及作用 2 需要了解 Activity 的 launchMode 模式和作用 3 Intent 基本知识及作
  • onNewIntent 什么时候调用

    protected void onNewIntent Intent intent Since API Level 1 This is called for activities that set launchMode to 34 singl
  • Android Activity之间跳转与传值

    一 Activity 跳转与传值 xff0c 主要是通过 Intent 类来连接多个 Activity xff0c 通过 Bundle 类来传递数据 最常见最一般的页面跳转代码 xff0c 很简单 xff0c 如下 xff1a Intent
  • Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈 Task 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity 这些 Activity 按照各自的打开顺序排列在堆栈 xff08 即 返回栈 xff09 中 其实就是以栈的结构 先进后出 将依次打
  • Unable to find explicit activity class

    做项目从一个activity逐渐转向到使用多个activity xff0c 这个时候新手就容易出现一个问题 xff0c 忘了给activity在AndroidManifest xml中注册 打开日志 xff0c 在遇到这个报错信息的时候 x
  • Android 进阶解密:根 Activity 启动过程

    一 根 Activity 启动过程 可以分为三个部分 Launcher 请求 AMS 过程 AMS 到 ApplicationThread 的调用过程 ActivityThread 启动 Activity 二 Launcher 启动 AMS
  • Android进阶知识树——Android四大组件启动过程

    Android的四大钻无论对开发者或是用户都意义重大 对于用户来说应用就是Activity 用户所能看到的和交互的都发生在Activity中 对于开发者来说四大组件更是开发功能个展示功能的基础和媒介 对于初级开发者每天的工作都在和四大组件打
  • Android 屏幕发生旋转对应的生命周期发生变化解析

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 用户首次进入页面后执行的生命周期回调方法 二 屏幕发生旋转后 切换成了横屏 原先的活动被销毁 会重新创建新的活动 三 将横屏切回为竖

随机推荐