startActivityForResult和onActivityResult的理解

来源:互联网 发布:淘宝联盟什么时候结算 编辑:程序博客网 时间:2024/06/13 04:57

       这两天追一个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