Android活动重新创建两次(相机照片意图)

时间:2015-08-17 02:54:04

标签: android android-intent android-activity android-fragmentactivity

我花了一天时间处理这个问题。一开始我有很多泄漏,我解决了它们,但仍然不满意结果 该任务很简单,可以启动相机,拍照,将其保存到指定的路径,并在成功拍摄照片后获得活动结果。
看起来很简单。
让我来描述我的执行顺序 我有项目列表,当我点击任何项目全屏对话框出现时,通过回调活动通知用户想要拍照并按意图开始相机活动,拍摄照片并返回调用活动的结果。
有一些代码片段。

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.e("ON ACTIVITY CREATE !!");
            setContentView(R.layout.my_layout); 
         }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Log.e("ON ACTIVITY RESULT !!");
            if (requestCode == PHOTO_REQUEST) {
                if (resultCode == RESULT_OK) {
                    mAfterTakingPhoto = true;
                    mPreferences.edit().putBoolean("after_photo", mAfterTakingPhoto).apply();
                }
            }
        }
            @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            Log.e("ON RESTORE INSTANCE");
            mImagePath = savedInstanceState.getString("image_path");
            Log.e("RESTORED VALUES " + mImagePath  + " " + mAfterTakingPhoto);
        }

        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            Log.e("ON SAVE INSTANCE");
            outState.putString("image_path", mImagePath);
            Log.e("SAVING VALUES " + mImagePath  + " " + mAfterTakingPhoto);
        }

        @Override
        protected void onResume() {
            super.onResume();
            Log.e("ON RESUME !!!" + " mAfterTaking a photo " + mAfterTakingPhoto);
            mAfterTakingPhoto = mPreferences.getBoolean("after_photo", false);
        }
   @Override
    protected void onDestroy() {
        Log.e("ON ACTIVITY DESTROY");
        // Do some cleanup stuff
        super.onDestroy();
    }

开始拍摄照片(对话回调)

@Override
    public void onTakePhotoRequest() {
            mImagePath = PHOTO_DIR.getAbsolutePath() + File.separator + filename;
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mImagePath));
            startActivityForResult(cameraIntent, PHOTO_REQUEST);
    }   

有时候它很有效,当调用活动是活着的时候,但当它被破坏时会发生一些疯狂的事情。

以下是成功执行的日志。

    com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --SAVING VALUES /mnt/sdcard/Pictures/photos/08_17_2015 02_28_02.jpg 32 false
com.example.app E/Log﹕ --ON ACTIVITY RESULT !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo true

这是奇怪的执行日志。

com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --SAVING VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON ACTIVITY DESTROY
com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESTORE INSTANCE
com.example.app E/Log﹕ --RESTORED VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --ON ACTIVITY RESULT !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo true
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --SAVING VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON ACTIVITY DESTROY
com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESTORE INSTANCE
com.example.app E/Log﹕ --RESTORED VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false

正如你所看到的,活动被破坏而不是再次创建,恢复,onActivityResult等等,然后突然它被再次销毁并重新创建,但没有onActivityResult回调,它使屏幕变黑几秒钟 此外,列表似乎重新创建了三次然后崩溃 有趣的事情,活动在拍照时不在背景中被破坏,但是在照片按钮点击(照相机活动正在关闭)。 我已经尝试了所有我知道的东西,我已禁用所有第三方库,并使此活动继承SherlockFragmentActivity类。所以问题就在这里,但我不知道,几乎尝试了所有事情 请帮助解决这个问题,这里有什么问题或者这个错误。 我不知道该怎么做。

P.S。 BTW我正在使用Genymotion Emulator定制手机,我试过另一款索尼Xperia平板电脑没有这样的行为。

0 个答案:

没有答案