如何在xamarin android中扩展应用程序类

Shi*_*iva 6 c# android-manifest xamarin.android xamarin android-application-class

我想扩展Android应用程序,我想重写oncreate方法.但由于某种原因,它非常糟糕......只有当我删除[应用程序]我才能运行它但是根据这个链接我们必须添加[应用程序]

[Application]
public class MainApp : Application
{
public MainApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}

public override void OnCreate()
{
    base.OnCreate();
    //app init ...
}
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以澄清一下在xamarin android中扩展应用程序类的正确方法是什么

更新

如果我不删除[应用程序],我正好得到以下错误

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets:错误:执行任务GenerateJavaStubs时出错:应用程序不能同时具有[Application]属性和[assembly:Application]的类型]属性.(myapp.Droid)

如果我应用程序然后它编译但它会抛出运行时错误

[AndroidRuntime]关闭VM [AndroidRuntime] FATAL EXCEPTION:main [AndroidRuntime]进程:com.test.myapp,PID:6524 [AndroidRuntime] java.lang.RuntimeException:无法实例化应用程序com.test.myapp.MainApp:java. lang.ClassNotFoundException:在路径上找不到类"com.test.myapp.MainApp":DexPathList [[zip file"/data/app/com.test.myapp-1/base.apk"],nativeLibraryDirectories=[/ data/app/com.test.myapp-1/lib/arm,/ data/app/com.test.myapp-1/base.apk!/ lib/arababi-v7a,/ system/lib,/ vendor/lib] [AndroidRuntime]在android.app.LoadedApk.makeApplication(LoadedApk.java:802)[AndroidRuntime] android.app.ActivityThread.handleBindApplication(ActivityThread.java:5377)[AndroidRuntime] at android.app.ActivityThread.-wrap2( ActivityThread.java)[AndroidRuntime]在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1545)[AndroidRuntime]在Android.os上的android.os.Handler.dispatchMessage(Handler.java:102)[AndroidRuntime]. Looper.loop(Looper.java:154)[AndroidRunt ime]在android.app.ActivityThread.main(ActivityThread.java:6119)[AndroidRuntime] at java.lang.reflect.Method.invoke(Native Method)[AndroidRuntime] at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.运行(ZygoteInit.java:886)[AndroidRuntime] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)[AndroidRuntime]引起:java.lang.ClassNotFoundException:未找到类"com. test.myapp.MainApp"on path:DexPathList [[zip file"/data/app/com.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.test.myapp-1/ lib/arm,/ data/app/com.test.myapp-1/base.apk!/ lib/armaabi-v7a,/ system/lib,/ vendor/lib]] [AndroidRuntime] at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)[AndroidRuntime] java.lang.ClassLoader.loadClass(ClassLoader.java:380)[AndroidRuntime] at java.lang.ClassLoader.loadClass(ClassLoader.java:312)[AndroidRuntime] at android.app .Instrumentation.newApplication(Instrumentation.java:992)[AndroidRuntime]在android.app.LoadedAp k.makeApplication(LoadedApk.java:796)[AndroidRuntime] ...还有9个

这是我的清单文件

Dur*_*n.H 8

AssemblyInfo.cs中

评论出来

     #if DEBUG
    [Application(Debuggable=true)]
    #else
    [Application(Debuggable = false)]
    #endif
Run Code Online (Sandbox Code Playgroud)

并在您的应用程序之上移动它

#if DEBUG
[Application(Debuggable=true)]
#else
[Application(Debuggable = false)]
#endif
public class MainApp : Application
{
public MainApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}

public override void OnCreate()
{
    base.OnCreate();
    //app init ...
}
}
Run Code Online (Sandbox Code Playgroud)

基本上你已经定义了两个地方,这就是为什么会出现这个问题.在AssemblyInfo.cs中注释并添加扩展类将会有效

供参考:

清单还可以


Sus*_*ver 7

  1. 将ApplicationAttribute应用于[Application]Application子类,以在清单中注册此类

  2. 添加Java/JNI构造函数

    • .ctor(System.IntPtr, Android.Runtime.JniHandleOwnership)
    • 如果你不添加这个,当运行时试图实例化Java包装器时,你会收到一个错误....
  3. 覆盖该OnCreate方法

    • 这避免了:[art] JNI RegisterNativeMethods: attempt to register 0 native methods因此您的应用程序子类不是实例化的.

例:

[Application]
public class MainApplication : Application
{
    public MainApplication(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}
Run Code Online (Sandbox Code Playgroud)