在Xamarin Forms中开始Android活动?

时间:2017-06-02 22:22:32

标签: xamarin.android xamarin.forms

我正在尝试使用以下代码在我的应用中使用默认的Android pdf查看器查看托管的PDF文件

            var intent = new Intent(Intent.ActionView);

            intent.SetDataAndType(Uri.Parse("http://sample/url.pdf"), "application/pdf");
            intent.SetFlags(ActivityFlags.ClearTop);
            Android.Content.Context.StartActivity(intent);

我在Native项目中使用过这段代码,所以我知道它在Android活动中有效。对于Xamarin Forms,我是否有办法从内容页面启动Android活动,反之亦然?

3 个答案:

答案 0 :(得分:10)

您可以使用DependencyService来实现此功能:

INativePages中的

PCL

 public interface INativePages
{
    void StartActivityInAndroid();
}

Xamarin.Android中实施界面:

[assembly: Xamarin.Forms.Dependency(typeof(NativePages))]
namespace PivotView.Droid
{
    public class NativePages : INativePages
    {
        public NativePages()
        {
        }

        public void StartAc()
        {
            var intent = new Intent(Forms.Context, typeof(YourActivity));
            Forms.Context.StartActivity(intent);
        }

    }
}

在PCL中启动Android Activity

    private void Button_Clicked(object sender, EventArgs e)
    {
        Xamarin.Forms.DependencyService.Register<INativePages>();
        DependencyService.Get<INativePages>().StartAc();
    }

答案 1 :(得分:0)

在android项目中为此函数创建一个类:

public class PdfLauncher : IPdfLauncher
{
    public void LaunchPdf(string url)
    {
        //implementation
    }
}

在便携式项目中创建界面

public interface IPdfLauncher
{
    void LaunchPdf(string url);
}

向viewmodel添加属性,以便可以从便携式项目中调用该函数

public IPdfLauncher PdfLauncher {get;set;}

将接口添加到viewmodel构造函数并传入您在android主活动中创建的实例。您现在可以从xforms命令调用android代码,如果您添加iOS或UWP,您可以在这些项目中简单地实现该接口并在运行时传递它们。我使用MVVM中的注入框架来自动创建这些特定于平台的实现,如果您发现自己经常这样做,我建议您进行调查。

答案 2 :(得分:0)

Forms.Context现在已过时。 解决方法是实例化Android项目的Main活动类中的当前上下文,如下所示:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{
  public static Xamarin.Forms.Platform.Android.FormsAppCompatActivity Instance { get; private set; }

  protected override void OnCreate(Bundle bundle)
  {
        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

        LoadApplication(new App());
        Instance = this;
  }

并在NativePages StartAc()方法中检索本地上下文,如下所示:

public void StartAc()
    {
      var intent = new Intent(MainActivity.Instance, typeof(YourActivity));
      MainActivity.Instance.StartActivity(intent);
    }