Xamarin非主Activity配置IntentFilter报java.exe exited with code 1错误
问题描述
学习Xamarin中Action工作机制过程中,给Activity添加IntentFilter配置时项目构建报错java.exe exited with code 1。
经测试:相同的IntentFilter配置在标记MainLauncher=true的主启动Activity中可正常编译,将同类配置添加到其他非主Activity时就会编译失败。检索相关技术资料未找到对应解决方案。
可正常构建的代码
namespace XamarinLearningField { [Activity(Label = "SomeApp", Theme = "@style/AppTheme", MainLauncher = true)] [IntentFilter(new[] { Intent.ActionView }, Categories = new[] { Intent.CategorySampleCode, "my.custom.category" })] public class MainActivity : AppCompatActivity, Android.Views.View.IOnClickListener { TextView tvName; Button btnName; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.activity_main); tvName = (TextView)FindViewById(Resource.Id.tvName); btnName = (Button)FindViewById(Resource.Id.btnName); btnName.SetOnClickListener(this); Button btnTime = (Button)FindViewById(Resource.Id.btnTime); Button btnDate = (Button)FindViewById(Resource.Id.btnDate); btnTime.SetOnClickListener(this); btnDate.SetOnClickListener(this); } } }
构建失败的代码
{ [Activity(Label = "Data/Time info", MainLauncher = false)] [IntentFilter(new[] { "en.startandroid.intent.action.showtime","en.startandroid.intent.action.showdate" }, Categories = new[] { Intent.CategoryDefault })] public class InfoActivity : AppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Info_ActivityLayout); Intent intent = this.Intent; String action = intent.Action; String format = "", textInfo = ""; if (action.Equals("en.startandroid.intent.action.showtime")) { format = "HH:mm:ss"; textInfo = "Time: "; } else if (action.Equals("en.startandroid.intent.action.showdate")) { format = "dd.MM.yyyy"; textInfo = "Date: "; } ... } }
故障原因与修复方案
报错和是否为主启动Activity没有直接关系,代码存在两个会触发编译失败的问题:
InfoActivity的Label属性值包含非法字符/。Xamarin在编译阶段会根据Activity特性生成AndroidManifest.xml清单文件,Label值中的斜杠会破坏清单文件的XML结构合法性,最终导致java编译器执行失败。- 失败代码片段中的
InfoActivity类外层缺少正确的命名空间包裹,类定义直接放在孤立的大括号块中,会导致Xamarin生成Java代理类时找不到正确的类路径,触发编译错误。
修复步骤:
- 移除Label中的斜杠,替换为合法字符,例如将
Label = "Data/Time info"修改为Label = "Date & Time info" - 给
InfoActivity补上和项目一致的命名空间,移除类外层多余的孤立大括号,保证类定义的结构和主Activity一致。
修正后的InfoActivity代码结构参考:
namespace XamarinLearningField { [Activity(Label = "Date & Time info", MainLauncher = false)] [IntentFilter(new[] { "en.startandroid.intent.action.showtime","en.startandroid.intent.action.showdate" }, Categories = new[] { Intent.CategoryDefault })] public class InfoActivity : AppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Info_ActivityLayout); Intent intent = this.Intent; String action = intent.Action; String format = "", textInfo = ""; if (action.Equals("en.startandroid.intent.action.showtime")) { format = "HH:mm:ss"; textInfo = "Time: "; } else if (action.Equals("en.startandroid.intent.action.showdate")) { format = "dd.MM.yyyy"; textInfo = "Date: "; } // 剩余业务逻辑 } } }
内容的提问来源于stack exchange,提问作者Max Esin
相关产品推荐
相关产品推荐

