Activity详解二 activity数据传递

首先看效果图:

1.Bundle类的作用

  Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap<String, Object>类型的变量来存放putXxx()方法放入的值。简单地说,Bundle就是一个封装好的包,专门用于导入Intent传值的包。

2.为Intent附加数据的两种写法

  第一种写法,用于批量添加数据到Intent:

Intentintent = new Intent();

  Bundle bundle = new Bundle();//该类用作携带数据

  bundle.putString("name","Alice");

  intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换

  第二种写法:这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,而且只需要编写少量的代码

  Intent intent = new Intent();

  intent.putExtra("name","XXX");

  那么,这两种方法有什么区别呢?

  完全没有区别。当你调用putExtras()方法时,所传入的Bundle会被转化为Intent的键值(别忘了Intent也以键值模式转载数据)。

  那么,现在看看如何将Intent和Bundle取出来。

  方法很简单,直接使用this.getIntent()就可以得到传来的Intent,然后在这个Intent的基础上调用getExtras()就可以得到Bundle。然后这个Bundle你想要什么得到什么就get什么。

  比如String str=bundle.getString("USERNAME"); 就是得到键为“USERNAME”的字符串,int num=bundle.getInt("Number");就是得到键为“Number”的整型。

android中的组件间传递的对象一般实现Parcelable接口,当然也可以使用java的Serializable接口,前者是android专门设计的,效率更高,下面我们就来实现一个Parcelabel。

1. 创建一个类实现Parcelable接口,具体实现如下:

public class ParcelableData implements Parcelable{  

    private String name;  

    private int age;  

    public ParcelableData(){  

        name = "guest";  

        age = 20;  

    }  

    public ParcelableData(Parcel in){  

        //顺序要和writeToParcel写的顺序一样  

        name = in.readString();  

        age = in.readInt();  

    }  

    public String getName(){  

        return name;  

    }  

    public void setName(String name){  

        this.name = name;  

    }  

    public int getAge(){  

        return age;  

    }  

    public void setAge(int age) {  

        this.age = age;  

    }  

    @Override  

    public int describeContents() {  

        // TODO Auto-generated method stub  

        return 0;  

    }  

    @Override  

    public void writeToParcel(Parcel dest, int flags) {  

        // TODO Auto-generated method stub  

        dest.writeString(name);  

        dest.writeInt(age);  

    }  

    public static final Parcelable.Creator<ParcelableData> CREATOR = new Parcelable.Creator<ParcelableData>() {  

        public ParcelableData createFromParcel(Parcel in) {  

            return new ParcelableData(in);  

        }  

        public ParcelableData[] newArray(int size) {  

            return new ParcelableData[size];  

        }  

    };  

}

2. 通过下面的方法发送对象。Bundle类也实现了Parcelable接口,一般在android中我们是通过Bundle来封装数据并进行传送的。

Intent intent = new Intent();  

intent.setClass(this, SubActivity.class);  

// 直接添加  

//intent.putExtra("MyData", new ParcelableData());  

// 通过Bundle  

Bundle bundle = new Bundle();  

bundle.putString("MyString", "test bundle");  

bundle.putParcelable("MyData", new ParcelableData());  

intent.putExtras(bundle);  

startActivity(intent);

3. 下面的接收对象的方法。

//ParcelableData parcelableData = getIntent().getParcelableExtra("MyData");  

Bundle bundle = getIntent().getExtras();  

ParcelableData parcelableData = bundle.getParcelable("MyData");  

String testBundleString = bundle.getString("MyString");  

Log.v("string=", testBundleString);  

Log.v("name=", parcelableData.getName());  

Log.v("age=", ""+parcelableData.getAge());

3 DEMO下载

activity代码:

package mm.shandong.com.testbundle;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

import mm.shandong.com.testbundle.entity.Person;

