onNewIntent详解

2023-05-16

记得刚开始学的时候,感觉intent还挺简单,结果现在总是被intent困扰,发现自己太天真了,为了弄清楚,总结一下,

一、onNewIntent

老规矩,先看官方:
在这里插入图片描述
大概意思是当Activity被设以singleTop模式启动,当需要再次响应此Activity启动需求时,会复用栈顶的已有Activity,还会调用onNewIntent方法。并且,再接受新发送来的intent(onNewIntent方法)之前,一定会先执行onPause方法。

二、onNewIntent与启动模式

前提:ActivityA已经启动过,处于当前应用的Activity任务栈中;

当ActivityA的LaunchMode为Standard时:

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

当ActivityA的LaunchMode为SingleTop时:

如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:

onCreate—>onStart—>onResume—onPause—>onNewIntent—>onResume

当ActivityA的LaunchMode为SingleInstance,SingleTask

如果ActivityA已经在任务栈中,再次启动ActivityA,那么此时会调用onNewIntent()方法,生命周期调用顺序为:

onPause—>跳转其它页面—>onCreate—>onStart—>onResume—onPause—>跳转A—>onNewIntent—>onRestart—>onStart—>onResume

总的来说,只对SingleTop(且位于栈顶),SingleTaskSingleInstance(且已经在任务栈中存在实例)的情况下,再次启动它们时才会调用,即只对startActivity有效,对仅仅从后台切换到前台而不再次启动的情形,不会触发onNewIntent。

三、实例:

在android中,从另一个activity开始一个新的activity并向它传递一些数据是一件简单而基本的事情。但是,如果你希望一个已经运行的活动出现在前台,并向它传递数据,这可能有点棘手。
首先,在默认情况下,如果你使用intent调用一个activity,即使另一个实例已经在运行,也会创建并显示该activity的一个新的istance。为了避免这种情况,必须将活动标记为不应该多次实例化。为了实现这一点,我们将在AndroidManifest.xml中将活动的launchMode设置为singleTop

<activity android:name=".SecondActivity"
            android:launchMode="singleTop"
            ></activity>
        <activity
            android:name=".FirstActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这样,当我们使用intent调用此活动时,如果存在现有实例,系统将把请求跳转到它。我们通常的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();
}

不要忘记,我们可以在onCreate中以正常的方式接收数据,当活动第一次创建时,由于系统可以很容易地在回轮中终止活动,如果发生这种情况,将调用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);//must store the new intent unless getIntent() will return the old one
  processExtraData()
}
 
private void processExtraData(){
  Intent intent = getIntent();
  //use the data received here
}

完整代码如下:

