的Android服务崩溃经由报警
问题描述:
我想开始在特定的时代背景下一个服务调用,用于调试我开始服务于应用程序启动,但只要该服务已启动与此异常应用程序崩溃:的Android服务崩溃经由报警
java.lang.RuntimeException: Unable to instantiate service com.nexus.nsnik.gymchart.Downalod.VersionService: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
我的代码:
private void setAlarm() {
Intent intent = new Intent(this, VersionService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.set(java.util.Calendar.HOUR_OF_DAY,15);
calendar.set(java.util.Calendar.MINUTE, 46);
calendar.set(java.util.Calendar.SECOND, 0);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
服务类:
public class VersionService extends IntentService{
long version = 0;
DatabaseReference mRoot = FirebaseDatabase.getInstance().getReference();
DatabaseReference mVersionChild = mRoot.child("version");
SharedPreferences spf = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor spfe = spf.edit();
public VersionService(){
super("versionCheckService");
}
@Override
protected void onHandleIntent(Intent intent) {
mVersionChild.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
version = (long) dataSnapshot.getValue();
if(version!=0){
if(version!=spf.getLong(getResources().getString(R.string.versionNo),1089)){
startService(new Intent(VersionService.this,DownloadService.class));
spfe.putLong(getResources().getString(R.string.versionNo),version);
newDatabaseNotification();
}else {
newDatabaseNotification();
}
}else {
newDatabaseNotification();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void newDatabaseNotification() {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText(getResources().getString(R.string.newdatabase));
NotificationManager mNotififcationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
mNotififcationManager.notify(0,mBuilder.build());
}
答
我解决通过在onCreate中移动数据库引用和预先初始化的问题,并将代码从onBind移动到onCreate,因为由于某些原因,代码没有被执行。
public class VersionService extends Service{
long version = 0;
DatabaseReference mRoot;
DatabaseReference mVersionChild;
SharedPreferences spf ;
SharedPreferences.Editor spfe;
@Override
public void onCreate() {
super.onCreate();
mRoot = FirebaseDatabase.getInstance().getReference();
mVersionChild = mRoot.child("version");
spf = PreferenceManager.getDefaultSharedPreferences(this);
spfe = spf.edit();
checkVersion();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void checkVersion(){
mVersionChild.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
version = (long) dataSnapshot.getValue();
if (version != 0) {
if (version != spf.getLong(getApplicationContext().getResources().getString(R.string.versionNo), 1089)) {
startService(new Intent(VersionService.this, DownloadService.class));
spfe.putLong(getResources().getString(R.string.versionNo), version);
newDatabaseNotification();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void newDatabaseNotification() {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText(getResources().getString(R.string.newdatabase));
NotificationManager mNotififcationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
mNotififcationManager.notify(0,mBuilder.build());
}
}
您能否向我提供显示错误的行? –
你在哪里调用Context.getPackageName()方法? –
@KostasDrak我没有调用Context.getPackageName()任何地方 – Nsnik