Переменные класса, установленные в onActivityResult, сбрасываются при возврате метода - PullRequest
6 голосов
/ 16 января 2010

У меня есть действие, которое позволяет пользователю выбрать номер телефона. Естественно, я бы хотел, чтобы мой класс запомнил идентификатор выбранного контакта, поэтому я сохраняю его в поле класса. Однако, когда метод onActivityResult возвращает, моя переменная класса сбрасывается. Вот что я пытаюсь сделать:

    Intent intent = new Intent(Intent.ACTION_PICK, People.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT); 

    ...

    public void onActivityResult(int reqCode, int resultCode, Intent intent){
        super.onActivityResult(reqCode, resultCode, intent);       
        switch(reqCode){
            case(PICK_CONTACT):
                if(resultCode == Activity.RESULT_OK){
                    Uri contactData = intent.getData();
                    Cursor c = managedQuery(contactData, null, null, null, null);
                    if(c.moveToFirst()){
                        contactName = c.getString(c.getColumnIndexOrThrow(People.NAME));
                        contactId = c.getInt(c.getColumnIndexOrThrow(People._ID));

        break;

Когда я устанавливаю точку останова в этом методе, значения для contactName и contactId соответствуют ожидаемым, однако, как только метод возвращается, значения каким-то образом возвращаются к своим значениям по умолчанию. Я явно что-то упускаю, но я не уверен, что делаю неправильно или забыл.

Спасибо!

Ива

Ответы [ 3 ]

2 голосов
/ 04 июня 2018

Возможно, что ваш Activity приостановлен и воссоздан.

По сути, если намерение, которое вы запускаете с помощью startActivityForResult, достаточно ресурсоемкое, ОС, возможно, придется приостановить вашу активность, чтобы освободить ресурсы.

Таким образом, он сохраняет то, что может, и затем, возвращаясь из намерения к вызову onActivityResult, должен заново создать свою активность. Любые переменные экземпляра будут сброшены в этом случае.

Вы можете обойти это, перезапустив устройство или обработав его с помощью onSaveInstanceState и onRestoreInstanceState.

Подробнее читайте здесь: Почему метод oncreate вызывается после startActivityForResult?

0 голосов
/ 15 января 2019

Может быть, ваша конфигурация меняется, когда вы открываете новую активность. Попробуйте поставить configChanges на свою активность в AndroidManifest.

android:configChanges="orientation|keyboardHidden|screenSize"
0 голосов
/ 29 апреля 2015

Не уверен, если вам все еще нужна помощь с этим. onActivityResult вызывается перед onResume, когда ваша деятельность перезапускается. Убедитесь, что вы не сбрасываете значения переменных в onResume.

Вы получите этот вызов непосредственно перед onResume (), когда ваша деятельность возобновится.

http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...