美文网首页Android开发经验谈Android开发Android开发
startActivityForResult的简单使用总结

startActivityForResult的简单使用总结

作者: 程序猿男神 | 来源:发表于2019-01-14 13:43 被阅读14次

    文/程序员男神

    前言

    最近在整理需求的时候,发现页面之间的数据传输这块是个可以总结的知识点。一般情况下页面之间的数据传输可以有以下几种思路:1、通过startActivityForResult方法进行数据传输;2、通过广播的形式传输;2、通过startActivityForResult方法进行数据传输;3、可以通过接口的调用来传输数据;4、通过存储介质来分享数据;5、通过EventBus进行页面之间的传输;这边总结一下第一种的简单使用。

    2019全明星

    一、使用场景

    一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Activity处理。这种带数据的意图跳转需要使用activity的onActivityResult()方法。

    (1)startActivityForResult(Intent intent, int requestCode);

    第一个参数:一个Intent对象,用于携带将跳转至下一个界面中使用的数据,使用putExtra(A,B)方法,此处存储的数据类型特别多,基本类型全部支持。

    第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回,用来标识目标activity。

    与下面的resultCode功能一致,感觉Android就是为了保证数据的严格一致性特地设置了两把锁,来保证数据的发送,目的地的严格一致性。

    (2)onActivityResult(int requestCode, int resultCode, Intent data)

    第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。

    第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。

    第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据,

    (3)setResult(int resultCode, Intent data)

    在意图跳转的目的地界面调用这个方法把Activity想要返回的数据返回到主Activity,

    第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED该值默认为0 , RESULT_OK该值默认为-1。

    第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。

    二、使用步骤

    1、startActivityForResult跳转到目标activity。
    FirstActivity 页面一个Button,一个Text View。点击Button跳转至SecondActivity,关闭SecondActivity,把SecondActivity的数据传到FirstActivity,显示在TextView上面。

    /**
     * 描述: 第一个activity
     * 作者|时间: djj on 2019/1/14 10:11
     * 博客地址: http://www.jianshu.com/u/dfbde65a03fc
     */
    public class FirstActivity extends AppCompatActivity {
    
        private Button mBtnStart;
        private TextView mTvShow;
        private final static int REQUEST_CODE = 1; // 返回的结果码
    
        /**
         * 为了得到传回的数据,必须在前面的Activity中(指FirstActivity类)重写onActivityResult方法
         *
         * @param requestCode 请求码,即调用startActivityForResult()传递过去的值
         * @param resultCode  返回码,结果码用于标识返回数据来自哪个新Activity
         * @param data        更新后的数据
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                if (requestCode == REQUEST_CODE) {
                    mTvShow.setText(data.getExtras().getString("second") + "requestCode:" + requestCode + "resultCode:" + resultCode);
                }
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_first);
    
            mBtnStart = findViewById(R.id.btn_start);
            mTvShow = findViewById(R.id.tv_shows);
    
            mBtnStart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //得到新打开Activity关闭后返回的数据
                    //第二个参数为请求码,可以根据业务需求自己编号
                    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                    startActivityForResult(intent, REQUEST_CODE);
                }
            });
        }
    }
    

    activity_first.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="打开Second" />
    
        <TextView
            android:id="@+id/tv_shows"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp" />
    </LinearLayout>
    

    第二个activity的代码:

    /**
     * 描述: 第二个activity
     * 作者|时间: djj on 2019/1/14 10:16
     * 博客地址: http://www.jianshu.com/u/dfbde65a03fc
     */
    public class SecondActivity extends AppCompatActivity {
    
        private Button mBtnColse;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            mBtnColse = findViewById(R.id.btn_close);
    
            mBtnColse.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    //把需要返回的数据存放在intent
                    intent.putExtra("second", "我是第二页的信息!");
                    //设置返回数据
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });
        }
    }
    

    activity_second.xml的文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_close"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="关闭Sencond" />
    
    </LinearLayout>
    

    通过data.getExtras().getString("second")我们可以获取Text View的值,也可以看到requestCode、resultCode的数值。

    总结
    文章虽然简单,自己写一遍还是有点收获,通过自己的总结,基础也可以打的更加牢固把!

    相关文章

      网友评论

        本文标题:startActivityForResult的简单使用总结

        本文链接:https://www.haomeiwen.com/subject/nidddqtx.html