Android Activity之间传递数据

Android在Activity间传递数据的方法有以下几种

###使用Intent绑定内容

###使用全局变量Application

这样无论在程序的什么地方用getApplication()方法拿到的Application对象都是MyApp的实例(准确的说是Application的实例,但明显就是一个MyApp,当然可以转成MyApp)。

如果在MyApp里面定义一些变量,再定义一些gettersetter,就可以在任何地方读取或设置这些全局变量。

####示例代码

#####AndroidManifest.xml

1
2
3
4
5
6
7
<application
android:name="org.rankun.learn_intentapplication.MyApp">
...
<activity>
...
</activity>
</application>

#####MyApp.java

1
2
3
4
public class MyApp extends Application {
public String attr;
//...
}

#####SomeActivity.java

1
2
MyApp myApp = (MyApp)getApplication();
myApp.xxx();

###使用剪切板ClipboardManager

####示例代码

#####OneActivity.java

1
2
3
String msg = "I'm 20.";
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText("msg", msg));

#####AnotherActivity.java

1
2
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
String str = clipboardManager.getPrimaryClip().getItemAt(0).coerceToText(this).toString();

###获取Activity的返回值

  • 在当前Activity中使用startActivityForResult()启动一个Activity,并添加一个onActivityResult()方法来接收返回的数据。
    • 在启动新的Activity时,传入的Intent对象里面可以包含一些关于这次询问的信息,requestCode在自定义的onActivityResult()方法中作为变量requestCode回传,这样,如果我们启动了多个ActivityForResult,就可以通过requestCode判断是哪一个ActivityForResult返回了。
  • 在被调用的Activity中使用getIntent()来获取启动这个ActivityIntent,该Intent应该包含了调用者传递过来的一些putExtra信息
  • 被调用的Activity在处理好结果准备返回。
    • 创建一个用来返回的Intent
    • 将要返回的数据putExtra在这个Intent中
    • 调用当前Activity的setResult()方法设置resultCode和用来返回的Intent
    • 调用当前Activity的finish()方法结束本Activity的生命周期,结果将会被返回到调用这个Activity的Activity
  • 主调Activity的onActivityResult方法触发之后,需要的数据已经包含在传入的Intent中
    • 可以通过判断requestCode来确定是哪一个ActivityForResult返回了
    • resultCode The result code to propagate back to the originating activity, often RESULT_CANCELED or RESULT_OK

    • 可以从Intent对象中获取返回的数据

####示例代码

#####MainActivity.java

1
2
3
4
5
6
7
8
//例如可以用某个按钮的onClick事件触发这个方法运行
public void queryRes(View view) {
EditText et1 = (EditText) findViewById(R.id.et1);
String qesString = et1.getText().toString();
Intent other = new Intent(this, OtherActivity.class);
other.putExtra("qes", qesString);
startActivityForResult(other, 5);
}

#####OtherActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);

//解析传来的数据
Intent requestIntent = getIntent();
String qes = requestIntent.getStringExtra("qes");
((TextView)findViewById(R.id.qes)).setText(qes);
}

//例如可以用某个按钮的onClick事件触发这个方法运行
public void procAndRtn(View view) {
String ansString = ((EditText)findViewById(R.id.otheractivity_et_1)).getText().toString();
Intent rtnIntent = new Intent(this, MainActivity.class);
rtnIntent.putExtra("ans", ansString);
setResult(RESULT_OK, rtnIntent);
finish();
}

#####MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
//5, 6, data
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK) {
if(requestCode == 5) {
String ans = data.getStringExtra("ans");
TextView tv = (TextView)findViewById(R.id.main_activity_ans_tv);
tv.setText(ans);
}
}
}