Android中数据的传递

Android中当两个Activity需要有信息交互的时候,可以使用Intent。具体来说:

发送单一类型数据:

发送方:
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent); #在onClick中调用
接收方:
Intent  intent = getIntent();
String data = intent.getStringExtra("extra_data");#可以在onCreate中读取

除了putExtra("key", value)/getStringExtra("key")之外, 根据传递的value的类型还有很多对,比如:

putExtra("key", intvalue)/getintExtra("key")
putExtra("key", floatvalue)/getfloatExtra("key")
putExtra("key", doublevalue)/getDoubleExtra("key")putExtra("key", bundlevalue)/getBundleExtra("key")

...

发送多种数据类型的组合:

也可以用Bundle把很多数据类型(包括嵌套Bundle)放到Bundle中一并发送:

//senderBundle b = new Bundle();
b.putInt("age", 2);
b.putString("data", "hello");
intent.putExtras(b);
startActivity(intent);
//receiverIntent i = getIntent();
Bundle b = i.getExtras();
int age = b.getInt("age");
String data = b.getString("data");

发送类对象:

方法1:Serializable

Serializable是Java提供的序列化方法,优点是使用简单,一切由系统负责;缺点是速度稍慢。

public class User implements Serializable{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User(String name, Integer age){
        this.name = name;
        this.age = age;
    }
}
//senderintent.putExtra("user", (Serializable) new User("JM", 30));
//Receiver
Intent i = getIntent();
User user = (User) i.getSerializableExtra("user");
textView.setText(String.format("name: %s, age: %s", user.getName(), user.getAge()));

方法2:Parcelable

public class User implements Parcelable{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User(String name, Integer age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        //write all the fields that want to send
        parcel.writeString(getName());
        parcel.writeInt(getAge());
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel parcel) {
            return new User(parcel.readString(), parcel.readInt());
        }

        @Override
        public User[] newArray(int i) {
            return new User[i];
        }
    };
}
//Sender
            intent.putExtra("user", (Parcelable) new User("JM", 30));
                startActivity(intent);
//Receiver
        User user = (User) i.getParcelableExtra("user");
        textView.setText(String.format("name: %s, age: %s", user.getName(), user.getAge()));

如果在User中有多个同类型字段,比如String,可以用Bundle来实现:

@Override
    public void writeToParcel(Parcel parcel, int i) {
        //write all the fields that want to send
//        parcel.writeString(getName());
//        parcel.writeInt(getAge());
        Bundle b = new Bundle();
        b.putString("name", getName());
        b.putInt("age", getAge());
        parcel.writeBundle(b);
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel parcel) {
//            return new User(parcel.readString(), parcel.readInt());
            Bundle b = parcel.readBundle();
            return new User(b.getString("name"), b.getInt("age"));
        }

        @Override
        public User[] newArray(int i) {
            return new User[i];
        }
    };

从别的Activity得到返回结果:

启动端:

startActivityForResult(intent, 0);

0表示请求码,说明此次请求的意图是什么。

接收端:

        Intent i = new Intent();
        i.putExtra("data", editText.getText().toString());
        setResult(RESULT_OK, i);
        finish();
时间: 2024-11-06 22:31:32

Android中数据的传递的相关文章

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

android中的事件传递和处理机制

一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己能掌握这块知识.好了,下面是我今天的收获,希望也 能对你有一点帮助. 一.拟人化来理解android中的事件机制 其实android中的事件传递与处理机制跟我们生活中的事件处理是一样的.这里有一个生活中的例子,很能说明这个问题.阐述如下: 你是一个公司的员工,你的上头有一个主管,主管上头呢还有一个经

Android中数据存储(一)

国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM读写文件,可以使用java中IO流来读写,但是谷歌很人性化,直接给你封装了一下,所以就有了Context提供的这两个方法:FileInputStream openFileInput(String name); FileOutputStream openFileOutput(String name,

Android笔记——Android中数据的存储方式(三)

Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存取,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,并且它是以手机内存为储存的. 那么,实际开发项目中有大量数据需要读写,并且需要面临大量用户的并发储存的情况呢.就不应该把数据存放在手机等移动设备的SQLite数据库里,移动设备的储存能力和计算能力都不足以

Android中数据存储方式一:文件形式

总结在Android中,一共有数据存储的5种方式.今天做一个笔记的整理.关于以文件形式如何来保存数据. 1.在activity_main.xml设计好布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_pa

Android中Touch事件传递总结

TouchEvent TouchEvent 分三种事件:down.move.up. 其中move事件在一个操作中(这里说的一个操作就是用户与屏幕的交互,即由down到up的动作序列)可能会发生多次. 但是,我们认为一个动作序列会包含以上三种事件,因此,在事件处理中就是要处理好这个过程,而最重要的就是down事件,这是一个动作序列的起始,没有down谈不上后面的事件了. 所以,我们把消耗down事件的类当做是这个动作序列的最终载体. 如果Down事件不归你处理,那这个动作序列的move,up也不归

Android中的事件传递机制

Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以按下操作作为前提,当按

android中activity之间传递数据的3种方式

在android开发中总是需要不停的传递数据,特别是不同的Activity之间.在这里小编介绍自己所知的3种Activity的跳转方式. 第一种:静态传递数据 直接上部分代码:在第一个Activity中 Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); SecondActivity.usrname = "jack"; SecondActivity.password

Android中数据存储之SharedPreferences

import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; /** * SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据,<br/> * 通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_pr