Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
358 views
in Technique[技术] by (71.8m points)

android - Why oncreate method called after startActivityForResult?

In my application i want to select image from Gallery and set the image in ListView. In my ListViewI have 16 rows. So when ever item click inListViewopen the gallery and set the image toListView. But my problem is some times afterstartActivityForResult(),oncreate()` method called. This is the onclick code

Intent intent = new Intent(
                            Intent.ACTION_PICK,
                            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(intent, "Select File"),
                            SELECT_PICTURE);

And this is the onactivityresult

public void onActivityResult(int requestcode, int resultcode, Intent data) {
    Log.e("result", "result");
    displayMetrics = this.getResources().getDisplayMetrics();
    Ew = displayMetrics.widthPixels;
    Eh = displayMetrics.heightPixels;

    switch (requestcode) {
    case SELECT_PICTURE:
        if (resultcode == RESULT_OK) {

            lelListLayout.setVisibility(View.GONE);
            relImageLayout.setVisibility(View.VISIBLE);


            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);

            ExifInterface exif = null;
            // Bitmap bmRotated = null;

            try {
                exif = new ExifInterface(selectedImagePath);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);
            Log.e("Orientation==>", "" + orientation);

            try {

                bmRotated = null;
                bmGallayImage = null;
                trimCache();
                bmGallayImage = convertBitmap(selectedImagePath);
                bmRotated = InventorySubmitImagesActivity.rotateBitmap(
                        bmGallayImage, orientation);

                // if(bmRotated.getWidth()>bmRotated.getHeight()){
                if (bmRotated.getWidth() > 1024) {
                    float x = 0;
                    x = 1024 / (float) bmRotated.getWidth();
                    // Log.e("x====","value "+x);

                    bmRotated = Bitmap.createScaledBitmap(bmRotated, 1024,
                            (int) (bmRotated.getHeight() * x), true);
                }
                /*
                 * }else{ if(bmRotated.getHeight() > 1024){ float x=0;
                 * x=1024/(float)bmRotated.getHeight();
                 * Log.e("x====","value "+x);
                 * 
                 * bmRotated = Bitmap.createScaledBitmap(bmRotated,
                 * (int)(bmRotated.getWidth()*x), 1024, true); } }
                 */


                Eh = Eh - ll_buttonlayout.getHeight();


                float iw = bmRotated.getWidth();
                float ih = bmRotated.getHeight();



                float diff = Ew / iw;

                float layoutwidth = Ew;
                float layoutheight = diff * ih;

                if (layoutheight > Eh) {

                    diff = Eh / ih;
                    layoutwidth = Ew * diff;
                    layoutheight = Eh;
                }

                bmGallayImage = bmRotated;
                if (bmRotated != null) {

                    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                            (int) layoutwidth, (int) layoutheight);
                    relImage.setLayoutParams(layoutParams);


                    Drawable dr = new BitmapDrawable(bmRotated);
                    old_width = bmRotated.getWidth();
                    old_height = bmRotated.getHeight();

                    relImage.setBackgroundDrawable(dr);

                }
                left = (int) layoutwidth / 2 - 34;
                top = (int) layoutheight / 2 - 8;

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // drag_check=true;
            relImage.removeAllViews();

            imgMarker = new ImageView(this);
            final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);
            relImage.addView(imgMarker, layoutParams);
            imgMarker.setScaleType(ImageView.ScaleType.MATRIX);
            bmdragImage = BitmapFactory.decodeResource(getResources(),
                    R.drawable.image_marker);
            imgMarker.setImageBitmap(bmdragImage);

            matrix = new Matrix();
            savedMatrix = new Matrix();
            oldDist = 0f;
            start = new PointF();
            mid = new PointF();

            matrix.postTranslate(left, top);
            imgMarker.setImageMatrix(matrix);

            imgMarker.setOnTouchListener(RefurbishmentImageActivity.this);
            imgMarker.setVisibility(View.VISIBLE);

            // end..
            // }

        }
        break;

} }

In this ListView after selecting 6 or 7 images oncreate method called, before the onactivityresult(). But after oncreate() method again startactivity result called. Please guide me what is the problem. Thanks InAdvance to all..

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

before the onactivityresult(). But after oncreate() method again startactivity result called

when Activity is sent to background (when other activity becomes on top of it, or when it is sent by the home button to background) its instance is kept alive as long as the system is not under memory pressure. when the system doesn't have enough memory to do whatever it's currently doing in foreground, it usually will re-claim memory by stopping and releasing from memory background activities.

in that case - the system provide you with the Activity.onSaveInstanceState callback which will be invoked from the activity that's going to be killed to provide you a chance to save any state needed to be saved before it's being killed.

when your activity will return to foreground - it will be re-created (that's why onCreate() called again), with savedInstanceState parameter that will not be null.

the savedInstanceState will hold bundle with all the extras you provided in the onSavedInstanceState() callback.

this is very important to understand.

for better understanding, I advise you to read seriously - http://developer.android.com/training/basics/activity-lifecycle/recreating.html


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...