Android初级开发第八讲--之startActivityForResult方法讲解
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved !
首先我们要解释一下,为什么要用这个方法?一般情况下我们使用intent来实现两个Activity之间的传递,但当前Activity需要下个Activity处理完毕返回一个值,但不通过跳转的方式,这时我们就要用到这个方法。
一台手机设备就是一硬件设备,里面跑的一个个程序就相当于一个个虚拟机,每个应用程序都是独立存在的;也可以说手机是Administrator,各应用程序是guest用户,QQ是一个guest,新浪微博也是一个guest……各自在各自的进程中处理事件,但这些guest 可以通过一定手段如广播和Service来互相通信,或者监控手机的运行状态,一旦手机关机,所有guest用户均被关闭,下次开启时根据每个guest的不同需求,注册开机启动权限,你的应用就会在开机时被启动。
此后介绍开发权当上述知识读者已知。
应用场景:如照相程序,调用系统的照相机,即一个intent事件,将要保存地址传给系统,然后在onActivityResult对路径进行处理就可以了。
前提:
使用startActivityForResult方法的Activity的launchMode不能是singleTask或singleInstance,否则不能回传数据,被启动的Activity无限制。
实现方法:
1、在A中写明跳转方法,注意requestCode值要与onActivityResult中switch变量一致。
case R.id.launch_btn12: Intent intent = new Intent(this, SpinnerActivity.class); startActivityForResult(intent, 101);
2、在A中实现onActivityResult方法,作为回调后使用
if (resultCode != RESULT_OK) { return; } switch (requestCode) { case 101: String taskId = data.getStringExtra("taskId"); launch_tx12.setText(taskId); break; default: break; }
3、在B中使用setResult方法返回传递的值
Intent intent=new Intent(); intent.putExtra("taskId","SpinnerActivity" + getTaskId() ); setResult(RESULT_OK,intent);
这样,就可以利用回调事件来处理数据,而不用setClass,同样可以传递数据,减少了内存的消耗。
如果没有执行onActivityResult可能的原因如下:
1、A中startActivityForResult第二个参数和B中setResult中第一个参数大小一样,导致B返回时找不到A
2、A的launchMode不能设为singleInstance,singleTask,其他值都能设。
3、setResult应在finish方法之前执行,同时A不能被销毁。
注:super方法可以最前面,可写最后面,B中不必非setClass