Activity跳转的数据交换问题---学习笔记

标签: activity 数据 交换 | 发表时间:2015-07-31 10:14 | 作者:u013991521
出处:http://blog.csdn.net

以解决这两个问题为例:



问题一:有两个Activity(A和B),从A跳转到B,同时B需要A中的数据:

效果图:
这里写图片描述

代码:
MainActivity类:

  package com.test.bundletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;

public class MainActivity extends Activity {
    private EditText name_edt;
    private EditText age_edt;
    private RadioButton sex_rbtn;
    private Button submit;

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

        submit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String name = name_edt.getText().toString();
                String age = age_edt.getText().toString();
                String sex = sex_rbtn.isChecked()?"男":"女";
                Student stu = new Student(name, age, sex);
                Intent intent = new Intent(MainActivity.this,SecondActicity.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("student",  stu);
                intent.putExtras(bundle);
                //启动intent对应的Activity
                startActivity(intent);
            }
        });
    }

    private void initView() {
        name_edt = (EditText) findViewById(R.id.id_edt_name);
        age_edt = (EditText) findViewById(R.id.id_edt_age);
        sex_rbtn = (RadioButton) findViewById(R.id.id_sex_male);
        submit = (Button) findViewById(R.id.id_btn_submit);
    }

}

SecondActivity类:

  package com.test.bundletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActicity extends Activity {
    private TextView tv_name;
    private TextView tv_age;
    private TextView tv_sex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        initView();
        //获取启动该Result的Intent
        Intent intent = getIntent();
        //直接通过Intent取出他所携带的Bundle数据包中的数据
        Student student = (Student) intent.getSerializableExtra("student");

        tv_name.setText(student.getName());
        tv_age.setText(student.getAge());
        tv_sex.setText(student.getSex());

    }

    private void initView() {
        tv_name = (TextView) findViewById(R.id.id_name);
        tv_age = (TextView) findViewById(R.id.id_age);
        tv_sex = (TextView) findViewById(R.id.id_sex);
    }

}

上边的实例中就是在MainActivity类中发送数据,然后发送到SecondActivity类,由SecondActivity处理接收到的数据并显示出来。

收获
当A携带数据发送给B的时候,然后由B接收处理数据时:
可以使用Intent中携带Bundle中的数据的方式来处理。



问题二:同样是A和B两个Activity,A跳转到B后,当B关闭时将B中的数据回传到A中:

效果图:
这里写图片描述
代码:
MainActivity类:

  package com.test.activitytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    private Button btn_get;
    private TextView tv_city;

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

        btn_get = (Button) findViewById(R.id.id_btn_getCity);
        tv_city = (TextView) findViewById(R.id.id_tv_city);
        btn_get.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                // 启动指定Activity并等待返回的结果,其中0是请求码,用于标识该请求
                startActivityForResult(intent, 0);
            }
        });
    }

    @Override
    // 获取指定的Activity返回的结果
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        // 当requestCode,resultCode同时为0时,也就是处理待定的结果
        if (requestCode == 0 && resultCode == 0) {
            // 取出Intent里的Extras数据
            Bundle bundle = intent.getExtras();
            //取出Bundle中的数据
            String result = bundle.getString("city");
            tv_city.setText(result);
        }
    }

}

SecondActivity类:

  package com.test.activitytest;

import android.app.ExpandableListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SecondActivity extends ExpandableListActivity {

    //定义省份数组
    private String[] provinces = new String[]{
        "山东","湖南","广东"  
    };
    private String[][] cities = new String[][] {
            {"东营","济南","青岛"},
            {"衡阳","长沙","岳阳"},
            {"广州","深圳","中山"}
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ExpandableListAdapter adapter = new BaseExpandableListAdapter() {

            @Override

            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }

            @Override
            public boolean hasStableIds() {
                return true;
            }

            @Override
            //该方法决定每个组选项的外观
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
                LinearLayout ll = new LinearLayout(SecondActivity.this);
                ll.setOrientation(0);
                ImageView logo = new ImageView(SecondActivity.this);
                ll.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);

                return ll;
            }

            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }

            @Override
            public int getGroupCount() {
                return provinces.length;
            }

            @Override
            //获取指定组位置处的组数据
            public Object getGroup(int groupPosition) {
                return provinces[groupPosition];
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                return cities[groupPosition].length;
            }

            @Override
            //该方法决定每个子选项的外观
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition).toString());

                return textView;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }

            @Override
            //获取指定组位置,指定子列表项处的子列表项数据
            public Object getChild(int groupPosition, int childPosition) {
                return cities[groupPosition][childPosition];
            }
        };
        //设置该窗口显示列表
        setListAdapter(adapter);
        getExpandableListView().setOnChildClickListener(new OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                //获取启动该Activity之前的Activity对应的Intent
                Intent intent = getIntent();
                intent.putExtra("city", cities[groupPosition][childPosition]);
                //设置该Activity的结果码,并设置结束之后退回的Activity
                SecondActivity.this.setResult(0,intent);
                //结束该Activity
                SecondActivity.this.finish();


                return false;
            }
        });

    }

    private TextView getTextView(){
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);
        TextView textView = new TextView(SecondActivity.this);
        textView.setLayoutParams(lp);
        textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
        textView.setPadding(36, 0, 0, 0);
        textView.setTextSize(20);
        return textView;
    }

}

