我明白OnActivityResult应该在OnResume之前立即调用,但这并没有发生在我身上。我发现它在OnResume之前被调用,甚至在OnStart之前。下面是我的示例代码,我中断了相关的方法,看看发生了什么。这是怎么呢
活动1
using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content.PM;
namespace LifecycleTest
{
[Activity(MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.Main);
this.FindViewById<Button>(Resource.Id.button1).Text = "Start Activity 2";
this.FindViewById<Button>(Resource.Id.button1).Click += button_Click;
}
void button_Click(object sender, EventArgs e)
{
Intent i = new Intent(this, typeof(Activity2));
this.StartActivityForResult(i, 1);
}
protected override void OnStop()
{
base.OnStop();
}
protected override void OnResume()
{
base.OnResume();
}
protected override void OnStart()
{
base.OnStart();
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
}
}
}
2 活动using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content.PM;
namespace LifecycleTest
{
[Activity]
public class Activity2 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.Main);
this.FindViewById<Button>(Resource.Id.button1).Text = "Return Result";
this.FindViewById<Button>(Resource.Id.button1).Click += button_Click;
}
void button_Click(object sender, EventArgs e)
{
this.SetResult(Result.Ok);
this.Finish();
}
}
}
布局<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<Button
android:text="Button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button1" />
</LinearLayout>
using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content.PM;
namespace LifecycleTest
{
[Activity]
public class Activity2 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.Main);
this.FindViewById<Button>(Resource.Id.button1).Text = "Return Result";
this.FindViewById<Button>(Resource.Id.button1).Click += button_Click;
}
void button_Click(object sender, EventArgs e)
{
this.SetResult(Result.Ok);
this.Finish();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<Button
android:text="Button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button1" />
</LinearLayout>
看看API-23 android.app.ActivityThread#performResumeActivity
,它在执行Activity#performResume()
之前调用#deliverResults()
。
前者最终调用Activity#onActivityResult()
,而后者如果没有启动将调用Activity#onStart()
。因此,调用顺序将是:
onActivityResult()
onStart() // only if it has been stopped
onResume()
这似乎是Android 2.0的情况。尽管有些帖子不这么认为。
当你的activity被设置为"singleInstance"时,就会发生这种情况。你的activity是singleInstance吗?