You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin类库项目创建Intent打开主项目Activity失败求助

解决Xamarin Android类库中无法获取主项目Activity类型的问题

你遇到的Type.GetType(classname)返回null的问题,本质是因为Type.GetType默认只会在当前类库的程序集和系统程序集里查找类型,而你的TestActivity在主项目MyProj.Droid的程序集里,类库MyCls无法仅通过命名空间+类名定位到它。下面是几种可行的解决方法:


方法1:使用完整的类型限定名(简单场景推荐)

调用Type.GetType时,需要传入命名空间+类名, 程序集名称的完整格式。你可以在MyProj.Droid项目属性的"应用程序"标签里查看程序集名称,假设程序集名称就是MyProj.Droid,那么调用代码修改为:

MyCls.CreateIntent("MyProj.Droid.TestActivity, MyProj.Droid")

方法2:改用泛型方法(类型安全,长期维护推荐)

直接把CreateIntent改成泛型方法,彻底避免字符串硬编码的错误:

// MyCls类库中的修改
public static void CreateIntent<T>(Context context, string title, string body) 
    where T : Activity // 约束为Activity类型
{
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, MKMessagingServiceConstants.CHANNELID);
    builder.SetContentTitle(title);
    builder.SetContentText(body);

    Intent intent = new Intent(context, typeof(T));
    intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
    PendingIntent pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.OneShot); 
    builder.SetContentIntent(pendingIntent);
    builder.SetPriority(NotificationCompat.PriorityHigh);
    builder.SetAutoCancel(true);
    var notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
    notificationManager.Notify(0, builder.Build());
}

然后在MainActivity里调用:

MyCls.CreateIntent<TestActivity>(this, "通知标题", "通知内容");

方法3:通过程序集加载获取类型

如果必须用字符串传递类名,可以先加载主项目的程序集再获取类型:

// MyCls类库中的修改
public static void CreateIntent(Context context, string className, string assemblyName, string title, string body)
{
    var assembly = Assembly.Load(assemblyName);
    var activityType = assembly.GetType(className);
    if (activityType == null)
    {
        throw new ArgumentException("找不到指定的Activity类型");
    }

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, MKMessagingServiceConstants.CHANNELID);
    builder.SetContentTitle(title);
    builder.SetContentText(body);

    Intent intent = new Intent(context, activityType);
    intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
    PendingIntent pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.OneShot); 
    builder.SetContentIntent(pendingIntent);
    builder.SetPriority(NotificationCompat.PriorityHigh);
    builder.SetAutoCancel(true);
    var notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
    notificationManager.Notify(0, builder.Build());
}

调用时:

MyCls.CreateIntent(this, "MyProj.Droid.TestActivity", "MyProj.Droid", "通知标题", "通知内容");

必查步骤:确保Activity已注册

不管用哪种方法,都要确认TestActivity已经在AndroidManifest.xml里注册(Xamarin通常会自动生成,但手动修改过manifest的话要检查):

<activity android:name=".TestActivity" />

内容的提问来源于stack exchange,提问作者leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:23:11