FirstActivity.java

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        displayIntentData();

        findViewById(R.id.sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                intent.putExtra("key",((EditText)findViewById(R.id.dataToSend)).getText().toString());
                startActivity(intent);
                //注意我们在这里没有调用finish()方法
            }
        });

    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e("onNewIntent","First Activity OnNewIntent is called");
        setIntent(intent);//must store the new intent unless getIntent() will return the old one
        displayIntentData();
    }

    private void displayIntentData(){
        Intent intent = getIntent();
        TextView tv = (TextView)findViewById(R.id.intentData);
        Bundle extras=intent.getExtras();
        if(extras!=null){
            tv.setText("Data received: "+extras.getString("key"));
        }else{
            tv.setText("No extradata received");
        }
    }
}

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        displayIntentData();

        findViewById(R.id.sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
                intent.putExtra("key",((EditText)findViewById(R.id.dataToSend)).getText().toString());
                startActivity(intent);
                //注意我们在这里没有调用finish()方法
            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        displayIntentData();
    }

    private void displayIntentData(){
        Intent intent = getIntent();
        TextView tv = (TextView)findViewById(R.id.intentData);
        Bundle extras=intent.getExtras();
        if(extras!=null){
            tv.setText("Data received: "+extras.getString("key"));
        }else{
            tv.setText("No extradata received");
        }
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myonnewintenttest">

    <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=".SecondActivity"
            android:launchMode="singleTop"
            ></activity>
        <activity
            android:name=".FirstActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstActivity">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/intentData"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

        <EditText
            android:layout_height="wrap_content"
            android:id="@+id/dataToSend"
            android:layout_width="fill_parent"
            android:hint="Data to send"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@id/intentData"
            />

        <Button
            android:text="Send"
            android:id="@+id/sendButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@id/dataToSend"
            />

</androidx.constraintlayout.widget.ConstraintLayout>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onNewIntent详解 的相关文章

  • Activity onNewIntent详解

    onNewIntent 的触发时间 xff1a onNewIntent png 如图所示 xff0c onCreate 和 onNewIntent 不会被同时调用 官方文档 xff1a onNewIntent added in API le
  • android之onNewIntent()用法

    onNewIntent 用法 知识点 xff1a 1 intent的显示和隐式启动 xff1b 2 activity对intent的action的相应 xff1b 3 onNewIntent 和singleTask xff08 栈唯一模式
  • onNewIntent 作用

    当Activity启动模式为singleTask时 如果在栈中已经有该Activity的实例 xff0c 就重用该实例 会调用实例的onNewIntent 不会调用onCreate方法 重用时 xff0c 会让该实例回到栈顶 xff0c 因
  • onNewIntent()的使用

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

    1 onNewIntent Intent intent 是Activity类的方法 它被调用发几种情况如下 lt activity android name 61 34 NewIntentDemo 34 android label 61 3
  • onNewIntent使用遇到的坑

    onCreate是用来创建一个Activity也就是创建一个窗体 xff0c 但一个Activty处于任务栈的顶端 xff0c 若再次调用startActivity去创建它 xff0c 则不会再次创建 若你想利用已有的Acivity去处理别
  • Activity onNewIntent注意事项

    数据上报发现 xff0c onNewIntent 以后 xff0c onResume和onPause可能不会执行 xff0c 直接执行onStop
  • onNewIntent触发的时机

    前提 ActivityA已经启动过 处于当前应用的Activity堆栈中 当ActivityA的LaunchMode为SingleTop时 xff0c 如果ActivityA在栈顶 且现在要再启动ActivityA xff0c 这时会调用o
  • 关于Activity onNewIntent方法的调用时机

    在官方API上的说明如下 http developer android com reference android app Activity html onNewIntent android content Intent protected
  • Android:onNewIntent()触发机制及注意事项

    为什么80 的码农都做不了架构师 xff1f gt gt gt 一 onNewIntent 在 IntentActivity 中重写下列方法 xff1a onCreate onStart onRestart onResume onPause
  • Activity onNewIntent方法的调用时机

    首先看下官方的API说明 xff1a This is called for activities that set launchMode to singleTop in their package or if a client used t
  • [Android] 以singleInstance模式加载的Activity怎么接收以Bundle方式传递过来的参数 By onNewIntent() but not onResum

    问题来自这儿 xff0c Bundle在接收时未更新 xff0c http blog csdn net dadoneo article details 8164058 虽然可以暂时解决问题 xff0c 但并未说到根本原因 xff0c 下面就
  • android:onNewIntent

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

    一个应用的Activity可供多种方式调用启动 xff0c 当多个调用希望只有一个Activity的实例存在 xff0c 并且还要区分是被谁启动或是已经启动被谁拉到前台来的 xff0c 这就需要Activity的onNewIntent In
  • 关于onNewIntent的使用

    摘自 http blog sina com cn s blog 5da93c8f0101hnzx html 当从栈中启动一个已经存在的Activity时 xff0c 系统不会再执行onCreate方法 xff0c 而是执行onNewInte
  • 关于onNewIntent理解

    首先介绍一下Android的四种启动模式 standard 默认的 xff1a 所有的activity实例放在一个task xff08 任务栈 xff09 中 xff0c 遵循先进后出 xff0c 后进先出的规则 singleTop xff
  • Activity中使用onNewIntent方法避免多次实例化同一个Activity

    最近写的项目中有一个搜索 搜索结果 搜索这样一个循环的过程 xff0c 发现了几个问题 xff1a 1 循环导致多次实例化这两个类 xff1b 解决方案 xff1a 在Manifest里面对应activity下面设置启动模式为singleT
  • onNewIntent是个什么东西?

    Android API 很奇怪 xff0c 谷歌没有在官方文档中说明这个方法 天无绝人之路 xff0c 我们在源码中找到了这个方法 In either case when the activity is re launched while
  • onNewIntent 什么时候调用

    protected void onNewIntent Intent intent Since API Level 1 This is called for activities that set launchMode to 34 singl
  • 关于onNewIntent你应该知道的

    一 API描述如下 大概意思是当Activity被设以singleTop模式启动 xff0c 当需要再次响应此Activity启动需求时 xff0c 会复用栈顶的已有Activity xff0c 还会调用onNewIntent方法 并且 x

随机推荐

  • StackDocklet 完美攻略

    爱美之心 xff0c 人皆有之 相信很多朋友和我一样 xff0c 都很喜欢个性化一下自己的计算机 下面两张图是笔者的笔记本电脑的桌面截图 图1 xff1a 以Fan方式显示 图2 xff1a 以Grid方式显示 在上面两张图片中 xff0c
  • [Android] ADT关联源码与API文档 [2013-06-26更新]

    注意 xff1a 进行下述操作前请确保JDK已正确安装并设置环境变量 1 下载最新版ADT 例如 xff1a adt bundle windows x86 64 20130522 zip 官网下载 xff1a http developer
  • 基于管道的进程间数据传输

    实验原理图 xff1a 具体代码如下 xff1a span class token macro property span class token directive keyword include span span class toke
  • Linux-rpm安装MySQL

    目录 一 概述 二 下载 三 安装 四 卸载 五 常用设置 1 修改 root 用户密码 xff08 密码效验规则 xff09 2 创建用户与权限分配 六 可能遇到的问题 一 概述 MySQL是一种关系型数据库 xff08 存放数据库的仓库
  • hugging face 模型库的使用及加载 Bert 预训练模型

    一 hugging face 模型库 Hugging face 是一个专注于 NLP 的公司 xff0c 拥有一个开源的预训练模型库 Transformers xff0c 里面囊括了非常多的模型例如 BERT GPT GPT2 ToBERT
  • 【手把手教程】若依微服务版服务器部署

    若依微服务版服务器部署 xff08 手把手教程 xff09 x1f4d4 笔记介绍 大家好 xff0c 这里是千寻简笔记 xff0c 我是作者星辰 xff0c 笔记内容整理并发布 xff0c 内容有误请指出 xff0c 笔记源码已开源 xf
  • 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEvent(图文)!

    Hi 大家好 xff0c 今天给大家分享一下Android中onInterceptTouchEvent与onTouchEvent 记得楼主以前刚开始找工作的时候 xff0c 被人问了关于Android中事件传递 xff0c 当时还是菜鸟一枚
  • GCC中的pie和fpie选项

    http www lingcc com 2010 01 08 10609 GCC中的pie和fpie选项 Position Independent Executable是Binutils glibc和gcc的一个功能 xff0c 能用来创建
  • Debian中文美化

    对于使用X Window的用户而言 xff0c 拥有一个漂亮的界面是非常重要的 xff0c 只有这样 xff0c 工作的时候才能心情娱悦 xff0c 否则 xff0c 看着大小不一或者是朦朦胧胧的字体 xff0c 恐怕没人会有心情做自己的工
  • ESLint 命令行

    要在Node js 上运行 ESLint xff0c 必须先安装 npm 安装好npm后 xff0c 可以运行下列命令 xff1a npm i g eslint 这表示从npm仓库安装了ESLint CLI 然后继续使用下列命令运行ESLi
  • Ubuntu18.04安装Hexo

    最近突然想搞一个自己的博客 xff0c 于是乎准备在Ubuntu上安装一下Hexo框架 xff0c 然而很不幸的是遇到了重重险阻 xff0c 踩了不少坑 xff0c 最后能艰难爬上来实属不易 xff0c 下面就给大家奉上我的 脚印 xff0
  • 使用PackageManager来获取应用信息

    PackageManager可以获取到一个APP的各项信息 xff0c 如包名 版本号 图标等信息 获取PackageManager对象的方法很简单 xff1a PackageManager packageManager 61 contex
  • activemq 动态消息队列

    前提 xff1a springboot整合activemq时利用注解及相关 配置类是可以直接 使用 activemq消息队列去处理业务逻辑的 xff0c 但是我在生产环境碰到了一个 情况是 真实数据 有几千万 直接用上面说的情况 xff0c
  • Springboot + Spring Security 实现前后端分离登录认证及权限控制

    Springboot 43 Spring Security 实现前后端分离登录认证及权限控制 前言本文主要的功能文章目录文章正文一 准备工作1 统一错误码枚举2 统一json返回体3 返回体构造工具4 pom5 配置文件 二 数据库表设计建
  • JVM内存分配规则

    JVM内存分配规则 堆内存分配 xff1a JDK8 默认的 xff0c 新生代 xff08 Young xff09 与老年代的比例值为 1 2 xff08 该值可以通过参数 XX NewRatio来指定 xff09 新生代分为 Eden和
  • RT-Thread 开发者能力认证考试样题(RCEA)

    V1 0 RT Thread 开发者能力认证考试样题 RCEA xff09 注 xff1a 样题仅为部分题目 第一小卷 单选题 40 题 40 分钟 40 0 分 1 对两个字符 a 和 b 进行初始化 xff1a char a 61 34
  • Collections.max(list) 和 Math.max() 效率比较实验

    前情提要 xff1a 在力扣 559 N叉树的最大深度 中 xff0c 官方题解出现了 Collections max 的用法 xff0c 本人使用的是 Math max 这一古老而强大的函数 为什么官方答案选用的是 list 呢 xff1
  • (原创)Lottie动画使用介绍

    前言 我们都知道 xff0c 安卓里面有三种基本的播放动画方式 xff1a 帧动画 xff0c 属性动画 xff0c 补间动画 今天介绍一种新的实现方式 xff1a Lottie动画 Lottie是爱彼迎开源的一个动画框架 可以支持iOS
  • 【JavaAgent】字节码编程 - 使用Byte-buddy工具实现插件化开发

    简介 假设我们有需求 xff1a 所有的控制器 xff08 Controller xff09 添加耗时 xff0c 对所有的服务 xff08 Service xff09 添加调用信息 xff0c 使用一个agent代理 xff0c 也就是所
  • onNewIntent详解

    记得刚开始学的时候 xff0c 感觉intent还挺简单 xff0c 结果现在总是被intent困扰 xff0c 发现自己太天真了 xff0c 为了弄清楚 xff0c 总结一下 xff0c 一 onNewIntent 老规矩 xff0c 先