Intent startActivityForResult 启动 与 Activity启动模式

话不多说,上代码。

AndroidManifest 中如下图:

这里写图片描述

两个Activity,启动模式都是默认的标准模式

MainActivity 中如下图:

这里写图片描述

在MainActivity的onCreate 方法中直接启动 FristActivity,
在onStop中打印Log 证明已经跳转,使得MainActivity处于不可见状态,
在onActivityResult中打印Log证明能执行到该方法。

FirstActivity中如下图:

这里写图片描述

在FirstActivity的onCreate 方法中打印Log 证明已经成功启动,
在onDestroy 中打印Log 证明已经返回数据。

下面看看launchMode=”standard”的结果

这里写图片描述

可以看到 已经获取到正确的数据了。

下面我们只需要对AndroidManifest 文件中的launchMode 进行更改就好了。
将MainActivity的launchMode 依singleTop、singleTask、singleInstance的顺序进行变更,得到下面的图:
launchMode=”singleTop”
这里写图片描述

launchMode=”singleTask”
这里写图片描述

launchMode=”singleInstance”
这里写图片描述

从上面可以看出MainActivity的launchMode 设置为 standard、singleTop、singleTask都可以得到FirstActivity 的数据,singleInstance 得不到数据。

为什么singleInstance 得不到数据?
  • standard:standard是Activity 默认的启动模式,在不进行显式指定的情况下,所有Activity 都会 自动使用这种启动模式,每启动一个Activity 都会去创建一个Activity 的实例压入栈中。

  • singleTop: 当要启动的Activity 位于栈顶的时候,不再创建Activity 的实例,直接复用该实例,否则创建新的实例压入栈中。

  • singleTask: 当要启动的Activity 位于栈中的时候,不再创建Activity 的实例,把位于该Activity 实例之上的所有Activity 实例进行出栈操作,否则创建新的实例压入栈中。

  • singleInstance : 使用singleInstance 模式的Activity 会被另外分配一个栈。

    从上面可以看出standard、singleTop、singleTask 模式下的MainActivity 和standard 模式下的FirstActivity 处于同一个栈内,所以能获得到数据。并且standard、singleTop 不会销毁位于其上的Activity 的实例,所以不论MainActivity 和 FirstActivity 使用standard、singleTop如何搭配都不会出问题,如下图:

这里写图片描述

MainActivity 和 FirstActivity 使用singleTop、singleTask 搭配要小心,如下图:

这里写图片描述

MainActivity 和 FirstActivity 中至少有一个的启动模式设置为 singleInstance 就不能正确获取数据(应该说 就获取不到数据 更准确一些),

才疏学浅,如有不对,欢迎指正!!!

email:704084109@qq.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
startActivitystartActivityForResult是Android开发中常用的两个方法,它们的区别如下[^1]: 1. startActivity( ):这个方法用于启动另一个Activity,它不会自动返回到原来的Activity。如果需要返回到原来的页面,必须再次使用startActivity( )来启动原来的Activity。 2. startActivityForResult( ):这个方法也用于启动另一个Activity,但它可以在启动Activity结束后返回结果给原来的Activity。在启动Activity时,可以传递一个请求码(requestCode),当启动Activity结束后,可以通过onActivityResult( )方法获取返回的结果。 下面是一个示例代码,演示了startActivitystartActivityForResult的使用: ```java // 启动另一个Activity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); // 启动另一个Activity并获取返回结果 Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); // 在启动Activity中设置返回结果 Intent intent = new Intent(); intent.putExtra("result", "Hello World"); setResult(RESULT_OK, intent); finish(); // 在原来的Activity中获取返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); // 处理返回结果 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值