Activity之间的通信

来源:互联网 发布:javascript基础单词 编辑:程序博客网 时间:2024/04/25 21:51

 Activity之间的通信方式有两种,startActivity,startActivityForResult();

其中,startActivity()仅仅是跳转到目标界面,并且如果一个主Activity跳转到多个子Activity,数据的携带与传递,要用

startActivityForResult().

主要用到三个方法:startActivityForResult(),onActivityResult(),setResult().

先看看要实现的效果

     

思路

主Activity

@Override  protected void onCreate() {      initView();//  UI      initData();// 逻辑}

private void initData() { // 逻辑    confirmCode();//判断获取个人资料的code --- 获取到个人资料,显示在界面上    click();}private void click() {    tv_edit.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) { //向子Activity传递数据            Intent intent = new Intent();            intent.setClass(GetPersonalInfoActivity2.this, EditPersonalInfoActivity2.class);            Bundle personInfoBundle = new Bundle();            personInfoBundle.putSerializable("personInfo",infoBean);            intent.putExtras(personInfoBundle);            startActivityForResult(intent,1);        }    });
protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);      switch (resultCode){        case 2:            if(data!=null) { //接受子Activity回传过来的数据                Bundle bundle = data.getExtras();                PersonalInfoBean.DataBean refreshInfo = (PersonalInfoBean.DataBean) bundle.getSerializable("refreshInfo");                //这是现实修改后的信息                tv_name.setText(refreshInfo.getUSER_NAME());//保存出错 就是提交不成功的意思                tv_gender.setText(refreshInfo.getSEX());                //tv_gender.setText(refreshInfo.getSEX().equals("0")?"":"");                tv_birth.setText(refreshInfo.getBIRTHDAY());                tv_tel.setText(refreshInfo.getMOBIL_NO());                tv_qq.setText(refreshInfo.getOICQ_NO());                tv_email.setText(refreshInfo.getEMAIL());                tv_work_tel.setText(refreshInfo.getTEL_NO_DEPT());                tv_home_tel.setText(refreshInfo.getTEL_NO_HOME());                tv_home_addr.setText(refreshInfo.getADD_HOME());            }
子Activity

private void initData() {    getAndSetData(); //获取从子Activity传递过来的信息,并把它显示在子Activity上面    click();}
private void getAndSetData() {    Bundle personInfoBundle = getIntent().getExtras();    PersonalInfoBean.DataBean info = (PersonalInfoBean.DataBean) personInfoBundle.getSerializable("personInfo");    //getData    user_id = CPGROUPOA.getApplication().getUSER_ID();    USER_NAME = info.getUSER_NAME();       //setData    et_name.setText(USER_NAME);}
private void click() {    tv_keep.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            getData();            getDataFromServer();//修改个人信息,并传回后台数据库            overridePendingTransition(0, R.anim.slide_out_right);        }    });
private void getData() {    USER_NAME = et_name.getText().toString();}
private void getDataFromServer() {   ........        public void onResponse(EditPerInfoBean response) {                       switch (response.getCode()) {                case "2251"://                    //从服务器返回的数据在OnResponse里面                    changeInfo();//在服务器返回成功信息之后在做其他动作
private void changeInfo() {    Bundle refreshInfobundle = new Bundle();    PersonalInfoBean.DataBean refreshInfo = new PersonalInfoBean.DataBean();    //开始组装成功之后的信息 修改的    USER_NAME = refreshInfo.setUSER_NAME(et_name.getText().toString());    ... ... ... ... ... ... ... ...     //使用bundle运载信息(对象)    refreshInfobundle.putSerializable("refreshInfo", refreshInfo);    Intent intent = new Intent();    intent.putExtras(refreshInfobundle);    setResult(2, intent);}
注意:

两个错误:

1 子Activity中,getData()直接写在initData()里面,这样做,修改的数据是不会显示在主Activity中的,因为点击保存的时候,

根本没有走getData()和getDataFromServer()方法,只走的页面跳转的方法。所以要确保该走的逻辑,在自己的操作中,都走

一遍。把getData()和getDataFromServer()这两个方法写在点击事件里面。

private void initData() {    getAndSetData(); //获取从子Activity传递过来的信息,并把它显示在子Activity上面    getData();//修改个人信息    getDataFromServer();//把修改后的信息传回后台数据库    click();//点击保存按钮,跳转回前一个界面}
2 在主Activity里点击修改按钮,要么不跳转到子Activity,要么跳转到子Activity很快就自动跳转回主Activity

private void initData() {    getAndSetData(); //获取从子Activity传递过来的信息,并把它显示在子Activity上面    getDataFromServer();    click();}
private void getDataFromServer() {    .......        public void onResponse(EditPerInfoBean response) {                    switch (response.getCode()) {                case "2251"://                    changeInfo();//应该在服务器返回成功信息之后在做其他动作                    finish();// finish()                    break;
原因:按照逻辑顺序,先走getDataFromServer(),再走click();而getDataFromServer里面有finish(),直接就把这个Activity给finish()了,所以不走click()方法。

这两个错误,错的逻辑都是一样的。都是因为逻辑的原因,有的方法没走到。在写程序的时候,要注意方法执行的顺序。确保每个方法都走到。