Android-页面间数据回调方式StartActivityFo

2020-03-26  本文已影响0人  晴天ccc

业务场景:

  • 例如我们从控制器A跳转到B执行各种业务,执行完毕之后将完成的数据一并带上返回到A并进行处理。

解决方案

StartActivityForResult

需要三个关键方法:startActivityForResultsetResultonActivityResult

1、startActivityForResult控制器A跳转到B的时候使用,附带上独特的请求码。

// Intent对象
// requestCode 请求码
startActivityForResult(Intent intent, int requestCode);

2、setResult控制器B/C等返回A时候使用,把回调数据带入其中。

// resultCode 回调码
// Intent 带返回数据的Intent对象
setResult(int resultCode, Intent data)

3、onActivityResult控制器A中使用,接受从B/C等返回的数据并做业务区分。

// requestCode 请求码
// resultCode 回调码
// Intent 带返回数据的Intent对象
onActivityResult(int requestCode, int resultCode, Intent data)

下面是具体代码使用案例:


public class AActivity extends AppCompatActivity {

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                //来自resultCode==1的请求,作相应业务处理
                 String resultData = data.getExtras().getString("b_data");
            case 2:
                //来自resultCode==2的请求,作相应业务处理
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView oneBtn = findViewById(R.id.oneBtn);
        oneBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // resultCode可以根据业务需求自己编号
                Intent intent = new Intent(AActivity.this, BActivity.class);
                startActivityForResult(intent, 1);
            }
        });
    }
}

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView twoBtn = findViewById(R.id.twoBtn);
        twoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                //把需要返回的数据存放在Intent
                intent.putExtra("b_data", "这是B控制器的回调数据!");
                setResult(1, intent);
                finish();
            }
        });
    }
}

接口回调

在B控制器定义一个接口对象,并在需要回调的时候执行,用法类似iOS的Block。

    // 定义一个接口
    private OnItemClickListener onClickListener;

    public interface OnItemClickListener {

        void onItemClick(String keyStr);
    }

    public void setOnClickListener(OnItemClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }
 
   onClickListener.onItemClick("hello world");
上一篇 下一篇

猜你喜欢

热点阅读