今天我们一起来看一下Activity之间的数据传递。
先说说有哪些方式可以实现呢?其实吧,Activity之间的数据传递,标准的传递方式是使用Intent载体;还有很多其他方式,那个范围就扩大了,那些应该叫做数据传递,并不一定要是Activity之间的数据传递,比如说:静态变量(用public static修饰),数据存储(sharedpreference、provider等),进程间通讯(AIDL)等等。我在这里只是讲讲Activity之间的数据传递,至于其他的我后续的blog有空再讲。
Intent的基本使用方式:Intent.put(key,value);然后在对应的activity里面Intent.getxxx(key)相应的类型即可。
//ActivityA中调用
private void startNewActivity1() {
Intent mIntent = new Intent();
mIntent.setClass(ActivityA.this, ActivityB.class);
mIntent.putExtra(INTENT_STRING_TAG, "testString");
mIntent.putExtra(INTENT_SERIALIZABLE_TAG, object);
startActivity(mIntent);
}
//ActivityB中调用
private void handleIntent(){
Intent mIntent = getIntent();
System.out.println(ActivityA.INTENT_STRING_TAG + " = " + mIntent.getStringExtra(ActivityA.INTENT_STRING_TAG));
}
这里还有很多朋友想问Bundle不是也能做载体么?这个是没有任何问题的,他的用法和Intent的是一样的,但是最后它还是需要被放在Intent被传递过去的。ActivityA中创建一个Bundle对象,然后
bundle.putXXX(key, value);
intent.putExtras(bundle);ActivityB中就需要Bundle bundle = intent.getExtras();来获取传递过来的bundle
基本的数据传递还是比较简单的,这边有一点需要注意的是,开发过程中往往需要用到一些自定义对象的传递,那么这个自定义对象是不能直接被Intent传递的。其实解决方法很简单,你只需要将这个对象声明为序列化对象即可。(即实现Serializable或Parcelable接口就可以了)
package com.solide.object;
import java.io.Serializable;
public class TestObject implements Serializable {
private static final long serialVersionUID = 1L;
private int testInt = 1;
private String testString = "test";
public int getTestInt() {
return testInt;
}
public void setTestInt(int testInt) {
this.testInt = testInt;
}
public String getTestString() {
return testString;
}
public void setTestString(String testString) {
this.testString = testString;
}
}
上面讲诉的是A到B的数据传递,其实还可以A从B索取结果,使用的方法是startActivityForResult();