安卓漫漫路之startActivityForResult的使用.

startActivityForResult用法详解 一、如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。 package com.l. 阅读详情

在项目的界面跳转时需要用到数据回传.

可以使用google给咱们提供原生API---startActivityForResult(Intent intent, int requestCode)


三个主要的方法:
第一个:在界面A中使用:
startActivityForResult(Intent intent,int requestCode)打开界面B;
第二个:在界面B中使用:
setResult(int requestCode,Intent data)设置好数据后,
在手动调用finish关闭界面B是会向界面A回传数据.
第三个:在界面A中通过重写:
onActivityResult(int requestCode,int resultCode,,Intent data)
方法得到回传的数据.


具体使用:

1.在界面A中的某点击方法通过如下API开启界面B:
startActivityForResult(new Intent(ActivityA.this,ActivityB.class),1);
PS:参数一为intent,参数二为请求码(可根据需求编写,用于标识请求来源);
2.在界面B中的返回键或者某返回Button的点击事件中,通过如下API完成参数的回传:
Intent intent = new Intent();
intent.putExtra("result","My name is Yang");
ActivityB.this.setResult(1,intent);
ActivityB.this.finish();
PS:如此即完成了界面B中参数回传的操作.
3.在界面A中重写onActivityResult得到回传的数据;
String result = data.getExtras().getString("result");
Toast.makeText(this, result+"", Toast.LENGTH_SHORT).show();
这三步即可完成咱们的参数回调需求;
-------------------------------------------------------------------------------------
源码实现:
setResult的源码:
int mResultCode = RESULT_CANCELED;
Intent mResultData = null;

public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
        mResultCode = resultCode;   
        mResultData = data;	   
    }
}

PS:把咱们传入的结果码和携带数据的回传intent,赋值给Activity中的全局变量保存.
然后手动调用无参finish结束新界面时:
/** @hide Task isn't finished when activity is finished */
public static final int DONT_FINISH_TASK_WITH_ACTIVITY = 0;

public void finish() {
    finish(DONT_FINISH_TASK_WITH_ACTIVITY);
}


再继续跟踪一下这个finish(int finishTask):
private void finish(int finishTask) {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (false) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (resultData != null) {
                resultData.prepareToLeaveProcess(this);
            }
            if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData, finishTask)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}


PS:ActivitymParent,现在我们只需知道mParent在一般情况下均为null即可。
也就是说肯定会执行进入第一个判断的方法体.
finishActivity方法执行完毕并返回mFinished =true.
再跟进下全局变量mFinished的使用:
@return If the activity is finishing, returns true; else returns false. 
public boolean isFinishing() {
    return mFinished;
} 


PS:此方法不用多说吧。判断界面是否结束。看一眼上方的那行注释就明白了根据返回值判定界面是否销毁。

也就是说:通过调用ActivityManagerNative.getDefault()方法会得到一个ActivityManagerProxy对象,这是ActivityManagerService(下文简称为AMS)的代理对象。那么AMS是什么呢?这里我们只需要知道它是一个系统服务,系统中四大组件的启动、切换、销毁等都是由它负责的。
所以在调用完上方的finishActivity方法后,把mFinished变量置为了true,也就是说Activity就被销毁了,那么回传参数的主要逻辑就在resultData.prepareToLeaveProcess()这行代码中了.能力有限只知道他的意思是准备离开应用程序进程,进入ActivityManagerService进程(意味着bundle的数据要在进程间传递);
onActivityResult的源码:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {}

PS: 子类需要重写实现,参数一是请求码,参数二是结果码,参数三是带有回传数据的intent。
-------------------------------------------------------------------------------------
但是还有请求码和结果码:
请求码: 即是标明请求来源,如果多个请求要跳往同一个界面,即可用此区分请求.
结果码: 即是标明结果来源,如果多个结果要回传同一个界面,即可用此区分结果.

看如下的Demo即可明白请求码与结果码的区别使用,示例图如下:

就两个界面:
ActivityA的代码如下:
public class Activity_A extends AppCompatActivity implements View.OnClickListener {

