创建notificationmanager时出现空指针异常
null pointer exception when creating notificationmanager
当我尝试启动服务时,出现空指针异常,这是由实例化 notificationmanager 引起的。这看起来很简单,只是实例化,但是这一行代码导致应用程序崩溃。
这个问题的原因是什么?
在 onStop 方法中启动服务:
@Override
protected void onStop() {
super.onStop();
Intent notifService = new Intent(getApplicationContext(), NotificationService.class);
startService(notifService);
}
服务class:
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(ClassserviceClass)是抽象classContext的方法。因此,如果您从非 activity class 调用此方法,则需要将 activity class 的上下文传递给您的服务 class。您可以在构造函数中传递它。
Context mContext;
public NotificationService(Context mContext) {
this.mContext = mContext;
}
NotificationManager notifManager = mContext.getSystemService(NotificationManager.class);
当我尝试启动服务时,出现空指针异常,这是由实例化 notificationmanager 引起的。这看起来很简单,只是实例化,但是这一行代码导致应用程序崩溃。
这个问题的原因是什么?
在 onStop 方法中启动服务:
@Override
protected void onStop() {
super.onStop();
Intent notifService = new Intent(getApplicationContext(), NotificationService.class);
startService(notifService);
}
服务class:
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(ClassserviceClass)是抽象classContext的方法。因此,如果您从非 activity class 调用此方法,则需要将 activity class 的上下文传递给您的服务 class。您可以在构造函数中传递它。
Context mContext;
public NotificationService(Context mContext) {
this.mContext = mContext;
}
NotificationManager notifManager = mContext.getSystemService(NotificationManager.class);