学而实习之 不亦乐乎

Android 中的 onNewIntent() 函数的用法

2023-10-03 19:09:36

Android 开发中遇到这样一个情况,从一个 Activity A 跳转到另一个 Activity B(Activity A并没有被finish掉),B处理完后,将一些值通过 Intent 重新传回给 Activity A。在这里笔者并没有使用 startActivityforResult 函数,而是简单地使用startActivity 函数。并且 Activity A 在Androidmanifest.xml文件中将启动模式设置为 “singleTask”。但是,再次回到 Activity A 时使用 Intent 传过来的值时无法接收到。这是因为再次回到 Activity A 时,不会执行 onCreate() 函数。

先分析一下这个过程

第一次创建Activity A时,执行的逻辑顺序是:onCreate() --->onStart()--->onResume()

而如果使用“singleTask”模式第二次启动 Activity A,且 Activity A 处于任务栈的顶端,则执行的逻辑顺序是:

onNewIntent() ---> onRestart() --->onStart() ---> onResume()

通过Intent来再次启动A时,由于系统已经存在一个实例,喜用就会将请求发送到这个实例上。此时,系统不会再调用通常情况下处理请求数据的 onCreate() 方法,而是调用 onNewIntent() 方法。

因此,可以在 onCreate() 函数和 onNewIntent() 方法中分别对数据进行处理:

@Override
onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   Intent intent = getIntent();
   ......
}

@Override
onNewIntent(Intent intent) {
   super.onNewIntent(intent);
   setIntent(intent);  
   Intent intent = getIntent();
   ......
}

当然,你也可以把二者相同的处理放到 onResume() 函数中,避免重复同样的代码。