Android学习笔记(四)——再探Intent

  //此系列博文是《第一行Android代码》的学习笔记,如有错漏,欢迎指正!

  我们可以使用 Intent 来启动一个活动, 还可以在启动活动的时候传递数据的,下面一起来看一下:

一、向下一个活动传递数据
  Intent中提供了一系列 putExtra()方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动后,只需要把这些数据再从Intent 中取出就可以了。例如我们可以在mainactivity中创建一个字符串,然后把它传递到second_activity里:

  1)先在MainActivity中构建好Intent: 

@Override
public void onClick(View v) {
String data = "Hello second_activity";
Intent intent = new Intent(MainActivity.this, second_activity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}

  我们使用显式 Intent的方式来启动 second_activity,并通过 putExtra()方法传递了一个字符串。注意这里 putExtra()方法接收两个参数,第一个参数是键名,用于后面从 Intent中取值,第二个参数才是真正要传递的数据。

  2)在second_activity中将intent的数据提取出来: 

 public class second_activity extends Activity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secend);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
} }

  这里我们通过 getIntent()方法获取到用于启动 second_activity 的 Intent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。这里由于我们传递的是字符串,所以使用 getStringExtra()方法来获取传递的数据,如果传递的是整型数据,则使用getIntExtra()方法,传递的是布尔型数据,则使用 getBooleanExtra()方法,以此类推。

  此时启动程序,运行效果如下:

  Android学习笔记(四)——再探Intent

  按下button 1后可看到logcat中将传入的字符串打印出来了:

  aaarticlea/png;base64,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" alt="" />

二、将数据返回给上一个活动
  Activity中有一个 startActivityForResult()方法也是用于启动活动的, 这个方法在活动销毁的时候能够返回一个结果给上一个活动。我们可以在这里使用它:

  1)修改MainActivity中的onClick()方法: 

 button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, second_activity.class);
startActivityForResult(intent, 1);
}
});

  这里我们使用了 startActivityForResult()方法来启动 second_activity,请求码只要是一个唯一值就可以了,这里传入了 1即可。

  2)在second_activity中注册一个button 2,添加返回数据的逻辑:

 public class second_activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second); Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello MainActivity");
setResult(RESULT_OK, intent);
finish();
}
});
}
}

  我们构建了一个 Intent,只不过这个 Intent 仅仅是用于传递数据而已,它没有指定任何的“意图” 。紧接着把要传递的数据存放在 Intent 中,然后调用了 setResult()方法。这个方法是专门用于向上一个活动返回数据的。setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用 RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则是把带有数据的 Intent 传递回去,然后调用
了 finish()方法来销毁当前活动。

  3)重写主活动的onActivityResult()方法:
  由于我们是使用 startActivityForResult()方法来启动 second_activity的, 在 second_activity被销毁之后会回调上一个活动的 onActivityResult()方法,因此我们需要在 MainActivity 中重写这个方法来得到返回的数据:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity", returnedData);
}
break;
default:
}
}

  onActivityResult()方法带有三个参数,第一个参数 requestCode,即我们在启动活动时传入的请求码。 第二个参数 resultCode, 即我们在返回数据时传入的处理结果。 第三个参数 data,即携带着返回数据的 Intent。

  因为一个主活动可能调用startActivityForResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调到 onActivityResult()这个方法中。所以我们需要先判断requestCode(请求码)来确定活动的来源,在通过resultCode来判断活动执行的情况。

三、在按下back键时传回数据

  在上面的例子中我们是通过按下button 2 来返回数据的,假如想通过按下back键来传递数据呢?这是我们可以通过重写second_activity中的 onBackPressed()方法:

 @Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}

  //End.

上一篇:java学习笔记11-static关键字


下一篇:Codeforces CF#628 Education 8 C. Bear and String Distance