startActivityForResult中回调setResult注意事项
读 http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html 有感
文中提出了一个核心问题:
Android activity的setResult()在什么时候调用?
他给出了答案:
activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的
什么意思呢:
假设我们有MainActivity和SecondActivity来一次跳转。
package com.example.setresult; import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build; public class MainActivity extends ActionBarActivity { private final static String TAG = MainActivity.class.getSimpleName(); final int requestCode=1;
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.b1);
b1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
startActivityForResult(new Intent(MainActivity.this,SecondActivity.class), requestCode); }
});
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent arg2) {
Log.d(TAG, "resultCode="+resultCode);
switch (resultCode) {
case RESULT_OK:
Log.d(TAG, "ok");
break;
}
super.onActivityResult(requestCode, resultCode, arg2);
} @Override
protected void onRestart() {
Log.d(TAG, "MainActivity onRestart");
super.onRestart();
}
@Override
protected void onResume() {
Log.d(TAG, "MainActivity onResume");
super.onResume();
}
}
package com.example.setresult; import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build; public class SecondActivity extends ActionBarActivity {
private final static String TAG = SecondActivity.class.getSimpleName(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
setResult(RESULT_OK);
} @Override
protected void onStop() { Log.d(TAG, "SecondActivity onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(TAG, "SecondActivity onDestroy");
super.onDestroy();
}
@Override
public void onBackPressed() { Log.d(TAG, "SecondActivity onBackPressed");
super.onBackPressed();
}
@Override
protected void onStart() {
Log.d(TAG, "SecondActivity onStart");
super.onStart();
}
@Override
protected void onPause() { Log.d(TAG, "SecondActivity onPause");
super.onPause();
}
}
07-30 20:15:37.291: D/SecondActivity(30684): SecondActivity onStart
07-30 20:15:39.151: D/SecondActivity(30684): SecondActivity onBackPressed
07-30 20:25:18.531: D/SecondActivity(32594): SecondActivity onPause
07-30 20:15:39.161: D/MainActivity(30684): resultCode=-1
07-30 20:15:39.161: D/MainActivity(30684): RESULT_OK
07-30 20:15:39.161: D/MainActivity(30684): MainActivity onRestart
07-30 20:15:39.161: D/MainActivity(30684): MainActivity onResume
07-30 20:15:39.501: D/SecondActivity(30684): SecondActivity onStop
07-30 20:15:39.501: D/SecondActivity(30684): SecondActivity onDestroy
当从SecondActivity按返回键的时候,发生以上日志。可以看见resultCode=-1是正确的
但是当你把
setResult(RESULT_OK);
这句话放到SecondActivity Onstop()中
就会发生以下日志:
07-30 20:19:31.521: D/SecondActivity(31785): SecondActivity onStart
07-30 20:19:35.031: D/SecondActivity(31785): SecondActivity onBackPressed
07-30 20:25:18.531: D/SecondActivity(32594): SecondActivity onPause
07-30 20:19:35.051: D/MainActivity(31785): resultCode=0
07-30 20:19:35.051: D/MainActivity(31785): MainActivity onRestart
07-30 20:19:35.051: D/MainActivity(31785): MainActivity onResume
07-30 20:19:35.381: D/SecondActivity(31785): SecondActivity onStop
07-30 20:19:35.381: D/SecondActivity(31785): SecondActivity onDestroy
resultCode=0 说明setResult没有成功
可见当onBackPressed事件发生后,activity会直接掉finish()方法,这时候resultCode就已经返回给前一个Activity了,所以就得到默认值resultCode=0
由此得出一个结论
setResult()调用必须要在OnPause()之前
startActivityForResult中回调setResult注意事项的更多相关文章
- 关于Array的map方法中回调函数参数的问题
开门见山,我们先来看两个例子. var arr=['1','4','9','16']; var r=arr.map(Math.sqrt); 猜猜r的结果会是多少? 没错就是 [1,2,3,4] 我们再 ...
- $.getJSON('url',function(data){}) 中回调函数不执行
$.getJSON('url',function(data){}) 中回调函数不执行 url 中的 json 格式不正确 ,浏览器返回并没有报错 {'湖北':[114.11438,30.849429] ...
- C++中回调函数(CallBack)的使用
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...
- Android中回调接口的使用
MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
- Android jni中回调java的方法
在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...
- unity3d 资源文件从MAX或者MAYA中导出的注意事项
unity3d 资源文件从MAX或者MAYA中导出的注意事项 1.首先,Unity3d 中,导出带动画的资源有2种导出方式可以选择: 1) 导出资源时,只导出一个文件,保留模型,骨骼和所 ...
- Windows编程中回调函数的使用心得(MFC篇)
回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...
- delphi中httpencode使用注意事项
delphi中httpencode使用注意事项 一.uses HTTPApp二.使用前要用UTF8Encode转换成utf-8编码HTTPEncode(UTF8Encode(Text));不然和标准的 ...
随机推荐
- iOS 无限轮播图的两种实现
首先说一下实现的思想: 用UIScrollView实现,在scrollView上添加3个UIImageView,分别用来显示上一张图片,当前显示的图片,下一张图片.scrollView在不滑动的时候永 ...
- android如何保存读取读取文件文件保存到SDcard
android如何保存读取读取文件文件保存到SDcard 本文来源于www.ifyao.com禁止转载!www.ifyao.com 上图为保存文件的方法体. 上图为如何调用方法体保存数据. 上面的截图 ...
- 【转】10 个迅速提升你 Git 水平的提示
最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用 ...
- Java根据字节数据判断文件类型
通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...
- 基于cygwin构建u-boot(三)make错误忽视
接上文,修改gcc 的-std标准后,.depend文件处理仍然出现了错误: 五.错误:make中命令报错(sed找不到需要的文件) 错误告警如下: make -C examples/api all ...
- HTML中select标签单选多选详解
select 元素可创建单选或多选菜单.当提交表单时,浏览器会提交选定的项目,或者收集用逗号分隔的多个选项,将其合成一个单独的参数列表,并且在将 <select> 表单数据提交给服务器时包 ...
- [LA] 3027 - Corporative Network [并查集]
A very big corporation is developing its corporative network. In the beginning each of the N enterpr ...
- HornetQ
https://github.com/flsusp/http-queue https://github.com/sfr-network-service-platforms/hq-console htt ...
- POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...
- spoj 104 Highways (最小生成树计数)
题目链接:http://www.spoj.pl/problems/HIGH/ 题意:求最小生成树个数. #include<algorithm> #include<cstdio> ...