public class TestBundleActivity extends AppCompatActivity {
    EditText editText1;
    EditText editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_bundle);
        editText1 = (EditText) findViewById(R.id.editText1);
        editText2 = (EditText) findViewById(R.id.editText2);
    }
   ///提交选择的地区,并把地区传递给TestBundleActivity3
    public void submitRegion(View view) {
        EditText editTextRegion = (EditText) findViewById(R.id.editTextRegion);
        Intent intent = new Intent(this, TestBundleActivity3.class);
        String region = editTextRegion.getText().toString();
        if (!TextUtils.isEmpty(region)) {
            intent.putExtra("region", region);
            startActivity(intent);
        } else {
            Toast.makeText(this, "地区不能是空值", Toast.LENGTH_SHORT).show();
        }
    }
    ///把需要计算的两个值都是Integer类型,传入到TestBundleActivity1
    public void calculte(View view) {
        Intent intent = new Intent(this, TestBundleActivity1.class);
        Bundle bundle = new Bundle();
        String first = editText1.getText().toString();
        String second = editText2.getText().toString();
        if (!TextUtils.isEmpty(first) && !TextUtils.isEmpty(second)) {
            bundle.putInt("first", Integer.parseInt(first));
            bundle.putInt("second", Integer.parseInt(second));
            intent.putExtras(bundle);
            startActivity(intent);
        } else {
            Toast.makeText(this, "数值不能是空", Toast.LENGTH_SHORT).show();
        }
    }
    ///传递Serializable对象到TestBundleActivity2
    public void login(View view) {
        EditText editTextName = (EditText) findViewById(R.id.editTextName);
        EditText editTextCode = (EditText) findViewById(R.id.editTextCode);
        Intent intent = new Intent(this, TestBundleActivity2.class);
        Bundle bundle = new Bundle();
        String name = editTextName.getText().toString();
        String code = editTextCode.getText().toString();
        if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(code)) {
            Person person = new Person();
            person.setName(name);
            person.setCode(code);
            bundle.putSerializable("person", person);
            intent.putExtras(bundle);
            startActivity(intent);
        } else {
            Toast.makeText(this, "姓名编号不能是空", Toast.LENGTH_SHORT).show();
        }
    }

}

最后,以上例子都来源与安卓无忧,请去应用宝或者豌豆荚下载:http://android.myapp.com/myapp/detail.htm?apkName=com.shandong.mm.androidstudy,源码例子文档一网打尽。

时间: 2024-09-27 05:19:03

Activity详解二 activity数据传递的相关文章

Activity详解四 activity四种加载模式

先看效果图: 1概述 Activity启动方式有四种,分别是: standard singleTop singleTask singleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题. 设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如: <activity android:name=".A1&

Android四大组件--Activity详解

Android四大组件--Activity详解 分类: android android应用android开发 本文的主要内容包括1.activity的建立.配置和使用:2.activity的跳转和传值:3.startActivityForResult:4.activity的生命周期. 1.activity的建立.配置和使用 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个可视的窗口,一般情况

Xamarin android 之Activity详解

序言: 上篇大概的讲解了新建一个android的流程.今天为大家带来的是Activity详解,因为自己在开发过程中就遇到 好几次坑,尴尬. 生命周期 和Java里头一样一样的,如图 图片来源于网上哈,自己画不来. 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态. 2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行. 3.当前Ac

Android开发四大组件--Activity详解

Android开发四大组件--Activity详解 - Android开发教程 Android开发的四大组件在开发中应用中是必不可少的,下面就来详解下四大组件之一Activity,总结自网络.Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()——>onStart()——>onResume() 当另一个Activity启动时: 第一个Activity onPause()——>第二个Activity onCreate()——>

Android四大组件之Activity详解 &middot; yclog

Activity生命周期: onCreate:在Acitivty第一次创建时调用,用于做初始化的工作onStart:onCreate调用后调用,此次界面对用户来说无法看见onResume:此次界面可见并显示到前台,且当前Acitvity位于当前栈顶,并且处于运行状态onPause:表示当前Activity正在停止,常做一些存储数据.停止动画等工作(不做耗时操作)onStop:表示当前Activity即将停止,一般做微量级的回收工作onDestory:表示当前Activity即将被销毁,可做一些回

[安卓基础] 009.组件Activity详解

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

php学习之道:WSDL详解(二)

3.定义服务使用的逻辑消息 当服务的操作被调用时,服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素.这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息的方式来定义.当操作被调用时,逻辑消息被交换.(也就是说,逻辑消息代表了服务的操作)这些逻辑消息,将在网络上传输的数据定义为xml文档.他包含了所有的参数,这些参数是方法调用的一部分.(也就是说,逻辑消息里的参数,是操作对应方法的参数集合) 消息和参数列表:每一个被服务暴露的操作能且仅能有一个输入消息

LinearLayout详解二:从其父类View说起

这个View类说来就话长了,但我们又不得不说,要说呢,就得说的彻底,要让大家看得一清二楚,明明白白.所以我们就从源代码角度来看一个view是如何被加载的吧. 如果大家不知道怎么下载android的源代码,或者说懒得去下载(因为源代码确实比较大,大概有10G)的话,教大家几个取巧的办法: 1.直接在google中输入"android view.java"即可.这种方法成功率非常高,一般android的比较重要的类都能搜到. 2.给大家提供一个人家用于放源码的的git:[email pro