()Android中的Activity之间的数据传输

跳转

我们永远不可能只在一个界面操作所有流程,因此不可避免的需要页面之间的跳转,这里主要介绍两种跳转方式,即显式传递和隐式传递,只需在onClick方法中添加如下

                //显式传递1
                Intent intent = new Intent(AActivity.this, BActivity.class);         
               startActivity(intent);
                //显式传递2
                Intent intent1 = new Intent();
                intent1.setClass(AActivity.this,BActivity.class);
                startActivity(intent);
                //隐式传递1
                Intent intent2 = new Intent();
                intent2.setAction("android.intent.action.BActivity");
                 startActivity(intent2);
            }
        });
    }

这里需要注意是,隐式传递需要在AndroidManifest中添加intent-filter标签,其中的action中的内容是隐式传递中setAction需要填写的值,同时也修改category标签值。这里为了直观看出界面的切换,故设置了lebel标签值。

<activity android:name=".jump.BActivity"
            android:label="我是B界面">
        <intent-filter>
            <action android:name="android.intent.action.BActivity" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
            </activity>
        <activity android:name=".jump.AActivity"
            android:label="我是A界面"/>

数据单向传输

通过上面的步骤,我们已经实现界面之间的切换,同时我们需要实现数据的传输,这里采用第一种方式跳转,在跳转中添加bundle对象,通过向bundle对象添加值,即可实现要求。

Intent intent = new Intent(AActivity.this, BActivity.class);

                Bundle bundle = new Bundle();
                bundle.putString("key", "隆哥就是帅");
                bundle.putInt("num", 123);
                intent.putExtras(bundle);
               startActivity(intent);

数据已经传送,那怎么接收呢?同样我们需要一个bundle对象用来接收。

        Bundle bundle = getIntent().getExtras();
        String key = bundle.getString("key")
        int num = bundle.getInt("num"));
        

这样便实现了数据的单向传输。

数据回传

当我们实现了A-》B的数据传输,如果我们又想通过B-》A,我们是否可以通过B直接也startActivity(intent)来实现呢?这是不可以的,这样实现的就不是回传而是跳转。
那要怎么实现呢 ?
现在B已经成了发送方我们需要添加如下的代码

                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("title","我又回来啦!");
                intent.putExtras(bundle1);
                setResult(RESULT_OK,intent);
                finish();

在接收方A

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    
    
        super.onActivityResult(requestCode, resultCode, data);
       Toast.makeText(AActivity.this,data.getExtras().getString("title"),Toast.LENGTH_LONG).show();
    }

还有重要的一点就是需要 startActivity(intent);变为
startActivityForResult(intent, 0);
这里介绍一下这两个方法,由入口Activity启动其他Activity有两种方法:startActivity(Intent intent)与startActivityForResult(Intent intent,int requestCode)假设从ActivityOne启动ActivityTwo。

1
startActivity(Intent intent):只启动其他Activity。
使用:首先需在AndroidManiFest中配置`

Java代码:

Intent intent=new Intent(ActivityOne.this,ActivityTwo.class);
                        startActivity(intent);

2

startActivityForResult(Intent intent,int requestCode):以指定的请求码(requestCode)启动Activity,而且程序将会获取新启动的Activity返回的结果(通过onActivityResult(int requestCode, int resultCode, Intent intent)方法获取
requestCode:请求码,该参数代表了启动ActivityTwo的请求码。这个请求码的值由开发者根据业务自行设置,用于标识请求来源。(ActivityOne中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Acticity(ActivityTwo,ActivityThree…),当这些新打开的Activity关闭后,系统都将回调ActivityOne中的onActivityResult()方法,为了知道这个方法是由哪个请求的结果所触发,我们就可以用请求码进行判断)
resultCode:结果码,在ActivityTwo中(ActicityTwo.this.setResult(int resultCode,Intent intnt))设置结果码,用于判别返回的数据来自哪个Acticity。
intent:可以通过这个intent获取ActivityTwo所返回的结果。(因为该intent是ActivityOne中对应的Intent,但是此时通过ActivityTwo绑定了数据))。
运行结果如图所示:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/q54188p/article/details/112199491