的Android服务崩溃经由报警

的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()); 
} 
+0

您能否向我提供显示错误的行? –

+0

你在哪里调用Context.getPackageName()方法? –

+0

@KostasDrak我没有调用Context.getPackageName()任何地方 – Nsnik

我解决通过在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()); 
} 

}