启动对话框活动和重新创建活动时未调用OnActivityResult

时间:2018-11-24 08:06:42

标签: android xamarin.android dialog android-lifecycle

我有两个活动,A和B。A通过调用startActivityForResult()来开始B。 B具有主题@android:style/Theme.Dialog

因此,B显示在A的“上方”,但是A仍然可见(因为B是一个对话框)。

当两个活动都启动时,我通过切换到另一个任务来强制娱乐并返回(我在android开发人员设置中启用了“不保留活动”选项。我看到返回时在A和B上调用了OnCreate来完成我的任务。)

当我单击活动B中的按钮时,它会调用setResult()finish(),但是onActivityResult() 不会在A上被调用

问题没有出现

  • 如果我不强迫娱乐活动

  • 如果我从活动B中删除对话框主题。

我在装有Android 9的Google Pixel上进行了测试。

这是预期行为还是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 :(得分:0)

我将尝试解释这里发生的事情。不保持活动用于模仿设备上的低内存行为,因此当活动进入后台状态(onPause,onStop)并由于内存中断而被杀死时,它将保存所需的状态。大多数视图状态由Android OS本身保存,并在活动回到前台时负责恢复它们。

现在根据您的情况,启动活动B时,主题似乎在普通Vanilla android中未产生任何问题。由于它不是DialogActivity,因此将暂停和停止活动A。它只是以Dialog为主题。您应该使用Xamarin进行验证,如果它对待Dialog Theme的方式不同,则可能是一个问题。

现在,当您将活动B置于后台(onPause,onStop)时,由于您没有继续进行活动,它也会被杀死。但是,恢复所有活动(即B和之前所有具有正确View状态的活动)是Android OS的工作。即使您看到在恢复状态时创建活动A的情况,也会看到捆绑中保存的所有状态都得到了还原(ActivityA的onCreate的参数)。

发生这种情况的另一种可能性可能是特定于设备的。如前所述,在普通Android上不会发生这种情况,但是制造商(小米,三星)确实对Android OS进行了修改,这很可能是您的问题。首先开发适用于普通Android的应用,然后为每个制造商自定义代码是一个好主意。