    private Button buttonA;
    private Button buttonB;
    private TextView name;
    private TextView age;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        //完成控件的初始化 和  设置控件的点击事件
        buttonA = (Button) findViewById(R.id.button_a);
        buttonB = (Button) findViewById(R.id.button_b);
        age = (TextView) findViewById(R.id.age);
        name = (TextView) findViewById(R.id.name);
        buttonA.setOnClickListener(this);
        buttonB.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        //ButtonA和ButtonB的请求码,标明请求来源
        int ButtonA = 1;
        int ButtonB = 2;
        switch (view.getId()) {
            case R.id.button_a://设置姓名  //第一个方法
                startActivityForResult(new Intent(Activity_A.this, Activity_B.class), ButtonA);
                break;
            case R.id.button_b://设置年龄  //第一个方法
                startActivityForResult(new Intent(Activity_A.this, Activity_B.class), ButtonB);
                break;
        }
    }
	//第三个方法
    @Override//参数一:请求码,参数二:结果码,参数三,回传参数的intent;
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {   //根据请求码来区别
            case 1: //如果请求码为1,即标明请求动作为设置姓名;
                if (resultCode == 6){  //如果返回码等于6,咱们在界面中指定好了保存姓名的返回码;
                    String Name = data.getStringExtra("name");//获取到返回的字符串
                    name.setText("姓名 :"+Name);             //设置到控件上
                    Toast.makeText(this, "完成了姓名的参数回传", Toast.LENGTH_SHORT).show();
                }
                break;
            case 2: //如果请求码为2,即标明请求动作为设置年龄;
                if (resultCode == 8){  //如果返回码等于8,咱们在界面中指定好了保存年龄的返回码;
                    String Age = data.getStringExtra("age");//获取到返回的字符串
                    age.setText("年龄 :"+Age);             //设置到控件上
                    Toast.makeText(this, "完成了年龄的参数回传", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}



ActivityB的代码如下:
public class Activity_B extends AppCompatActivity {

    private EditText age;
    private EditText name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        age = (EditText) findViewById(R.id.age);
        name = (EditText) findViewById(R.id.name);
        Activity_B.this.findViewById(R.id.saveName).setOnClickListener(new View.OnClickListener() {//保存
            @Override
            public void onClick(View view) {
                int resultName = 6; //姓名的返回码
                String Name = name.getText().toString().trim();  //获取到输入的姓名
                Intent intentName = new Intent();               //创建意图intentName
                intentName.putExtra("name",Name);               //保存参数Name
                Activity_B.this.setResult(resultName,intentName);  //写好返回码Name  //第二个方法
                Activity_B.this.finish();
            }
        });
        Activity_B.this.findViewById(R.id.saveAge).setOnClickListener(new View.OnClickListener() {//保存年龄
           @Override
            public void onClick(View view) {
                int resultAge = 8;  //年龄的返回码
                String Age = age.getText().toString().trim();    //获取到输入的年龄
                Intent intentAge = new Intent();                //创建意图intentAge
                intentAge.putExtra("age",Age);                   //保存参数Age 
                Activity_B.this.setResult(resultAge,intentAge);   //写好返回码Age  //第二个方法
                Activity_B.this.finish();  
            }
        });
    }
}





如有问题请多指正,您的指正使我更正确的前行.
【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功 【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功,附带问题分析详细过程 阅读详情

相关推荐

Cisco Firepower FMCv修改管理Ip方法

Cisco Firepower FMCv修改管理Ip方法

funnycoffee123的博客 1091

Activity的数据传递(startActivityForResult , onActivityResult , setResult 的用法)

Activity的数据传递(startActivityForResult , onActivityResult , setResult 的用法)

qq_36570506的博客 1188

FreeSwitch采用mrcp协议对接科大讯飞asr和tts以及对话系统

FreeSwitch采用mrcp协议对接科大讯飞asr和tts对接过程

shanghaimoon的专栏 8839

startActivityForResult()使用说明

写在前面 实际开发中,不可避免的就是需要在Activity之间传递数据,并接收返回结果继续自己的逻辑操作.这就不得不请出如下几位:startActivity(Intent):最常用和基本的Activity跳转,本篇就忽略了. startActivityForResult(Intent, int):重点 arg1:这个Intent对象可以携带数据. arg2请求码:标识跳转的目标Activity

简单记录 2728

Camera 基础知识

Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组进行效果调试,Raw sensor是目前的主流,数据量比YUV Sensor小(RAW10 格式的sensor 1个pixel 10个bit)使用平台ISP处理,能支持较大的size。不过,相位对焦并不是那么完美,它对光线的要求就比较高,在弱光拍摄环境下,相位对焦就无能威力了。

手机-手表蓝牙开发工程师的博客 3062

zemax光线光扇图

通过入瞳某一坐标(PX,PY)的光线在像面上有唯一的位置(EX,EY),以EX,EY为纵坐标,以PX,PY为横坐标,分别建立坐标系,把通过入瞳的光线都在坐标系里描点就得到了光扇图。对于视场内任意一点,取其子午面内的光线,以光线在光阑面上的透射点坐标为横坐标,同时以该光线在像面上的坐标为纵坐标,描出所有点,构成的图形即为子午面光扇图。在焦点位置,曲线的斜率为0,也就是说,不管入射时的横坐标(光阑面上的位置)是多少,离轴多远,都将汇聚在焦点处。此时,子午面和弧矢面有不同的分布,两条曲线不重合。

fendoudecheng的博客 8096

Android中的onActivityResult和setResult方法的使用

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int re

飘过的春风 1万+

drm 之modes

#define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <time.h&...

u012794472的专栏 3718

startActivityForResult的使用

  startActivityForResult的主要作用就是回传数据。假设我们有两个页面,在第一个页面上有一个按钮,用于进入下一个页面,当进入下一个页面时,进行设置操作,并在其finish动作或者back动作后,将设置的值回传给第一个页面,从而在第一个页面上显示所得到的值。这有点像回调方法,就是在第二个页面finish动作或者back动作后,会回调第一个页面的onActivityResult方法,所以我们可以重写一下这个方法。   startActivityForResult原型如下: startActi

健身房 955

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 147

【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能

在探讨计算机性能优化的旅程中,我们常常被引导去关注算法的复杂度、代码的优化,或是更高效的数据结构。然而,有一个经常被忽视的角色在幕后默默地影响着程序的运行效率——那就是缓存(Cache)。正如哲学家亨利·戴维·梭罗在《瓦尔登湖》中所说:“细节是造成美丽的源泉”,在软件开发的世界里,对缓存的理解和优化,就是那些决定程序性能优雅与否的细节。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3734

一看就会,对startActivityForResult的几种实现方案的调用与封装

startActivityForResult 可以说是我们常用的一种操作了,用于启动新页面并拿到这个页面返回的数据,是两个 Activity 交互的基本操作。

m0_64420071的博客 2623

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4455

Android中使用startActivityForResult启动活动

方法用于启动一个新的活动(Activity)并期望在该活动完成后返回结果数据给调用方。方法启动目标活动,并传递一个请求码(requestCode),用于标识这次启动请求。方法设置结果代码(resultCode)和可选的结果数据(Intent),然后调用。方法来处理需要返回结果的交互场景,从而实现更加灵活和交互性强的应用程序设计。并关闭后被调用,可以在该方法中获取返回的结果数据并进行处理。方法关闭目标活动并返回结果给调用方。方法,该方法会在目标活动调用。在Android开发中,在调用方活动中,通过调用。

微赚淘客系统开发者博客 2490

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Activity之间数据回传【Android、activity回传、结合实例】

在接收数据的Activity中,启动图像选择器,然后在成功选择图像后,将图像的URI传递给发送数据的Activity。在Android应用中,有时需要从一个Activity向另一个Activity传递数据,并在第二个Activity处理后将结果传递回第一个Activity。在项目中创建两个Activity,一个用于发送数据,另一个用于接收和处理数据。),并检查回传的结果码和数据是否符合你的预期,以确保数据回传的成功与否。然后,在按钮的点击事件中,我们启动了图库选择图片的意图。来创建这些Activity。

