使用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开发权威指南》