我有两个活动,A和B。A通过调用startActivityForResult()
来开始B。 B具有主题@android:style/Theme.Dialog
。
因此,B显示在A的“上方”,但是A仍然可见(因为B是一个对话框)。
当两个活动都启动时,我通过切换到另一个任务来强制娱乐并返回(我在android开发人员设置中启用了“不保留活动”选项。我看到返回时在A和B上调用了OnCreate来完成我的任务。)
当我单击活动B中的按钮时,它会调用setResult()
和finish()
,但是onActivityResult()
不会在A上被调用。
问题没有出现
或
我在装有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>
答案 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的应用,然后为每个制造商自定义代码是一个好主意。