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
相关产品推荐
相关产品推荐

