在不同的Activity之间传递数据

使用Intent传递数据

简单的数据类型(int String short Boolean )等或者是可序列化的对象,通常使用Intent,通过Intent.putExtra()进行数据传递,然后在目标Activity中通过使用getXxx()方法获取数据,例如getInt() getString()等。
例如:

@Override
    public void onClick(View view) {
        Intent intent = null;
        switch (view.getId()) {
            case R.id.btn1:
                intent = new Intent(this,IntentActivity1.class);
                //保存String值
                intent.putExtra("intent_string","通过Intent传过来的数据");
                //保存int
                intent.putExtra("intent_int",300);

                Data data = new Data();
                data.id = 1000;
                data.name = "Android";
                //保存序列化对象
                intent.putExtra("intent_object",data);
                startActivity(intent);

                break;

在目标Activity中获取由Intent传过来的数据:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent1);
        TextView textView = (TextView)findViewById(R.id.tv);
        //获取String int和序列化对象
        String intentString = getIntent().getStringExtra("inten t_string");
        int intentInt = getIntent().getExtras().getInt("intent_int");
        Data intentData = (Data) getIntent().getExtras().get("intent_object");

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("intent_string: ");
        stringBuffer.append(intentString);
        stringBuffer.append("\n");

        stringBuffer.append("intent_integer: ");
        stringBuffer.append(intentInt);
        stringBuffer.append("\n");

        stringBuffer.append("data.id: ");
        stringBuffer.append(intentData.id);
        stringBuffer.append("\n");

        stringBuffer.append("data.name: ");
        stringBuffer.append(intentData.name);
        stringBuffer.append("\n");

        textView.setText(stringBuffer.toString());
    }

Data类,需要实现序列化接口

public class Data implements Serializable{
    public int id;
    public String name;
}

使用静态变量传递数据

Intent无法传递不可以序列化的对象,也就是不可以传递没有实现java.io.Serializable接口的类的对象,使用静态变量就可以传递这类对象。如果要向目标Activity传递:id,name,data,就需要在目标Activity中定义这三个静态变量。

目标Activity代码:

public class IntentActivity2 extends AppCompatActivity {

    //定义需要传递信息的静态变量
    public static String name;
    public static int id;
    public static Data data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent2);
        TextView textView = (TextView)findViewById(R.id.tv);
        StringBuffer stringBuffer = new StringBuffer();

        stringBuffer.append("name: ");
        stringBuffer.append(name);
        stringBuffer.append("\n");

        stringBuffer.append("id: ");
        stringBuffer.append(id);
        stringBuffer.append("\n");

        stringBuffer.append("data.id: ");
        stringBuffer.append(data.id);
        stringBuffer.append("\n");

        stringBuffer.append("data.name: ");
        stringBuffer.append(data.name);
        stringBuffer.append("\n");

        textView.setText(stringBuffer.toString());

    }
}

要在目标Activity中获取id,name,data这些值,就需要在显目标Activity之前(调用startAcaivity方法之前)为这些静态变量赋值。

                intent = new Intent(this,IntentActivity2.class);
                //为目标Activity静态变量赋值
                IntentActivity2.name = "保时捷";
                IntentActivity2.id = 3000;
                IntentActivity2.data = new Data();
                IntentActivity2.data.id = 1000;
                IntentActivity2.data.name = "Android";
                startActivity(intent);

                break;

使用全局对象传递数据

虽然使用静态变量可以传递任意类型的数据,但是如果在类中大量使用静态变量(尤其是很占用资源的变量,如Bitmap)可能会导致内存溢出。

使用全局对象,需要创建一个继承Application的类,如MyApp;全局类中的变量不需要定义成静态的,只需要定义成普通的成员变量即可,全局类必须有一个无参数构造方法。创建全局类之后,需要在AndroidManifest.xml中通过标签的android:name属性指定全局类名,如:android:name = “.MyApp”.

定义全局类,继承Application类
public class MyApp extends Application {
    public String name;
    public Data data = new Data();
}
//在启动目标Activity之前为全局类赋值
MyApp myApp = (MyApp)getApplicationContext();
                myApp.name = "中国";
                myApp.data.id = 1234;
                myApp.data.name = "人民";
                intent = new Intent(this,IntentActivity3.class);
                startActivity(intent);

                break;

在目标Activity中获取全局类的信息

public class IntentActivity3 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent3);
        TextView textView = (TextView)findViewById(R.id.tv);
        //获取全局类对象
        MyApp myApp = (MyApp)getApplicationContext();
        //取出全局类成员信息
        textView.setText("MyApp.name: " + myApp.name
                + "\nMyApp.data.id: " + myApp.data.id
                + "\nMyApp.data.name: " + myApp.data.name);
    }
}

使用剪贴板传递信息

剪贴板可以存储简单数据类型和可序列化对象,对于某些不可序列化对象,如果可以将其转换成字节流(字节数组),也是可以存储在剪贴板中的。由于其他程序也可能使用剪贴板,一般不建议使用。

参考资料《Android开发权威指南》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值