安卓漫漫路之startActivityForResult的使用.
来源:互联网 发布:windows确认证书 编辑:程序博客网 时间:2024/06/05 01:06
在项目的界面跳转时需要用到数据回传.
可以使用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(); } }); }}
如有问题请多指正,您的指正使我更正确的前行.
2 0
- 安卓漫漫路之startActivityForResult的使用.
- 安卓漫漫路之可移动的按钮.
- 安卓漫漫路之实现简单的弹幕.
- 安卓漫漫路之缓存策略.
- 安卓漫漫路之WebSettings设置大全.
- 安卓漫漫路之读取本地html文件.
- 安卓漫漫路之Echarts显示k线图.
- 安卓漫漫路之AndroidManifest权限大全.
- 安卓漫漫路之AIDL传递简单数据.
- 安卓漫漫路之BitmapFactory高效加载Bitmap.
- 安卓笔记之StartActivityForResult
- 安卓漫漫路之碎片Fragment不同包下的区别.
- android之startActivityForResult的使用
- Android之startActivityForResult的使用
- android之startActivityForResult的使用
- android_activity之startActivityForResult的使用
- 安卓漫漫路之集成三方短信SDK(MOB.com).
- Android学习之路之startActivityForResult和setResult的使用
- Eclipse 打开Eclipse Marketplace报错:Cannot open Eclipse Marketplace
- 直接插入排序
- RMAN 备份与恢复深入解析1
- emplace_back() 和 push_back 的区别
- gradle安装
- 安卓漫漫路之startActivityForResult的使用.
- Android原生APP中添加ReactNative 进行混合开发教程
- 16.约束关系
- scp、ssh无密码使用
- 如何配置 tomcat
- 使用html5实现rstp视频流播放
- 复制代码 全排列
- 通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明。--问题的原因及解决方案
- codeforces 484E Sign on Fence