创建通知管理器时出现空指针异常

如何解决创建通知管理器时出现空指针异常

当我尝试启动服务时,我收到一个空指针异常,这是由实例化通知管理器引起的。这看起来相当简单,只是实例化,但这一行代码导致应用程序崩溃。

这个问题的原因是什么?

在 onStop 方法中启动服务:

@Override
    protected void onStop() {
        super.onStop();
        Intent notifService = new Intent(getApplicationContext(),NotificationService.class);
        startService(notifService);
    }

服务类:

package ch.zli.eb.myfitnessjourney.service;


public class NotificationService extends Service {
    private String channelId = "myfitnessjourney_1";
    private int notificationId = 101;

    notificationmanager notifManager = getSystemService(notificationmanager.class);

    private LocalBinder mybinder = new LocalBinder();

    private Timer notifTimer;
    private TimerTask notifTimerTask;

    private final int intervalSec = 5;

    private Handler notifHandler;


    public NotificationService() throws ParseException {
        createNotificationChannel();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mybinder;
    }


    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        super.onStartCommand(intent,flags,startId);

        try {
            startTimer();
        } catch (ParseException e) {
            e.printstacktrace();
        }

        return START_STICKY;
    }


    @Override
    public void onCreate() {
    }

    @Override
    public void onDestroy() {
        stopTimerTask();
        super.onDestroy();
    }

    public void startTimer() throws ParseException {
        notifTimer = new Timer();

        initializeTimerTask();

        notifTimer.schedule(notifTimerTask,5000,intervalSec * 1000);
    }

    public void stopTimerTask() {
        if (notifTimer != null) {
            notifTimer.cancel();
            notifTimer = null;
        }
    }

    public void initializeTimerTask() throws ParseException {
        DbManager dbManager = new DbManager(this);
        ArrayList<Goal> goalList = dbManager.getGoals();

        // required DATE FORMAT
        DateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
        dateFormatter.setLenient(false);
        Date todaysDate = dateFormatter.parse(dateFormatter.format(new Date()));

        notifTimerTask = new TimerTask() {
            public void run() {
                notifHandler = new Handler();
                notifHandler.post(new Runnable() {
                    public void run() {
                        for (Goal g : goalList) {
                            if (g.isReminders()) {
                                if (g.getEndDate().compareto(todaysDate) == 0) {
                                    sendNotification(g);
                                }
                            }
                        }

                    }
                });
            }
        };
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String notifTitle = "Title";
            String notifDesc = "Description";
            int importance = notificationmanager.IMPORTANCE_DEFAULT;

            NotificationChannel notifChannel = new NotificationChannel(channelId,notifTitle,importance);
            notifManager.createNotificationChannel(notifChannel);
        }
    }

    private void sendNotification(Goal g) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this,channelId)
                .setContentTitle("Goal Deadline")
                .setContentText(g.getName() + "is about to pass the deadline!")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

        notifManager.notify(notificationId,builder.build());
    }

    public class LocalBinder extends Binder {
        NotificationService getService() {
            return NotificationService.this;
        }
    }
}

解决方法

getSystemService(Class serviceClass) 是抽象类Context的一个方法。因此,如果您从非活动类调用此方法,则需要将活动类的上下文传递给您的服务类。您可以在构造函数中传递它。

Context mContext;
public NotificationService(Context mContext) {
    this.mContext = mContext;
}

NotificationManager notifManager = mContext.getSystemService(NotificationManager.class);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?