Android Intent返回数据给上一个活动
2018-01-22 14:39
274 查看
既然可以传递数据给下一个活动,那么能不能返回数据给上一个活动呢?答案是肯定的。不过不同的是:返回上一个活动只需要按一下back键就可以了,并没有一个用于启动活动Intent来传递数据。通过查阅文档你会发现,Activity中还有一个startActivityForResult()方法也是用来启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动,毫无疑问,这就是我们所需要的。
startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。我们还是来实战一下,修改MainActivity中按钮点击时间,代码如下:
这里我们使用了startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值就可以了,这里传入了1。接下来我们在SecondActivity中来给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下:
可以看到,我们还是构建了一个Intent,只不过这个Intent仅仅是用于传递数据而已,它没有指定任何的"意图",紧接着把要传递的数据存放在Intent中,然后调用setResult()方法,这个方法非常重要,是专门用于向上一个活动返回数据的。setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则把带有数据的Intent传递回去,然后调用了finish()方法来销毁当前活动。
由于我们是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在MainActivity中重写这个方法来得到返回的数据,代码如下:
onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码,第二个参数是resultCode,即我们在返回数据时传入的处理结果,第三个参数data,即携带着返回数据的Intent,由于在一个活动中可能调用startActivityResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调onActivityResult()这个方法,因此我们首先要做的就是通过检查requestCode的值来判断数据来源,确定数据是从SecondActivity返回的之后,我们再通过resultCode的值来判断处理结果是否成功,最后从data中取值并打印出来,这样就完成了向上一个活动返回数据的工作。
重新运行程序,在MaiActivity的界面点击按钮会打开SecondActivity,然后在SecondActivity界面点击Button按钮会回到MainActivity,这时查看logcat的打印信息,如图:
![](https://img-blog.csdn.net/20180122143401420?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVG9uZ3NpeXVhaWNoaWRhbWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到,SecondActivity已经成功返回数据给MainActivity了。
这个时候你可能会问,如果用于在SecondActivity中并不是通过点击按钮,而是通过按下Back键返回的MainActivity,这样数据不就没法返回了吗?没错,不过这种情况还是很多处理的,我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题,代码如下:
这样的话,当用户按下Back键,就会去执行onBackPressed()方法中的代码,我们在这里添加返回数据的逻辑就可以了。
startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。我们还是来实战一下,修改MainActivity中按钮点击时间,代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent,1); } }); } }
这里我们使用了startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值就可以了,这里传入了1。接下来我们在SecondActivity中来给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下:
public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { 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()方法来销毁当前活动。
由于我们是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在MainActivity中重写这个方法来得到返回的数据,代码如下:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent,1); } }); } @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(TAG, "onActivityResult: " + returnedData); } break; default: break; } } }
onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码,第二个参数是resultCode,即我们在返回数据时传入的处理结果,第三个参数data,即携带着返回数据的Intent,由于在一个活动中可能调用startActivityResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调onActivityResult()这个方法,因此我们首先要做的就是通过检查requestCode的值来判断数据来源,确定数据是从SecondActivity返回的之后,我们再通过resultCode的值来判断处理结果是否成功,最后从data中取值并打印出来,这样就完成了向上一个活动返回数据的工作。
重新运行程序,在MaiActivity的界面点击按钮会打开SecondActivity,然后在SecondActivity界面点击Button按钮会回到MainActivity,这时查看logcat的打印信息,如图:
可以看到,SecondActivity已经成功返回数据给MainActivity了。
这个时候你可能会问,如果用于在SecondActivity中并不是通过点击按钮,而是通过按下Back键返回的MainActivity,这样数据不就没法返回了吗?没错,不过这种情况还是很多处理的,我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题,代码如下:
public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("data_return","Hello MainActivity"); setResult(RESULT_OK,intent); finish(); } }); } @Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("data_return","Hello MainActivity"); setResult(RESULT_OK,intent); finish(); } }
这样的话,当用户按下Back键,就会去执行onBackPressed()方法中的代码,我们在这里添加返回数据的逻辑就可以了。
相关文章推荐
- Android intent返回数据给上一个活动
- 23.使用Intent返回数据给上一个活动
- Android如何将数据返回给上一个活动
- Intent 隐式跳转,向下一个活动传递数据,向上一个活动返回数据。
- Android返回数据给上一个活动-startActivityForResult
- 返回数据给上一个活动(intent)
- android 使用Intent传递数据之返回结果
- android intent传递数据,返回函数
- 【Android】使用Intent实现数据传递之返回结果
- Android 使用Intent在活动之间传递数据
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- 通过Intent将数据传递给上一个活动
- Android开发:向下一个activity传递数据,返回数据给上一个activity
- 基础之Intent向下,向上一个活动个传递数据
- activity数据回传过程(返回数据给上一个活动)
- android 里的receiver 就像一个实时监控 总线数据,或者消息(intent)队列的东西,回调函数类似
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
- android Intent返回数据,回调数据,startActivityForResult用法
- android Activity返回数据到上一个Activity
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果