(一)使用Intent对象进行数据传递
方法步骤:
1.在源Activity中new一个Intent对象,并调用它的putExpra()方法写入要传递的数据;
2. Intent对象调用它的setClass(源Activity.this , 目标Activity.class) 告诉Intent对象要传递到哪里,然后,startActivity(mIntent);
3. 然后在目标Activity中声明Intent对象并将getIntent()赋值给它,有点类似于网络通信中的Secoket套接字,然后,调用getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递;
4. 源码如下:
MainActivity.java
Button mButton= (Button) findViewById(R.id.myButton);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mIntent = new Intent();
/**
* 通过Intent类中的putExtra方法可以将简单的数据类型和序列化对象保存到Intent对象中
*/
mIntent.putExtra("age", 12);
mIntent.putExtra("name", "小李");
mIntent.putExtra("address", "上海");
mIntent.setClass(MainActivity.this, OtherActivity.class);
//启动意图
startActivity(mIntent);
}
});
目标Activity————-OtherActivity.java
private TextView mtTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
/**
* 使用Intent的putExprd()保存数据 跟 getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递
*/
mtTextView = (TextView) findViewById(R.id.msg);
Intent intent = getIntent();
int age = intent.getIntExtra("age", 0);
String name = intent.getStringExtra("name");
String address = intent.getStringExtra("address");
mtTextView.setText("age--->>" + age + "\n" + "name-->>" + name + "\n"
+ "address->>" + address);
}
(二)通过静态变量传递数据
1.为什么要使用静态变量传递数据?
说明:使用Intent可以很方便在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题;
2.跟Intent数据传递的方法类似,只是在源Activity中使用目标Activity的类直接访问自己定义的Static成员变量来进行直接赋值的(使用的语法是静态成员变量可以直接通过自己的类名来进行调用).
3.源代码如下:
MainActivity.java
/**
* 我们可以使用静态变量来Intent无法传递不能序列化的对象的
* 问题
*/
Button staButton=(Button) findViewById(R.id.staticButton);
staButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent staIntent = new Intent();
staIntent.setClass(MainActivity.this, StaticIntentTest.class);
StaticIntentTest.name="AC";
StaticIntentTest.age = 12;
startActivity(staIntent);
}
});
目标Activity————-StaticIntentTest.java
/**
* 通过使用static变量来解决Intent方法传递非序列元数据的问题
* @author Administrator
*
*/
public class StaticIntentTest extends Activity {
/**
* 在此申明静态变量name 和 age
*/
public static String name;
public static int age;
/**
* 非序列化数据的TextView声明
*/
private TextView staTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("xys", "onCreate Method is executed");
setContentView(R.layout.other);
/**
* 使用在目标Activity声明静态属性的方法来实现Intent非序列化数据的传递
*/
staTextView = (TextView) findViewById(R.id.staticmsg);
staTextView.setText("-name->>"+name+"\n"+"-age-->>"+age);
}
(三)通过剪切板传递数据
1. 什么是剪切板技术
在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。
2.使用的方法步骤:
(1)使用Serializable接口将数据序列化;
(2)将数据对象转化为字符串,并保存到剪切板中;
(3)从剪切板中拿出并解码,还原数据对象;
(4)程序运行流程图如下:
3.代码如下:
MainActivity.java
/**
*
* 使用剪切板技术来实现activity之间数据的传递
* (注:剪切板技术是一个通用的数据传递技术,比如:手机中复制文字或者图片等,不同的activity中均有这个功能并且数据共享;
*/
Button clipboardButton = (Button) findViewById(R.id.ClipboardButton);
clipboardButton.setOnClickListener(new OnClickListener() {
MyData myData = new MyData("Blue", 15);
//将对象转化为字符串
ByteArrayOutputStream mArrayOutputStream = new ByteArrayOutputStream();//生成一个字节数组对象
String base64String = "";
try {
//将字节数组对象赋值给ObjectOutputStream对象
ObjectOutputStream mObjectOutputStream = new ObjectOutputStream(mArrayOutputStream);
//ObjectOutputStream对象调用它的writeObject()方法将数据对象写入ObjectOutputStream流内;
mObjectOutputStream.writeObject(myData);
//按照Base64的格式对已经转化为字节数组(通过调用toByteArray())的字节数组输出流mArrayOutputStream对象进行编码(成为字符串)
base64String = Base64.encodeToString(mArrayOutputStream.toByteArray(), Base64.DEFAULT);
mObjectOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
mClipboardManager.setText(base64String);
Intent mIntent = new Intent(MainActivity.this , ClipboardActivity.class);
startActivity(mIntent);
}
});
继承自Application的数据资源文件Myapp.java
package com.example.intenttest;
/**
* 通过使用全局对象Application来实现Activity间数据的传递
* @author Administrator
*
*/
import android.app.Application;
public class MyApp extends Application {
public String name;
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
setName("Per");
}
}
目标Activity文件GlobalActivity.java
package com.example.intenttest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
/**
* 通过使用全局对象Application来实现Activity间数据的传递
* @author Administrator
*
*/
public class GlobalActivity extends Activity {
private MyApp myApp;
private TextView glTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
glTextView = (TextView) findViewById(R.id.GlobalTextView);
//myApp = (MyApp) getApplication();
myApp=(MyApp) getApplication();
glTextView.setText("-----appName-----" + myApp.getName()+"\n"+"====appAge====="+myApp.getAge());
}
}
(五)使用Intent的方式传递数据并返回结果
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity。
使用Intent的方式传递并返回数据的方法步骤:
1)声明需要传递的类型,然后,老规矩调用Intent的putExpra()方法将数据保存到Intent中,最后,启动带返回值的Activity————startActivityForResult();
2)启动Intent后,在目标Activity中生成Intent对象,并getIntent()后,然后声明与传递过来的数据类型相同的变量,并调用getXXXExtra()来获取传递过来的数据;
3)获取完成以后,重新new一个新的Intent对象后,调用它的putExpra()方法,并将新的变量传递进去后,“被叫”Intent(类比打电话)通过setResult()将结果返回去,并调用finish()结束本次Activity;
4)回调在“主叫”中Intent的onActivityResult()方法对结果进行处理;
注意:(1)触发onActivityResult()方法返回结果条件是必须requestCode>= 0 方可,看下面的Android API文档: (红色部分) 随着Activity启动模式的不同方法执行的顺序会不同,这是后话;
运行结果如下:
输入任意俩个数值后,点击计算结果后,会跳转到目标Activty,然后将结果输入后,点“返回结果”,又会回到主Activity,并显示结果;
源码下载地址: