首页 > 学院 > 开发设计 > 正文

安卓漫漫路之startActivityForResult的使用.

2019-11-08 00:31:22
字体:
来源:转载
供稿:网友

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

可以使用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();              }        });    }}.如有问题请多指正,您的指正使我更我正确的前行.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表