startActivityForResult的坑

startActivityForResult的坑android中经常会遇到从当前的Activity跳转到另外一个Activity的情况,通常情况下我们会直接选择用startActivity或者startActivityForResult。如果你对这两个方法还不知道的话可以去https://www.cnblogs.com/fuck1/p/5456337.html看看。本文不会告诉你怎么使用这个方法,而是会说说笔者自己遇到的问题以及解决办法。事情…

大家好,又见面了,我是你们的朋友全栈君。

android中经常会遇到从当前的Activity跳转到另外一个Activity的情况,通常情况下我们会直接选择用startActivity或者startActivityForResult。如果你对这两个方法还不知道的话可以去https://www.cnblogs.com/fuck1/p/5456337.html看看。本文不会告诉你怎么使用这个方法,而是会说说笔者自己遇到的问题以及解决办法。
事情的起因是我在项目中遇到这样一个问题就是要求从下一个界面传数据回来,当时第一反应是用startActivityForResult解决,当我把代码敲完过后一测试,我擦咧,结果没回来。我以为是我代码写错了(这段代码很简单怎么可能会错)最后找到答案是因为Activity的启动模式被这只成了singleTask。好吧,这个有点坑自己了。于是我就自己测试了四种不同模式下启动模式对该方法的影响,(如果你对Activity的四种启动模式还不是很了解可以到https://blog.csdn.net/qq994467433/article/details/83350698看看)结果还真的挺有意思的。话不多说上代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button standardButton, singleTopButton, singleTaskButton, singleInstanceButton;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        standardButton = findViewById(R.id.standard_activity);
        standardButton.setOnClickListener(this);
        singleTopButton = findViewById(R.id.single_top_activity);
        singleTopButton.setOnClickListener(this);
        singleTaskButton = findViewById(R.id.single_task_activity);
        singleTaskButton.setOnClickListener(this);
        singleInstanceButton = findViewById(R.id.single_instance_activity);
        singleInstanceButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.standard_activity:
                Intent firstIntent = new Intent(MainActivity.this, StandardActivity.class);
                startActivityForResult(firstIntent, 1);
                break;
            case R.id.single_top_activity:
                Intent secondIntent = new Intent(MainActivity.this, SingleTopActivity.class);
                startActivityForResult(secondIntent, 2);
                break;
            case R.id.single_task_activity:
                Intent thirdIntent = new Intent(MainActivity.this, SingleTaskActivity.class);
                startActivityForResult(thirdIntent, 3);
                break;
            case R.id.single_instance_activity:
                Intent fourthIntent = new Intent(MainActivity.this, SingleInstanceActivity.class);
                startActivityForResult(fourthIntent, 4);
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK){
                   int standardActivityData = data.getIntExtra("StandardActivity",0);
                    Log.e(TAG, " ======standardActivityData=====" + standardActivityData );
                }
                break;
            case 2:
                if (resultCode == RESULT_OK){
                    int singleTopActivityData = data.getIntExtra("SingleTopActivity",0);
                    Log.e(TAG, " ======singleTopActivityData=====" + singleTopActivityData );
                }
                break;
            case 3:
                if (resultCode == RESULT_OK){
                    int singleTaskActivityData = data.getIntExtra("SingleTaskActivity",0);
                    Log.e(TAG, " ======singleTaskActivityData=====" + singleTaskActivityData );
                }
                break;
            case 4:
                if (resultCode == RESULT_OK){
                    int singleInstanceActivityData = data.getIntExtra("SingleInstanceActivity",0);
                    Log.e(TAG, " ======singleInstanceActivityData=====" + singleInstanceActivityData );
                }
                break;
        }
    }
}

这里我在MainActivity里面放置了四个按钮用于启动四种不同模式下的Activity并在每个对应的Activity里面放置按钮来回传结果。并在onActivityResult方法中分别获取来自不同的Activity回传的数据。其中默认模式下的Activity代码如下

public class StandardActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_standard);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("StandardActivity",111111);
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}

其余Activity的类似。我们分别来看看结果吧。
1.standard模式下的数据

10-25 18:52:20.788 10014-10014/com.example.gzw.activitydemo E/MainActivity:  ======standardActivityData=====111111

