2012-06-06 3 views
3

Я разрабатываю приложение phonegap, которое использует камеру. В ситуациях с низкой памятью, когда камера запускается, мое приложение убивается системой, иногда без вызова метода onDestroy() (теперь я знаю, что гарантируется только onPause()).startActivityForResult() в ситуациях с низкой памятью

Я могу переопределить метод onPause() (в javascript или java) для хранения статуса приложения и восстановить его при перезапуске приложения. Проблема в том, что файл uri изображения потерян, и мое приложение не может его получить.

Вы знаете какой-либо способ в Android для вызова моей функции обратного вызова, когда камера возвращает изображение uri, и мое приложение было убито? Любое обходное решение?

Я думаю, что эта проблема является общей для всех разработок Android, которые используют startActivityForResult(), но я не нашел никакого решения.

Заранее спасибо ;-)

ответ

0

Мое решение сохранить файл в URI SharedPreferences и восстановить его в onResume.

Я столкнулся с такой же ситуацией: у меня есть список фотографий, и нажмите одну фоторамку в списке фотографий, чтобы вызвать приложение камеры для Android, чтобы сделать снимок. Иногда (например, 2% использования), когда вы возвращаетесь из приложения для камеры на базе Android, изображение не отображается в самой фоторамке, как ожидалось. Я был озадачен и не мог понять, что произошло. Пока один из моих коллег не установил «не продолжать действия» в «вариантах разработчика», и все время сталкивался с ошибкой, тогда я знал, что это проблема убиваемой деятельности.

Ниже приведены некоторые код, чтобы продемонстрировать мое решение:

public static class PhotoOnClickListener implements OnClickListener { 
      ... 
      intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      activity.fileUri[index] = getOutputMediaFileUri(MEDIA_TYPE_IMAGE, "xxxxxx"); 
      activity.saveKeyValue("game_photo_list_file_uri_" + index, activity.fileUri[index].toString()); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, activity.fileUri[index]); 
      activity.startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
      ... 
    } 

private void tryRecoverFromBeingKilledOfLowMemory() { 
    String s; 
    for (int i = 0; i < fileUri.length; i++) { 
     s = readKey("game_photo_list_file_uri_" + i); 
     if (s != null) { 
      fileUri[i] = Uri.parse(s); 
      updatePhoto(i); 
     } 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (readKey("from_game_main") != null) { 
     removeKeysPrefixedBy("game_photo_list"); 
     removeKey("from_game_main"); 
     removeKey("uploader_id"); 
    } 

    tryRecoverFromBeingKilledOfLowMemory(); 
} 

В коде:

  1. ReadKey, saveKeyValue, removeKey, removeKeysPrefixedBy унаследованы от CommonActivity выступает в качестве общей операции по SharedPrefeneces.
  2. Ключ from_game_main указал, что текущее резюме является нормальным и должно начинаться с пустого списка фотографий. Ключ from_game_main сохраняется непосредственно перед startActivity в GameMainActivity. Другое мудрое, текущее резюме - это восстановление от смерти от низкой памяти.

Надеюсь, что это поможет.

0

Прямо перед startActivity, попробуйте установить флаг на сэкономленные намерении поверхность его, а не убивать и перезапустить его:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

Смотрите мой пост здесь: https://stackoverflow.com/a/29630548/2782404

Смежные вопросы