2016-12-11 9 views
-1

Я хочу, чтобы начать службу в фоновом режиме в определенное время, для отладки я запуск службы при запуске приложения, но, как только служба приложение запускается аварии с этим исключением: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 i не вызывал Context.getPackageName() где-либо – Nsnik

ответ

0

Я решил проблема, перемещая подтверждение базы данных и инициализацию prefrence в onCreate и alos, перемещает код из 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()); 
} 

}