上边的实例就是从第一个Activity跳转到第二个Activity,然后将第二个Activity中的数据回传给第一个Activity,并在第一个Activity中显示出回传过来的数据。

收获:

(1)有两个Activity(A和B),当A启用指定B,而且期望获取指定的B返回的结果的时候,A可以使用startActivityForResult(Intent intent,int requestCode)方法来启用指定的B。
(2)为了获取B返回的结果,需要使用下面的方法:
1. A需要重写onActivityResult(int requestCode,int resultCode,Intent intent),当B返回结果的时候,该方法就会被触发。requestCode—请求代码,resultCode—返回结果码。
2. B需要调用setResult()方法设置处理结果。
(3)上边设置requestCode和resultCode的原因:
一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务,这些新的Activity关闭后,系统都将会回调前面的Activity的onActivityResult(int requestCode,int ResultCode,Intent intent)方法。
为了知道该方法是由哪个请求的结果触发的,可利用requestCode请求码,为了知道返回的数据来自于哪个新的Acitivity,可利用ResultCode结果码。

作者:u013991521 发表于2015/7/31 10:14:44 原文链接
阅读:43 评论:0 查看评论

相关 [activity 数据 交换] 推荐:

Activity跳转的数据交换问题---学习笔记

- - CSDN博客推荐文章
问题一:有两个Activity(A和B),从A跳转到B,同时B需要A中的数据:. MainActivity类:. String sex = sex_rbtn.isChecked()?"男":"女";. //启动intent对应的Activity. SecondActivity类:.

在Activity之间传递数据

- - ITeye博客
在一个Activity中启动另一个Activy,取得数据,如:在应用 A 中启动 通讯录,选择目标用户,返回,以便在A 中使用选择的通讯录数据,基本过程如下:.         /* 开启Pictures画面Type设定为image */.         intent.setType("image/*");  //通讯录的不能这样写,.

android不同Activity之间的数据共享

- - CSDN博客移动开发推荐文章
通过不同Activity之间的消息传递机制实现数据共享. 将需要共享的变量声明为public static类型. 新建Application的子类,在该类中声明共享的变量. 在AndroidManifest.xml的application加个name属性就可以了,如下面所示:. 作者:foreverkoking 发表于2013-2-21 17:04:41 原文链接.

Activity之间使用intent传递大量数据带来问题总结

- - CSDN博客推荐文章
转载请注明: 大飞  http://blog.csdn.net/rflyee/article/details/47441405. Activity之间使用Parcel传递大量数据产生的问题. Activity之间通过intent传递大量数据,导致新Activity无法启动. Activity之间数据传递方式总结参考  这 里.

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

使用intent来启动activity

- - CSDN博客推荐文章
Intent最常见的用途是绑定应用程序组件,并在应用程序之间通信.Intent用来启动Activity,允许创建不同屏幕的一个工作流. 要创建并显示一个Activity,可以调用startActivity,并传递给它一个Intent,如:. 可以构造Intent来显示地指定要打开的Activity类,或者包含一个目标Activity必须执行的动作.

从网页启动Activity

- - 移动开发 - ITeye博客
正好Android SDK 给我们提供了解决方案,在网页中点击某个链接时,会匹配到Activity所配置的隐式Intent(配置在Manifest文件中). 第一步:在Manifest文件中给TestActivity配置一个隐式Intent. 第二步:这时,当在网页中点击链接<a href="testapp://test">Start TestActivity</a>就会启动TestActivity了.

Activity生命周期详解

- - 编程语言 - ITeye博客
本文概述:针对一个例子详细阐述Activity的生命周期. Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的Activity的集合,这个栈也叫返回栈(Back Stack). 每次我们启动一个新的Activity,这个Activity就会入栈,并处于栈顶位置. 按下返回键或者finish()方法销毁一个Activity时,处于栈顶的Activity就会出栈,另一个Activity就会处于栈顶位置,显示给用户的就会是这个Activity..

BSON:易于数据交换的格式

- Adam - NoSQLFan
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式. BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性. BSON主要会实现以下三点目标:. 对JSON格式来说,太大的JSON结构会导致数据遍历非常慢.