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:
- 自定义Application类:
public class MyApp extends Application { private static Context sGlobalContext; @Override public void onCreate() { super.onCreate(); sGlobalContext = getApplicationContext(); } public static Context getGlobalContext() { return sGlobalContext; } }
- 在
AndroidManifest.xml中注册:
<application android:name=".MyApp" ...> <!-- 其他组件配置 --> </application>
- 改造
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
相关产品推荐
相关产品推荐

