如何解决创建通知管理器时出现空指针异常
当我尝试启动服务时,我收到一个空指针异常,这是由实例化通知管理器引起的。这看起来相当简单,只是实例化,但这一行代码导致应用程序崩溃。
这个问题的原因是什么?
在 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 举报,一经查实,本站将立刻删除。