Activity优雅的传参

2,977 阅读2分钟

大家一定为activity之间传参困扰过。正常的方式是通过intent,一个个的去put值,但是还需要定义很多key值。假如两个actiivty分别是MainActivity(传参方)和SecondActivity(接收方)。传参方需要一个个的put,接收方需要一个个的get,而且需要一个个的赋值给成员变量。太麻烦!而且少传了参数也不方便发现。

有人会说可以传递一个序列化的对象。没错,我就是用这种方式,直不过写成了固定格式。

接下来截图说明:

1在SecondActivity中定义需要外界传递的对象,名字固定为IntentBean。通过构造方法规定必传参数



2在SecondActivity中定义打开方法供外部调用。


3 在MainActivity中打开SecondActivity


4


如果要是startActivityForResult呢?也有简便方法。

1

2


3


4



最后上传这两个activity的代码

package com.liuchuanzheng.testjumpactivity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = findViewById(R.id.btn1);
        Button button2 = findViewById(R.id.btn2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SecondActivity.IntentBean intentBean = new SecondActivity.IntentBean("",
                        10,"");
                SecondActivity.startActivity(MainActivity.this,intentBean);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SecondActivity.IntentBean intentBean = new SecondActivity.IntentBean("",
                        10,"");
                SecondActivity.startActivityForResult(MainActivity.this,
                        intentBean, new SecondActivity.ResultListener() {
                    @Override
                    public void onResult(SecondActivity.ResultBean resultBean) {
                        Toast.makeText(MainActivity.this,
                                "收到了结果"+resultBean.name,Toast.LENGTH_LONG).show();
                    }
                });
            }
        });


    }
}

package com.liuchuanzheng.testjumpactivity;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.Serializable;

public class SecondActivity extends AppCompatActivity {
    private static ResultListener resultListener;
    //默认创建一个,保证取值不null。所以里边的默认值很重要
    public IntentBean intentBean = new IntentBean();

    /**
     * 规定参数的开启方法
     * @param context
     * @param intentBean
     */
    public static void startActivity(Context context,IntentBean intentBean){
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra("IntentBean", intentBean);
        context.startActivity(intent);
    }

    public static void startActivityForResult(Context context,IntentBean intentBean,
                                              ResultListener resultListener){
        SecondActivity.resultListener = resultListener;
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra("IntentBean", intentBean);
        context.startActivity(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        parseIntent();
        Button button1 = findViewById(R.id.btn1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
                if (resultListener != null){
                    ResultBean resultBean = new ResultBean();
                    resultBean.name = "刘传政";
                    resultListener.onResult(resultBean);
                    resultListener = null;
                }
            }
        });
    }
    private void parseIntent() {
        //获取参数
        IntentBean bean = (IntentBean) getIntent().getSerializableExtra("IntentBean");
        if (bean != null) {
            intentBean = bean;


        }
        Log.i("liuchuanzheng",intentBean.toString());
    }
    public static class IntentBean implements Serializable {
        String name = "";
        int age;
        String address = "";
        Class fromCls = Object.class;

        /**
         * 此无参构造方法一般不用,只是一个初次使用者想尽快不考虑参数的情况下看一下此activity效果
         * 时,临时用一下。
         */
        public IntentBean() {
        }

        /**
         * 这里根据需要,定义自己的必传参数构造方法。
         * @param name
         * @param age
         * @param address 来自那个类。如果此activity会根据不同的来源有不同的显示或处理。
         */
        public IntentBean(String name, int age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }

        @Override
        public String toString() {
            return "IntentBean{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", address='" + address + '\'' +
                    ", fromCls=" + fromCls +
                    '}';
        }
    }
    public interface ResultListener{
        void onResult(ResultBean resultBean);
    }
    public class ResultBean {
        public String name;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}