选择图片后为什么要重置getApplication信息?

时间:2013-08-11 06:15:20

标签: android-intent android

我有一个名为AbstractEntryActivity的抽象活动。两项活动ModifyEntryActivityAddEntryActivity扩展了它。

我还有一个全球Application我打电话给getApplication,我把信息放在全球。在我的情况下,列表

在我的抽象活动中,我打算采取或选择这样的图片:

public void onPickPicture(View view) {

    Intent pickIntent = new Intent();
    pickIntent.setType("image/*");
    pickIntent.setAction(Intent.ACTION_GET_CONTENT);

    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Intent chooserIntent = Intent.createChooser(pickIntent,
            getString(R.string.dialog_pick_picture_title));
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
            new Intent[] { takePhotoIntent });

    startActivityForResult(chooserIntent, Constants.SELECT_PICTURE);
}

我还有一个处理图片的方法onActivityResult。但在被调用之前,调用方法onCreate(有时,调用onActivityResult而不是onCreate)

在我的抽象活动的第一次onCreate调用中,我检查了我的应用程序列表的内容:它没有问题(既不是空的也不是空的)。 现在,当我从画廊回来时,我调用了getApplication,我放入的List是null。

以下是摘要活动的onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_add_entry);
   // Get all views ...
   ...
   mApp = (MyApplication) getApplication();
   Log.d(TAG, "mApp = "+mApp);
   Log.d(TAG, "mApp.getList() = "+mApp.getList()); // HERE it is NULL on 2nd call
   // Init date
   initDate();
   // Init all fields
   initFields() ;
   // getSupportActionBar
   ...
}

我不明白的是:

  • AddEntryActivityModifyEntryActivity上,onCreate是相同的(对super.onCreate的简单调用)
  • ModifyEntryActivity上,我在第二次调用时得到mApp.getList = null
  • 似乎大部分时间,在AddEntryActivity中,mApp.getList返回正确的值。 等等,我再次尝试,但情况并非总是如此

我真的不明白这里发生了什么,为什么它总是表现不一样。 我不确切知道我改变了什么,但在今天之前,它工作正常。

N.B。如果我更改图片,一切都很好,并且正确添加/修改了条目

请问你帮我找错了吗?

1 个答案:

答案 0 :(得分:0)

我发现了什么问题。

当我启动拍摄/选择图片的意图时,我实际上离开了应用程序(我认为它被杀死了),当我回到它时,getApplication检索到的应用程序再次被清除所有价值观。

为了解决这个问题,我必须覆盖方法onSaveInstanceState才能将列表的值放入其中 - 并检索onCreateonRestoreInstanceState中的值。之后,我可以再次使用getApplication().setList(myRetrievedList)在我的应用程序中设置列表。为了记录,我将重写方法放在抽象活动中。

由于我想保留的数据是自定义列表,因此我必须实现Parcelable,以便我可以将其放入捆绑包中。

我不知道这是否是解决这个问题的最佳方式,所以请随意提出更好的解决方案。