Активность создается дважды на Android

Прежде всего, я новичок в Android-разработке, поэтому, пожалуйста, будьте терпеливы со мной.

Я начну с пользовательского интерфейса. У меня есть кнопка, нажатие на которую запускает действие для получения результата.

public class GUIActivity extends Activity

    @Override
    public void onClick(....){
        Intent intent = new Intent(getApplicationContext(), GetImageActivity.class);
        intent.putExtra("action", FROM_CAMERA);
        startActivityForResult(intent, GET_IMAGE);
    }

    @Override
    onActivityResult(int requestCode, int resultCode, Intent data){
        Log(TAG, "onActivityResult");
        //handle result
    }

}

Класс GetImageActivity является оболочкой для двух других действий: одно для захвата изображения с камеры, а другое для получения его из галереи. Он возвращает объект Uri выбранного изображения.

public class GetImageActivity extends Activity{
    private Uri mediaUri;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        int action =  extras.getInt("action");

        Log.d(TAG, "onCreate");

        switch(action){
            case FROM_CAMERA:
                mediaUri = Uri.fromFile(new File(....));
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri);

                Log.d(TAG, "Calling camera activity"
                startActivityForResult(intent, action);
                break;
            case FROM GALLERY:
                //...
        }            
    }

    @Override
    onActivityResult(int requestCode, int resultCode, Intent data){
        Log.d(TAG, "onActivityResult");

        switch(requestCode){
            case FROM_CAMERA:
                if(resultCode == Activity.RESULT_OK){
                    Intent data = new Intent();
                    data.putExtra("uri", mediaUri);
                    setResult(Activity.RESULT_OK, data);
                    finish();
                }else{
                    Log.e(TAG, "Camera activity failed!");
                    setResult(Activity.RESULT_CANCELED);
                    finish();
                }
                break;

            case FROM_GALLERY:
                //...

        }
    }
}

Вот что должно произойти, когда пользователь нажмет кнопку:

  • Должна начаться активность камеры.
  • Как только пользователь делает снимок, он должен отправить свой URI классу GUI.

Иногда (обычно с вероятностью 50%) все работает как положено, но иногда происходит следующее:

  • Начинается активность камеры.
  • Пользователь делает снимок.
  • Активность камеры начинается СНОВА.
  • Пользователь может сделать еще один снимок или вернуться назад.
  • В любом случае URI, возвращающий класс GUI, не существует.

Я добавил пару строк журнала отладки, чтобы проследить последовательность событий.Когда я получаю плохое поведение, это вывод, который я получаю:

  • GetImageActivity - onCreate
  • GetImageActivity - Calling Camera Activity

Камера открывается, и как только я сделал снимок, она говорит:

  • GetImageActivity - onCreate (снова)
  • GetImageActivity — вызов действия камеры
  • GetImageActivity — onActivityResult

Камера открывается во второй раз. Пользователь делает еще один снимок и:

  • GetImageActivity - onActivityResult
  • GUIActivity - onActivityResult

Итак, мой вопрос... что может привести к тому, что GetImageActivity будет вызываться дважды?

9
задан Juan Enrique Muñoz Zolotoochin 6 March 2012 в 00:54
поделиться