一个activity打开新的activity,新的activity关闭之后,返回数据。原来的activity要接收返回的数据,在开启新的activity时,就需要调用startActivityForResult()函数。

分析

  • startActivityForResult()

原型如下:

startActivityForResult(Intent intent, int requestCode)

第一个参数Intent。

第二个参数requestCode: 请求码,返回的时候需要用到。可以自己设置。

  • onActivityResult()

如果要接受返回的数据。需要调用onActivityResult()

原型如下:

onActivityResult(int requestcode, int resultCode, Intent data)

第一个参数requestCode,与startActivityForResult对应。在onActivityResult函数中,根据不同的请求码进行操作。

第二个参数resultCode, 是setResult()函数返回的结果码。

第三个参数data,是数据。

  • setResult()

对于打开的Activity,返回数据需要调用setResult(),将数据返回给前一个Activity。

原型如下:

setResult(int resultCode, Intent data)

第一个参数resultCode是结果码,系统定义了静态变量,如RESULT_OK,RESULT_CANCELED等。

第二个参数data是返回的数据。

Example

源码下载地址:https://github.com/TonySudo/StartActivityForResult

本例中,使用2个按键,调用startActivityForResult(),启动同一个新的activity,发送不同的请求码,数据也不同。

新的activity接受数据,并显示出来,然后将接受的数据通过setResult()返回。

原来的activity接受到数据,调用onActivityResult(),根据请求码和结果吗进行处理,将数据显示出来。

  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startactivityforresult"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2"></activity>
</application> </manifest>
  • MainActivity的布局文件

设置2个按键,和2个textView用于显示。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.startactivityforresult.MainActivity"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" /> <Button
android:id="@+id/btnChangeText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="change_text_1"/> <Button
android:id="@+id/btnChangeText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="change_text_2"/> </LinearLayout> </RelativeLayout>
  • MainActivity.java

按键按下,发送不同的requestCode和数据。

package com.example.startactivityforresult;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends AppCompatActivity {
Button btn1;
Button btn2;
TextView tv1;
TextView tv2;
int requestCode = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btn1 = (Button) findViewById(R.id.btnChangeText1);
btn2 = (Button) findViewById(R.id.btnChangeText2); btn1.setOnClickListener(listener);
btn2.setOnClickListener(listener); } private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnChangeText1:
requestCode = 1;
Intent intent1 = new Intent(MainActivity.this, Activity2.class);
intent1.putExtra("action", "Button1 pressed");
startActivityForResult(intent1, requestCode);
Log.e("test", "btn 1");
break; case R.id.btnChangeText2:
requestCode = 2;
Intent intent2 = new Intent(MainActivity.this, Activity2.class);
intent2.putExtra("action", "Button2 pressed");
startActivityForResult(intent2, requestCode);
Log.e("test", "btn 2");
break; default:
break;
} }
};
/*
* 获取上一个activity返回的数据。
* requestcode: 调用startActivityForResult时,传入的参数的,返回的时候也会穿这个参数。
* resultCode: setResult()时传入的数据。表示操作是否成功。有多重参数,根据不同的记过进行操作。
* data: 返回的数据。
*/
@Override
protected void onActivityResult(int requestcode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
String str = data.getStringExtra("action");
switch (requestCode) {
case 1:
tv1 = (TextView) findViewById(R.id.textView1);
tv1.setText(str);
break;
case 2:
tv2 = (TextView) findViewById(R.id.textView2);
tv2.setText(str);
break;
}
}
else if (resultCode == RESULT_CANCELED) { }
}
}
  • Activity2的布局文件

activity_2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.startactivityforresult.Activity2"> <TextView
android:id="@+id/textViewActivity2"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </RelativeLayout>
  • Activity2.java
package com.example.startactivityforresult;

