Xamarin Android点击按钮后通知不显示问题求助(附代码)
问题:Xamarin Android点击按钮后通知未显示
我编写了以下Xamarin Android代码,根据查阅的资料,点击按钮后应立即弹出通知,但实际无通知显示。烦请告知原因,谢谢。
Activity代码:
namespace PresentationNoti { [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)] public class MainActivity : AppCompatActivity { Button btn1, btn2; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.activity_main); btn1 = (Button)FindViewById(Resource.Id.btn1); btn2 = (Button)FindViewById(Resource.Id.btn2); btn1.Click += Btn1_Click; btn2.Click += Btn2_Click; } private void Btn2_Click(object sender, System.EventArgs e) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.SetSmallIcon(Resource.Drawable.birthday); mBuilder.SetContentTitle("It's your birthday"); mBuilder.SetContentText("Happy B-day Birthday Boy/Girl"); Intent resultIntent = new Intent(this, typeof(MainActivity)); TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this); stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity))); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.AddNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent); mBuilder.SetContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager)GetSystemService(Context.NotificationService); mNotificationManager.Notify(0, mBuilder.Build()); } private void Btn1_Click(object sender, System.EventArgs e) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.SetSmallIcon(Resource.Drawable.birthday); mBuilder.SetContentTitle("It's your birthday"); mBuilder.SetContentText("Happy B-day Birthday Boy/Girl"); NotificationManager mNotificationManager = (NotificationManager)GetSystemService(Context.NotificationService); mNotificationManager.Notify(0, mBuilder.Build()); } } }
布局文件(axml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#90aacc"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="basic notification" android:textColor="#000000" android:layout_marginTop="15dp" android:layout_gravity="center" android:textSize="25sp" android:id="@+id/btn1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="advanced notification" android:textColor="#000000" android:layout_marginTop="15dp" android:layout_gravity="center" android:textSize="25sp" android:id="@+id/btn2" /> </LinearLayout>
问题原因与解决方案
核心原因:缺少通知渠道(Android 8.0+强制要求)
从Android 8.0(API级别26)开始,系统要求所有通知必须归属一个通知渠道,如果没有提前创建对应渠道,通知会被系统直接拦截,不会显示在状态栏中。你的代码完全没有处理渠道创建逻辑,这是通知不显示的最关键原因。
另外还有两个次要问题需要优化:
- 两个按钮的通知ID都是
0,会导致新通知直接覆盖旧通知,建议给不同按钮设置不同ID(比如1和2); - 要确保
Resource.Drawable.birthday图标符合Android通知规范:必须是透明背景的单色图标,如果图标格式错误,系统也可能隐藏通知。
修改后的代码示例
1. 添加创建通知渠道的方法
在MainActivity类中新增渠道创建逻辑:
private void CreateNotificationChannel() { // 仅在Android 8.0及以上版本执行渠道创建 if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { string channelId = "birthday_notification_channel"; string channelName = "生日提醒"; string channelDescription = "用于展示生日相关通知"; // 创建渠道并设置默认重要性 NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationImportance.Default) { Description = channelDescription }; // 获取通知管理器并注册渠道 NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService); notificationManager.CreateNotificationChannel(channel); } }
2. 在OnCreate中初始化渠道
修改OnCreate方法,在按钮初始化前调用渠道创建方法:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.activity_main); // 提前创建通知渠道 CreateNotificationChannel(); btn1 = (Button)FindViewById(Resource.Id.btn1); btn2 = (Button)FindViewById(Resource.Id.btn2); btn1.Click += Btn1_Click; btn2.Click += Btn2_Click; }
3. 修改通知构建逻辑,关联渠道ID
更新两个按钮的点击事件,针对Android 8.0+传入渠道ID:
Btn1_Click修改后:
private void Btn1_Click(object sender, System.EventArgs e) { NotificationCompat.Builder mBuilder; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { // Android O及以上版本必须传入渠道ID mBuilder = new NotificationCompat.Builder(this, "birthday_notification_channel"); } else { // 低版本使用旧构造方法 mBuilder = new NotificationCompat.Builder(this); } mBuilder.SetSmallIcon(Resource.Drawable.birthday); mBuilder.SetContentTitle("It's your birthday"); mBuilder.SetContentText("Happy B-day Birthday Boy/Girl"); NotificationManager mNotificationManager = (NotificationManager)GetSystemService(Context.NotificationService); // 修改通知ID为1,避免与Btn2通知冲突 mNotificationManager.Notify(1, mBuilder.Build()); }
Btn2_Click修改后:
private void Btn2_Click(object sender, System.EventArgs e) { NotificationCompat.Builder mBuilder; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { mBuilder = new NotificationCompat.Builder(this, "birthday_notification_channel"); } else { mBuilder = new NotificationCompat.Builder(this); } mBuilder.SetSmallIcon(Resource.Drawable.birthday); mBuilder.SetContentTitle("It's your birthday"); mBuilder.SetContentText("Happy B-day Birthday Boy/Girl"); Intent resultIntent = new Intent(this, typeof(MainActivity)); TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this); stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity))); stackBuilder.AddNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent); mBuilder.SetContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager)GetSystemService(Context.NotificationService); // 修改通知ID为2 mNotificationManager.Notify(2, mBuilder.Build()); }
最后验证
- 确认
Resource.Drawable.birthday图标存在且符合通知规范; - 运行修改后的代码,点击按钮即可正常显示通知。
内容的提问来源于stack exchange,提问作者Bar Fur
相关产品推荐
相关产品推荐