可以看到这时候的数据是有传回来的。
2.singTop模式下的数据

10-25 18:53:57.838 10014-10014/com.example.gzw.activitydemo E/MainActivity:  ======singleTopActivityData=====222222

是的也有数据产生
3.singleInstance模式下
这个就厉害了,没有数据传回来。这个原理是什么我也不是很清楚,先当结论记住吧!
4.singleTask模式下
由于singleTask模式有可能会涉及到栈的变化,所以我分别测试了下。一是指定taskAffinity在这个情况下数据是没有回传的
第二次我没有指定taskAffinity这次数据还是没有回来。。。
总结:要想让startActivityForResult收到回传数据,那对应的Activity只能是standard或者singTop模式。
最后Demo的源码下载地址:https://download.csdn.net/download/qq994467433/10744616

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157469.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 4G LTE Advanced_LTE百科

    4G LTE Advanced_LTE百科IS-95   IS-95是由高通公司发起的第一个基于CDMA数字蜂窝标准。IS全称为InterimStandard,即暂时标准,基于IS-95的第一个品牌是cdmaOne。IS-95也叫TIA-EIA-95。它是一个使用CDMA的2G移动通信标准,一个数据无线电多接入方案,其用来发送声音,数据和在无线电话和蜂窝站点间发信号数据(如被拨电话号码)。IS-95及其相关标准是最早商用的

  • navicat11.0.18激活码【2021免费激活】

    (navicat11.0.18激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

  • zookeeper入门教程_ZooKeeper的事件机制原理

    zookeeper入门教程_ZooKeeper的事件机制原理zookeeperwatcher架构zookeeper 配置中心分布式ID分布式锁集群搭建数据一致性协议:zab协议Zookeeper Leader选举Observer角色及其配置watcher架构客户端首先将Watcher注册到服务器,同时将Watch对象保存到客户端的Watch管理器中。当Zookeeper服务器监听到的数据发生变化时,服务器会通知客户端,接着客户端的Watch管理器会触发相关的Watcher来回调响应处理逻辑,从而完成整体的数据发布/订阅流程。javaAPIJava

  • 超声波倒车雷达原理[通俗易懂]

    超声波倒车雷达原理[通俗易懂]汽车倒车中使用的倒车雷达防撞报警系统即是俗称的倒车雷达,在汽车倒车时,超声波倒车雷采用超声波测距原理探测汽车尾部离障碍物的距离,是汽车泊车辅助装置。倒车时,当汽车尾部探测到障碍物时,倒车雷达就实时动态显示离障碍物的距离,达到设定的安全警告值时,倒车雷达立即发出报警声,以警示驾驶员,辅助驾驶员安全倒车。现在大多数都配置有倒车雷达。倒车雷达电路种类较多,本文介绍基于单片机控制的倒车雷达系统,该系统采用…

  • win10安装anaconda3、pycharm和pytorch教程

    win10安装anaconda3、pycharm和pytorch教程前言博主研究生生涯准备用大一的旧电脑刚两年,于是乎在虚拟机centos环境中安装python环境和pycharm工作时特别卡。于是想尝试在windows下安装anaconda和PyCharm,这样软件运行或许能流畅些。本文基于2019年发行的anaconda3版本和PyCharm对安装过程中的问题进行记录。anaconda的安装官网下载anaconda我下载的版本为:双击安装注意…

  • 如何通过异业联盟会员体系赋能实体商家?完善消费者的会员权益[通俗易懂]

    如何通过异业联盟会员体系赋能实体商家?完善消费者的会员权益[通俗易懂]2015年房地产行业进入白银时代,市场竞争异常剧烈,目前有万达、大禹加州湾、宏泰第一城等诸多项目,那类似的行业怎样在这激烈的市场竞争中立于不败之地?怎样才能占据更多的市场份额?怎样才能以更少的投入取得更大的回报?需要解决以上种种问题难吗?也未必难,今天向大家提出更好的方案和方法:异业联盟。异业联盟的好处1、对企业来讲可以让客户资源从10变成100甚至1000这也是资源整合,资源营销的核心。2、减少广告费用的投入,而把一部分广告的费用转嫁给消费者,为消费者省钱,符合“客

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号