题 如何在Xamarin.Android中注册我自己的Application子类?


我有

public class MyApp : Application

在Java中,我会在清单中添加一行,并将其传递给我的应用程序的名称空间和名称:

<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:name="com.devahead.extendingandroidapplication.MyApplication">

在Xamarin,有 [Application] 属性但文档说明了 Name 成员是 不支持。那么如何让我的子类注册?在哪里应用属性?

如果我将属性添加到我的子类,我得到:

System.NotSupportedException: Unable to activate instance of type TestClient_Android.MyApplication from native handle 14d00019

18
2018-01-29 10:16


起源




答案:


找到了。文档已过时。你将需要一个特殊的c'tor  参数  你将不得不添加 [Application] 属性:

[Application]
public class MyApplication : Application
{
    public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
    {
    }
}

编辑: 此外,似乎必须重写OnCreate()。如果你有 只要 构造函数,它不会被调用。

public override void OnCreate()
{
  // If OnCreate is overridden, the overridden c'tor will also be called.
  base.OnCreate();
}

2015年11月编辑: 这里是Xamarin文档的链接,它解释了这一点 为什么会出现这种行为

... Xamarin.Android通过添加一个钩子   mono.MonoRuntimeProvider ContentProvider到AndroidManifest.xml期间   构建过程。 mono.MonoRuntimeProvider.attachInfo()方法是   负责将Mono运行时加载到进程中。任何   在此之前尝试使用Mono将失败。 (注意:这是   为什么子类Android.App.Application需要提供的类型   (IntPtr,JniHandleOwnership)构造函数,作为Application实例   在Mono可以初始化之前创建。)


50
2018-01-29 12:30



对于mono / xamarin android来说真的很难找到这样的答案 - macio.Jun
我找到的符号 这里 要么 这里 略有不同(javaReference 代替 handle)。这会有所不同吗? - testing
@testing如何命名参数无关紧要。类型必须匹配。 - Krumelur
一切正常,直到最新的Xamarin更新,一切都停止了。添加额外的OnCreate解决了我们的问题。即使我们在基类中覆盖了它,我们继承了它,所以不得不添加到子级。感谢您的信息,迫使我们继续使用旧版本的Xamarin。 - KrustyGString
那么我如何使用AssemblyInfo文件中的[assembly:Application(Theme =“style here”)]为应用程序应用一个主题,因为一旦我有一个自定义应用程序类,我将无法在那里添加该行? - Joseph