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

Android 启动对话活动和重新创建活动时未调用OnActivityResult,android,xamarin.android,dialog,android-lifecycle,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(),但在活动B中不会调用onActiv

我有两个活动,A和B。A通过调用
startActivityForResult()
启动B。B有主题
@android:style/theme.Dialog

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

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

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

问题没有出现

  • 如果我不强迫娱乐的活动

  • 如果我从活动B中删除对话框主题
我用安卓9在谷歌像素上测试了这个

这是预期的行为还是Android中的bug


这是我用来测试它的代码(Xamarin Android):

[活动(标签=“@string/app_name”)]
公共课活动A:活动
{
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
Kp2aLog.Log(“OnCreate A”);
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.yubichall_测试);
{
findviewbyd(Resource.Id.btn\u yubichall).Text=“启动B”;
FindViewById(Resource.Id.btn_yubichall)。单击+=(发送方,参数)=>
{
var chalIntent=新意图(此,类型为(活动B));
StartActivityForResult(Chalent,123);
};
}
}
受保护的覆盖void OnActivityResult(int请求代码、结果代码、意图数据)
{
base.OnActivityResult(请求代码、结果代码、数据);
Android.Util.Log.Debug(“KP2A”,“OnActivityResult A:”+requestCode);
}
}
[活动(Label=“@string/app_name”,Theme=“@android:style/Theme.Dialog”)]
公共课活动B:活动
{
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
Kp2aLog.Log(“OnCreate B”);
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.yubichall_测试);
findviewbyd(Resource.Id.btn\u yubichall).Text=“将结果返回到A”;
{
FindViewById(Resource.Id.btn_yubichall)。单击+=(发送方,参数)=>
{
SetResult(Result.Ok);
完成();
};
}
}
}
布局yubicall_测试的位置

    <?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>

我将尝试解释这里发生了什么。“不保留”活动用于模拟设备上的低内存行为,以便当活动进入后台状态(暂停、停止)并由于内存猝灭而被终止时,它将保存所需的状态。大多数视图状态由Android操作系统本身保存,并负责在活动返回前台时恢复它们

现在,根据您的场景,当启动活动B时,该主题似乎不会在普通android中产生任何问题。它将暂停并停止活动A,因为它不是DialogActivity。它只是有一个对话的主题。您应该使用Xamarin验证这一点,如果它以不同的方式对待对话框主题,那么这可能是一个问题

现在,当您将活动B置于后台(暂停、停止)时,它也会被杀死,因为您没有继续活动。但恢复所有活动(即B和之前所有具有正确视图状态的活动)是Android操作系统的工作。即使您看到活动A在还原状态时被创建,您也会看到包中保存的所有状态被还原(参数onCreate of ActivityA)


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

我的观点是,它工作正常,正如您在完成另一项任务onCreate()后提到的那样两个活动中的一个都被调用了-所以两个活动都是新启动的,所以活动B不是通过startActivityForResult()创建的-所以从活动B到A时它不会调用活动A的ActivityResult()。这听起来像是一个bug。我无法用香草安卓来复制这种行为嗯,我想问你一些关于你的任务的事情,它做什么,这个任务是什么,我的意思是你用它实现了什么。你如何通过切换到另一个任务并返回来强迫娱乐?你为什么不想保留这些活动?
    <?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>