1. 使用全局变量传递数据
1). 新建MyAPP.java 继承 Application 类
/*
* 查看Android官方文档。
* Application 是所有那些需要维护全局application状态的基类。你可以提供你自己的实现机制通过在在AndroidManifest.xml中提供你自己的需要声明
* 的标记你自己的标签。
* onCreate()方法是在应用程序启动的时候被回调的。
*/
public class MyApp extends Application {
public String name;
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("AHuier");
}
}
2).配置AndroidManifest.xml 清单文件,使用 android:name=".MyApp" 来指定全局变量名称。
<application
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.android.intentglobal.Main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.android.intentglobal.Other"></activity>
</application>
3). 传递数据
private MyApp myApp;
...
myApp = (MyApp)getApplication();
myApp.setName("kunhuixu"); //修改之后的名称
Intent intent = new Intent(Main.this, Other.class);
startActivity(intent);
4).接受数据
private MyApp myApp;
private TextView textView;
...
myApp = (MyApp)getApplication();
textView.setText("--- The app name ---" + myApp.getName());
2. 使用剪切板传递数据
备注:如果需要传递对象,可先将对象序列化为字符串传递,此处使用对象举例
1). 新建可序列化对象MyData.java 类
public class MyData implements Serializable {
private String name;
private int age;
public MyData(String name, int age) {
super();
this.name = name;
this.age = age;
}
// 提供一个toString()方法
@Override
public String toString() {
return "MyData [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2). 传递数据
MyData myData = new MyData("AHuier", 22);
//将对象转换成字符串
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String base64String = "";
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(myData);
//使用Android中提供的 Base64 工具类,这个类主要是用来对对象进行压缩也解码的过程,使用默认方式
base64String = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
objectOutputStream.close();
} catch (Exception e) {
// TODO: handle exception
}
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText(base64String);
Intent intent = new Intent(IntentDemo.this, Other.class);
startActivity(intent);
3). 接受数据
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
String msgString = clipboardManager.getText().toString();
//将字符串 msgString 还原为对象
byte[] base64_byte = Base64.decode(msgString, Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte);
try {
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
MyData myData = (MyData)objectInputStream.readObject();
textView.setText(myData.toString());
} catch (Exception e) {
// TODO: handle exception
}
3.使用Intent传递数据
1) 传递数据
Intent intent = new Intent(IntentDemo.this, Other.class);
// 在Intent中传递数据
intent.putExtra("name", "AHuier");
intent.putExtra("age", 22);
intent.putExtra("address", "XiaMen");
// 启动Intent
startActivity(intent);
2) 接受数据
Intent intent = getIntent();
int age = intent.getIntExtra("age", 0);
String name = intent.getStringExtra("name");
String address = intent.getStringExtra("address");
4.使用静态变量传递数据
备注:使用Intent可以很方便的在不同的Activity之间传递数据,这个也是官方推荐的方式(方式3),但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题。
1). 新建静态变量类Other.java
public static int age;
public static String name;
public static String address;
2). 传递数据
Intent intent = new Intent();
intent.setClass(IntentDemo.this, Other.class);
Other.age = 22;
Other.name = "AHuier";
Other.address = "XiaMen";
startActivity(intent);
3). 接受数据
<pre name="code" class="java"> int age = <span style="font-family: 'Courier New';">Other.age</span>
String name = <span style="font-family: 'Courier New';">Other.name</span>
String address = <span style="font-family: 'Courier New';">Other.address; </span>
5. 传递数据并接受返回结果
备注:计算器等情景,在A中输入,在B中计算,再返回到A中显示。
1). 从A中传递数据(传递方式可以使用以上4种方案)
int a = Integer.parseInt(inputA.getText().toString());
int b = Integer.parseInt(inputB.getText().toString());
Intent intent = new Intent(IntentResult.this, Other.class);
intent.putExtra("a", a);
intent.putExtra("b", b);
startActivityForResult(intent, RESQUESTCODE); // 如果RESQUESTCODE
// >= 0,表示可以返回结果
2). 在A中重写 onActivityResult 处理返回数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// resultCode == RESULT_OK 表示另外一个Activity已经结束了功能
if (resultCode == RESULTCODE_TO_INTENTRESULT) {
if (requestCode == RESQUESTCODE) {
int returnResult = data.getIntExtra("result", 0);
result.setText(String.valueOf(returnResult));
}
}
}
3). 从B中返回数据
int result = Integer.parseInt(inputResult.getText().toString());
Intent intent = new Intent();
intent.putExtra("result", result);
// 通过Intent对象返回结果,setResult方法
// 注意:在setResult(resultCode,
// data)方法中,resultCode表示从Other这个Activity跳转到IntentResult这个Activity的标记,必须是大于1的整数
// 注意的时候resultCode 必须与IntentResult中的 onActivityResult(int
// requestCode, int resultCode, Intent data)的参数resultCode要一致的。
setResult(RESULTCODE_TO_INTENTRESULT, intent);
finish();// 结束当前的Activity的声明周期