android - OnActivityResult 和 OnResume 的执行顺序

标签 android android-activity xamarin.android

我知道 OnActivityResult 应该在 Activity 中的 OnResume 之前立即调用,但我不会这样做。我发现它在 OnResume 之前被调用,甚至在 OnStart 之前被调用。下面是我的示例代码,我正在断点相关方法以查看发生了什么。怎么回事?

Activity 一

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);
        }
    }
}

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

最佳答案

查看 API-23 android.app.ActivityThread#performResumeActivity它调用#deliverResults() before doing Activity#performResume() .

前者最终会调用Activity#onActivityResult(),而后者如果还没有启动就会调用Activity#onStart()。因此,调用顺序将是:

onActivityResult()
onStart() // only if it has been stopped
onResume()

Android 2.0开始似乎都是这样。 .虽然有帖子说claim otherwise .

关于android - OnActivityResult 和 OnResume 的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340732/

相关文章:

android - 无法在模拟器中启动 64 位(x86_64)android qt 应用程序

android - 如何在android中使用onResume Activity

xamarin - 无法添加 Xamarin Google Play 服务

c# - Xamarin 文件处理文档 - SpecialFolder.LocalApplicationData 不存在

android - 这些使用 setResult 完成 Activity 的方式有什么区别?

c# - 对 Mac 上的 Xamarin Studio 的 MVVM 交叉支持

android - 将 getExternalFilesDir 与多个 SDCard (Galaxy S3) 一起使用

android - MEDIA_TYPE_IMAGE 无法识别

android - 如何为媒体播放器制作锁屏通知

android - 在服务和 Activity 之间传递变量,反之亦然