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

Android启动Activity报错:通知类调用getSystemService空指针解决

问题解决:独立通知处理类的实现与NullPointerException修复

能否创建独立的通知处理类?

完全可以,这是推荐的解耦实践,能把所有通知相关逻辑集中到一个类里,避免重复代码,方便后续维护。

错误原因分析

你错误地让LocalNotifications继承了Application类,还在MainActivity里手动实例化它。Application的实例是Android系统在应用启动时自动创建并初始化的,手动new出来的Application对象没有完成系统层面的Context初始化,内部Context为空,调用getSystemService自然会抛出NullPointerException。

正确实现方案

方案一:普通工具类(推荐,灵活可控)

让LocalNotifications作为普通工具类,通过传入Context来获取系统服务:

public class LocalNotifications {
    // 创建通知渠道
    public static void createNotificationChannel(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence channelName = "默认通知渠道";
            String channelDesc = "用于展示应用普通通知";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            
            NotificationChannel channel = new NotificationChannel("DEFAULT_CHANNEL_ID", channelName, importance);
            channel.setDescription(channelDesc);
            
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

    // 发送通知示例
    public static void sendNotification(Context context, String title, String content) {
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
        Notification notification = new NotificationCompat.Builder(context, "DEFAULT_CHANNEL_ID")
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(title)
                .setContentText(content)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .build();
        
        notificationManager.notify(1, notification);
    }
}

在Activity中调用:

// 创建渠道(建议在Application或主Activity onCreate中调用一次)
LocalNotifications.createNotificationChannel(this);
// 发送通知
LocalNotifications.sendNotification(this, "新消息", "这是一条测试通知");

方案二:基于全局Context的工具类

如果不想每次调用都传Context,可以通过自定义Application获取全局Context:

  1. 自定义Application类:
public class MyApp extends Application {
    private static Context sGlobalContext;

    @Override
    public void onCreate() {
        super.onCreate();
        sGlobalContext = getApplicationContext();
    }

    public static Context getGlobalContext() {
        return sGlobalContext;
    }
}
  1. 在AndroidManifest.xml中注册:
<application
    android:name=".MyApp"
    ...>
    <!-- 其他组件配置 -->
</application>
  1. 改造LocalNotifications:
public class LocalNotifications {
    private static final Context sContext = MyApp.getGlobalContext();

    public static void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence channelName = "默认通知渠道";
            String channelDesc = "用于展示应用普通通知";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            
            NotificationChannel channel = new NotificationChannel("DEFAULT_CHANNEL_ID", channelName, importance);
            channel.setDescription(channelDesc);
            
            NotificationManager notificationManager = sContext.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

    public static void sendNotification(String title, String content) {
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(sContext);
        Notification notification = new NotificationCompat.Builder(sContext, "DEFAULT_CHANNEL_ID")
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(title)
                .setContentText(content)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .build();
        
        notificationManager.notify(1, notification);
    }
}

在Activity中调用:

LocalNotifications.createNotificationChannel();
LocalNotifications.sendNotification("新消息", "这是一条测试通知");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:16:14