qq_22841387的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

activity间数据传递--startActivityForResult()&setResult()

一个activity启动另一个activity最简单的方式是使用startActivity()方法,activity调用startActivity()方法时,实际上是把调用请求发送给操作系统的ActivityManager。ActivityManager负责创建Intent中指定activity的实例并调用其onCreate()方法,应用内部交互图 activity间传递数据则要调用startAct

dgeek的博客 5158

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

二十二、startActivityForResult用法详解

一、如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requ...

weixin_34327223的博客 593

【android学习笔记】startActivityForResult与setResult在Activity之间回传值的运用

【使用范围】页面间回传值 【场景】在Page1点击跳转页面Page2,在Page2获取到String传回Page1接收,常用在搜索页面,条件选择页面。 Page1点击跳转代码: Intent intent=new Intent(SearchActivity.this,ChoseClient.class); startActivityForResult(int...

gzyh_tech的博客 1587

Android学习(十三):两个Activity之间相互传数据(双向),使用startActivityForResult

通过上述步骤,第一个Activity启动第二个Activity时传递了请求码(REQUEST_CODE),然后第二个Activity在返回数据给第一个Activity时设置了返回码(RESULT_OK)和传递数据的Intent。方法,并在Intent中添加数据,然后指定一个请求代码以及启动Activity B。方法关闭Activity,同时将带有数据的Intent返回到第一个Activity。方法会被触发,您可以在其中获取结果码和返回的数据。方法,以接收第二个Activity返回的数据。

m0_55939576的博客 971

Android实现数据回传

上一篇文章写了数据传递,这篇level up,来到数据回传。

2301_78008242的博客 1397

startActivityForResult的详细用法

在启动另外一个Activity的时候,有两种方法,一种是直接使用startActivity,另外一种就是使用startActivityForResult。前一种想必大家都明白怎么使用了,我就不废话了。本文主要通过一个Demo来学习一下第二种。 startActivityForResult的主要作用就是它可以回传数据,假设我们有两个页面,首先进入第一个页面,里面有一个按钮,用于进入下一个页面,

善感的人 1322

android startActivityForResult 的简单使用

1、通常情况下我们利用startActivity() 这个方法来开启一个activity,这样做的结果是不能够从后一个activity 把值给传回来,利用startActivityForResult()这个方法,我们可以把值给传回来。下面就是一个小Demo的使用: package com.example.activity; import android.app.Activity; import

专注于技术分享 1574

【android学习笔记】Activity回传值给Fragment,startActivityForResult与setResult在Fragment与Activity中的使用

【概述】使用startActivityForResult能在activity之间进行回传值,最近有需求是在fragment中点击跳转activity选择条件再返回给fragment,发现使用getActivity().startActivityForResult(intent,1001) 并无效果,而是要换成fragment.this.startActivityForResult。 【使用场景】...

gzyh_tech的博客 4538

startActivity和registerForActivityResult的用法

在 Android Kotlin 开发中,和是启动新 Activity 并处理返回结果的两种方式。

XHRK1的博客 1122

安卓-startActivityForResult如何使用

这样,返回的 Intent 中就包含了指定的结果数据,在 MyActivity 的 onActivityResult 方法中可以通过 getStringExtra 等方法获取到返回的数据。返回结果的触发是在被启动的活动(即在上述示例中的 AnotherActivity)结束时发生的。在实际开发中,根据具体的需求来选择使用哪种方法。

weixin_45264683的博客 735

Activity的LaunchMode导致调用系统相册选取图片立即返回RESULT_CANCELED,data为null

转载注明出处:简书-十个雨点如题,最近在做调用系统相册选取图片的功能时,发现在一些手机上就会出现这种问题,具体的现象是使用如下代码选取图片:String IMAGE_UNSPECIFIED = "image/*"; int SELECTPHOTO=10086; Intent intent=new Intent(Intent.ACTION_PICK, android.provider.MediaSto

十个雨点的博客 3389
上一篇: 安卓漫漫路之AndroidManifest权限大全.
下一篇: 安卓漫漫路之AIDL传递简单数据.
谷哥的炊事班班长
博客等级 码龄10年 18粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值