Events 如何以xamarin表单将OnActivityResult发送到特定页面

Events 如何以xamarin表单将OnActivityResult发送到特定页面,events,xamarin.android,xamarin.forms,renderer,Events,Xamarin.android,Xamarin.forms,Renderer,我正在使用自定义按钮渲染器在xamarin表单页面中进行google登录工作正常我在MainActivity中获得登录结果现在我想将此数据从MainActivity和AppDelegate发送到xamarin表单中的特定页面 protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(req

我正在使用自定义按钮渲染器在xamarin表单页面中进行google登录工作正常我在MainActivity中获得登录结果现在我想将此数据从MainActivity和AppDelegate发送到xamarin表单中的特定页面

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (requestCode == 9001)
            {
                Utilities.Configuration.UpdateConfigValue(Utilities.Constants.loggedInflag,string.Empty);
                GoogleSignInResult result = Android.Gms.Auth.Api.Auth.GoogleSignInApi.GetSignInResultFromIntent(data);

                if (result.IsSuccess)
                {

                    GoogleSignInAccount acct = result.SignInAccount;
                    var token = acct.IdToken;
                    //I wan to send the 'accnt' to a Page in xamarin forms

                }
                else
                {
                    //Signin Failure send response to Page in xamarin forms
                }
            }
        }

表单在Android上只在一个活动中运行。因此,如果您的url请求出现在不同的活动中,您必须切换回MainActivity,然后才能使用正常的XF导航

当用户打开与我的应用程序关联的文件时,我会这样做

[Activity(Label = "LaunchFileActivity")]
public class LaunchFileActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        if (Intent.Data != null)
        {
            var uri = Intent.Data;
            if (uri != null)
            {
                Intent i = new Intent(this, typeof(MainActivity));
                i.AddFlags(ActivityFlags.ReorderToFront);
                i.PutExtra("fileName", uri.Path);
                this.StartActivity(i);
            }
        }
        this.FinishActivity(0);
    }
}
在主要活动中:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    Intent = intent;
}

protected override void OnPostResume()
{
    base.OnPostResume();
    if (Intent.Extras != null)
    {
        string fileName = Intent.Extras.GetString("fileName");
        if (!string.IsNullOrEmpty(fileName))
        {
            // do something with fileName
        }
        Intent.RemoveExtra("fileName");
    }
}

表单在Android上只在一个活动中运行。因此,如果您的url请求出现在不同的活动中,您必须切换回MainActivity,然后才能使用正常的XF导航

当用户打开与我的应用程序关联的文件时,我会这样做

[Activity(Label = "LaunchFileActivity")]
public class LaunchFileActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        if (Intent.Data != null)
        {
            var uri = Intent.Data;
            if (uri != null)
            {
                Intent i = new Intent(this, typeof(MainActivity));
                i.AddFlags(ActivityFlags.ReorderToFront);
                i.PutExtra("fileName", uri.Path);
                this.StartActivity(i);
            }
        }
        this.FinishActivity(0);
    }
}
在主要活动中:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    Intent = intent;
}

protected override void OnPostResume()
{
    base.OnPostResume();
    if (Intent.Extras != null)
    {
        string fileName = Intent.Extras.GetString("fileName");
        if (!string.IsNullOrEmpty(fileName))
        {
            // do something with fileName
        }
        Intent.RemoveExtra("fileName");
    }
}

Xamarin窗体在一个活动上运行,这与您的主要活动最为相似

有两个示例项目向您展示了如何在代码的本机部分和表单部分之间进行通信,可以在这里找到

  • 但是,要回答您的问题,您可以执行以下操作

    private const int MyRequestCode = 101;
    
     //Start activity for result 
     var contactPickerIntent = new Intent(Intent.ActionPick, Android.Provider.ContactsContract.Contacts.ContentUri);
     context.StartActivityForResult(contactPickerIntent, MyRequestCode);
    
    然后在主活动中(初始化xamarin表单应用程序的活动(使用global::xamarin.forms.forms.Init(这个,bundle);)


    Xamarin窗体在一个活动上运行,这与您的主要活动最为相似

    有两个示例项目向您展示了如何在代码的本机部分和表单部分之间进行通信,可以在这里找到

  • 但是,要回答您的问题,您可以执行以下操作

    private const int MyRequestCode = 101;
    
     //Start activity for result 
     var contactPickerIntent = new Intent(Intent.ActionPick, Android.Provider.ContactsContract.Contacts.ContentUri);
     context.StartActivityForResult(contactPickerIntent, MyRequestCode);
    
    然后在主活动中(初始化xamarin表单应用程序的活动(使用global::xamarin.forms.forms.Init(这个,bundle);)


    使用MessagingCenter@YuriS我在某个地方读到,使用消息中心是不好的,在这种情况下使用它可以吗?不同的人有不同的偏好。这并不坏。主要的问题是可维护性。使用MessagingCenter@YuriS我在某个地方读到,使用消息中心是不好的,在这种情况下使用它可以吗不同的首选项。这还不错。主要关注的是可维护性。我没有启动另一个活动。我在主活动中有详细信息。我正在尝试将此数据发送到我的表单页面。在该示例中,哪个类与xamarin表单中的活动和页面之间有关联。问题是在OnActivityResultcall中做什么带有参数的Xamarin.from App()方法,并在Xamarin.forms App()内进行决策方法否,它将直接显示目标页面,而无需重新启动整个应用程序。它将清除堆栈,但我对此不确定。我没有启动其他活动。我在主活动中有详细信息。我正在尝试将此数据发送到我的表单页面。在该示例中,哪个类在xamarin表单中的活动和页面之间有连接问题是如何在OnActivityResultcall Xamarin.from App()方法中使用参数并在Xamarin.forms App()方法中做出决定否,它将直接显示目标页面而不重新启动整个应用程序它将清除堆栈,但我不确定这一点。