OnActivityResult не вызывается при запуске диалогового действия и воссоздании действий - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть два вида деятельности, A и B. A начинает B с вызова startActivityForResult().B имеет тему @android:style/Theme.Dialog.

Таким образом, B отображается «поверх» A, но A по-прежнему виден (так как B является диалоговым окном).

Когда оба действия запускаются, я принудительно воссоздаю, переключаясь на другоезадание и обратно (я включил опцию «Не сохранять действия» в настройках разработчика Android. Я вижу, что OnCreate вызывается на A и B, когда я возвращаюсь к своей задаче.)

Когда я нажимаю кнопкув действии B он вызывает setResult() и finish(), но onActivityResult() не вызывается на A .

Проблема не появляется

  • если я не принудительно воссоздаю действия

или

  • , если я удалю тему диалога из занятия B.

Я проверял этона Google Pixel с Android 9.

Это ожидаемое поведение или ошибка в Android?


Это код, который я использовал для проверки этого (Xamarin Android):

[Activity(Label = "@string/app_name")]
public class ActivityA : Activity
{

    protected override void OnCreate(Bundle savedInstanceState)
    {
        Kp2aLog.Log("OnCreate A");
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.yubichall_test);

        {
            FindViewById<Button>(Resource.Id.btn_yubichall).Text = "Start B";
            FindViewById<Button>(Resource.Id.btn_yubichall).Click += (sender, args) =>
            {

                var chalIntent = new Intent(this, typeof(ActivityB));

                StartActivityForResult(chalIntent, 123);

            };
        }


    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        Android.Util.Log.Debug("KP2A", "OnActivityResult A: " + requestCode);

    }
}
[Activity(Label = "@string/app_name", Theme = "@android:style/Theme.Dialog")]
public class ActivityB : Activity
{

    protected override void OnCreate(Bundle savedInstanceState)
    {
        Kp2aLog.Log("OnCreate B");
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.yubichall_test);

        FindViewById<Button>(Resource.Id.btn_yubichall).Text = "Return result to A";

        {
            FindViewById<Button>(Resource.Id.btn_yubichall).Click += (sender, args) =>
            {
                SetResult(Result.Ok);
                Finish();

            };
        }


    }
}

где макет yubicall_test равен

    <?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:orientation="vertical"
              android:layout_height="wrap_content">
  <Button android:id="@+id/btn_yubichall"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="yubi challenge"
  />

  <TextView
    android:id="@+id/text_result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
  />

</LinearLayout>

1 Ответ

0 голосов
/ 05 декабря 2018

Я постараюсь объяснить, что здесь происходит.Не сохранять активность используется для имитации поведения нехватки памяти на устройстве, поэтому, когда активность переходит в фоновое состояние (onPause, onStop) и прерывается из-за сбоя памяти, она сохраняет требуемое состояние.Большинство состояний просмотра сохраняются самой ОС Android и отвечает за их восстановление, когда активность возвращается на передний план.

Теперь, согласно вашему сценарию, тема не создает каких-либо проблем в простом виде.Ванильный андроид при запуске действия B. Он будет приостанавливать и останавливать действие A, поскольку оно не является DialogActivity.Это просто тема для диалога.Вы должны проверить это с помощью Xamarin, если он обрабатывает тему диалога по-другому, тогда это может быть проблемой.

Теперь, когда вы переводите действие B в фоновый режим (onPause, onStop), оно также будет убито, так как у вас нет Dont.продолжать деятельностьНо восстановление всех действий (т. Е. B и всего до этого с правильными состояниями просмотра) - это работа ОС Android.Даже если вы видите, что Activity A создается при восстановлении состояния, вы увидите, что все состояния, сохраненные в пакете, восстанавливаются (параметр onCreate of ActivityA).

Другая возможность этого может быть связана с конкретным устройством.Как уже говорилось ранее, это не происходит на обычном Android, но производители (Xiaomi, Samsung) действительно вносят изменения в ОС Android, и это вполне может стать вашей проблемой.Хорошая идея - сначала разработать приложение для простого Android, а затем настроить код для каждого производителя.

...