import android.content.ContentUris;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast; public class Activity2 extends AppCompatActivity {
TextView txtV; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2); // 接受上一个activity发过来的数据并显示。
Intent intent = getIntent();
String str = intent.getStringExtra("action");
txtV = (TextView) findViewById(R.id.textViewActivity2);
txtV.setText(str); // 发送接收到的数据,发还给上一个activity。
Intent intentBack = new Intent();
intentBack.putExtra("action", str);
setResult(RESULT_OK, intentBack);
// setResult(RESULT_CANCELED, intentBack);
// 如果立即调用finish(),这个activity会马上关闭,返回到前一个activity。所以不再这里调用。放到onStop()中调用。
// this.finish();
} @Override
public void onStop()
{
super.onStop();
this.finish();
Toast.makeText(getBaseContext(), "activity2 stop", Toast.LENGTH_SHORT).show();
}
}

运行效果:

点击第一个按键

返回

再点击第二个按键

再返回

Tony Liu

2017-3-10,Shenzhen

Android startActivityForResult 回传数据的更多相关文章

  1. Android activity的回传数据

    package com.example.myact3; import android.content.Intent; import android.os.Bundle; import android. ...

  2. 05 Activity 回传数据

    当从一个Activity跳转到第二个Activity后然 让其处理完业务逻辑回传数据给第一个Activity: 回传调用方法顺序: onActivityResult--->>onResta ...

  3. Android -- startActivityForResult和setResult

    startActivityForResult与startActivity的不同之处 startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivit ...

  4. SpringMVC下Ajax请求的方法,@Responsebody如果返回的是布尔值,ajax不会接到任何回传数据

    SpringMVC框架下,如果用ajax向后台请求得方法如果使用@Responsebody返回布尔值的话,ajax得不到任何的回传数据. 但是如果返回String类型,就是正常的. 测试了下代码写得没 ...

  5. Android课程---关于数据存储的学习(3)之数据库和事务

    DataActivity3.java package com.hanqi.test5; import android.content.ContentValues; import android.dat ...

  6. Android开发-之数据的存储方式一

    在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...

  7. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  8. Android 数据库管理— — —添加数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  9. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

随机推荐

  1. Android事件分发机制源代码分析

    小小感慨一下,做android有一段时间了,一直以来都是习惯整理笔记存到有道笔记上,没有写博客的习惯. 以后逐步分类整理出来,也算"复习"一遍了 - _ - . android的事 ...

  2. 如何查看域名解析是否生效--windows命令

  3. 有关UITableviewCell 重用内存 内部解析

    重用实现分析 查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...

  4. BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

    题目大意:n个建筑须要抢修.第i个建筑须要T1时间抢修.必须在T2时间之前抢修完成.求最多能抢修多少建筑 首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据: 5 10 10 ...

  5. 【Android】21.1 画板资源

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.简介 画板资源(Drawable Resources)是用XML描述/Resources/drawable中的2D图形文 ...

  6. Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root

    Shallow Heap Size 指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小. 1.数组类型 数组元素对象所占内存的大小总和. 2.非数组类型 对象与它所有的成员变量大小的总和.当 ...

  7. [转]编写 android.mk 中 LOCAL_C_INCLUDES 的技巧

    看原文请移步:编写 android.mk 中 LOCAL_C_INCLUDES 的技巧 在编写android.mk的过程中,免不了要修改LOCAL_C_INCLUDES来设置头文件的include目录 ...

  8. 关于Solr6.0中solrj使用简单例子

    solr6.0的solrJ接口有部分变化,下面列出了简单的使用实例,有需要的朋友可以参考下. package com.ailk.solr6; import java.io.IOException; i ...

  9. 对于火狐浏览器中title不能换行自动变成...怎么解决的?

    width: 100px; overflow: hidden; white-space: nowrap; word-break: keep-all; text-overflow: ellipsis;

  10. arm B和BL指令浅析

    arm B和BL指令浅析 B或BL指令引起处理器转移到“子程序名”处开始执行.两者的不同之处在于:(1)BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器).      ...