这两天追一个bug是因为onActivityResult没有被回调,所以把startActivityForResult和onActivityResult的理解简单总结下。
Intent intent = new Intent();
intent.putExtra(ActivityManagerMemoryClassLaunchActivity.MEMORY_CLASS_EXTRA,memoryClass);
setActivityIntent(intent);
ActivityManagerMemoryClassLaunchActivity activity = getActivity();(调用这个函数之后会启动该activity)
就会调用ActivityManagerMemoryClassLaunchActivity的onCreate函数,如下:
public classActivityManagerMemoryClassLaunchActivity extends Activity {
public static final StringMEMORY_CLASS_EXTRA = "activityMemoryClass";
private static final int TEST_ACTIVITY_REQUEST_CODE= 1337;
private final CountDownLatch mLatch = newCountDownLatch(1);
private int mChildResult = RESULT_CANCELED;
private static final String TAG ="ActivityManagerMemoryClassLaunchActivity";
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
// Start the activity that runs in aseparate process to do the actual testing,
// since the test itself cannot startan activity in a separate process. A separate
// process is used to avoid includingthe overhead of the test instrumentation process.
Intent intent = getIntent();
int memoryClass =intent.getIntExtra(MEMORY_CLASS_EXTRA, -1);
Intent testIntent = new Intent(this,ActivityManagerMemoryClassTestActivity.class);
testIntent.putExtra(MEMORY_CLASS_EXTRA,memoryClass);
Log.d(TAG, "onCreate-------> resultCode="+ TEST_ACTIVITY_REQUEST_CODE);
startActivityForResult(testIntent,TEST_ACTIVITY_REQUEST_CODE);(执行该语句会调用ActivityManagerMemoryClassTestActivity)
}
@Override
protected void onActivityResult(intrequestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode, data);
if (requestCode == 1337) {
synchronized (this) {
Log.d(TAG," onActivityResult-------> resultCode="+ resultCode);
mChildResult = resultCode;
}
} else {
throw newIllegalStateException("Request code: " + requestCode);
}
}
ActivityManagerMemoryClassTestActivity:
/**
* {@link Activity} that allocates arrays of256k until reaching 75% of the specified memory class.
*/
public classActivityManagerMemoryClassTestActivity extends Activity {
private static final String TAG ="ActivityManagerMemoryClassTest";
private static final doubleFREE_MEMORY_PERCENTAGE = 0.75;
private static final int ARRAY_BYTES_SIZE =256 * 1024;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent intent = getIntent();
int memoryClass =
intent.getIntExtra(ActivityManagerMemoryClassLaunchActivity.MEMORY_CLASS_EXTRA,-1);
new AllocateMemoryTask(memoryClass).execute();
}
private class AllocateMemoryTask extendsAsyncTask<Void, Void, Void> {
private final int mMemoryClass;
AllocateMemoryTask(int memoryClass) {
this.mMemoryClass = memoryClass;
}
@Override
protected Void doInBackground(Void...params) {
int targetMbs = (int) (mMemoryClass* FREE_MEMORY_PERCENTAGE);
int numArrays = targetMbs * 1024 *1024 / ARRAY_BYTES_SIZE;
Log.i(TAG, "Memory class:" + mMemoryClass + "mb Target memory: "
+ targetMbs + "mbNumber of arrays: " + numArrays);
byte[][] arrays = newbyte[numArrays][];
for (int i = 0; i <arrays.length; i++) {
Log.i(TAG, "Allocatingarray " + i + " of " + arrays.length
+ " (" + (i *ARRAY_BYTES_SIZE / 1024 / 1024) + "mb)");
arrays[i] = newbyte[ARRAY_BYTES_SIZE];
}(我遇到的问题是在这里new空间的时候fail了,所以一直没有return,导致没有执行finish(),所以没有回调onActivityResult。而这里之所以new失败了,是因为vm.heapsize的设置不太对,关于修改vm.heapsize,可见我的另一篇博文http://blog.csdn.net/holdrise/article/details/8476352)
Log.i(TAG,"doInBackground ");
return null;
}
@Override
protected void onPostExecute(Voidresult) {
Log.i(TAG, "onPostExecutecome in come in come in ");
super.onPostExecute(result);
setResult(RESULT_OK);
Log.i(TAG, "onPostExecutefinish-------------------- ");
finish();(执行完finish之后,会跳回执行之前activity的onActivityResult函数)
}
}
}
第二个activity起来的时候前一个activity的状态会变成paused。
关于onActivityResult的理解我也参考了如下的博文:
http://blog.csdn.net/ghd2000/article/details/5716894
http://elvajxw.iteye.com/blog/883612