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

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());
}

最后验证

  1. 确认Resource.Drawable.birthday图标存在且符合通知规范;
  2. 运行修改后的代码,点击按钮即可正常显示通知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:42