0

Vor 3 Tagen habe ich über so etwas wie My Question 3 days Ago gefragt. Jetzt habe ich ein neues Problem. Bitte beachten Sie meinen Code unten.Neustart AlarmManager nach dem Neustart mit BootService

Ich habe eine startAlarm() -Methode

public void startAlarm(final Context context){ 
    myRef.child("users").child(uId).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot babyDataSnapshot) { 
      for (DataSnapshot babySnapshot: babyDataSnapshot.getChildren()) { 
       final Baby baby = babySnapshot.getValue(Baby.class); 
       uBabyName = baby.getuBabyName(); 
       myRef.child("users").child(uId).child(uBabyName).child("Vaccines").addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot vaccineDataSnapshot) { 
         for (DataSnapshot vaccineSnapshot: vaccineDataSnapshot.getChildren()){ 
          Vaccine vaccine = vaccineSnapshot.getValue(Vaccine.class); 

          calendar = Calendar.getInstance(); 
          year = calendar.get(Calendar.YEAR); 
          month = calendar.get(Calendar.MONTH)+1; 
          day = calendar.get(Calendar.DAY_OF_MONTH); 
          today = day + "/" + month + "/" + year; 
          vaccineDate = vaccine.getVaccineDate(); 
          String [] dateParts = vaccineDate.split("/"); 
          int vDay = Integer.parseInt(dateParts[0]); 
          int vMonth = Integer.parseInt(dateParts[1]); 
          int vYear = Integer.parseInt(dateParts[2]); 


          SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy"); 

          try { 
           Date dVaccine = myFormat.parse(vaccineDate); 
           Date dToday = myFormat.parse(today); 
           long diffD = calculateDays(dToday, dVaccine); 

           if(diffD>=0){ 
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

            Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION"); 
            notificationIntent.putExtra("Content", "Waktunya Imunisasi "+ vaccine.getVaccineName() + " untuk " + baby.getuBabyName()); 
            notificationIntent.addCategory("android.intent.category.DEFAULT"); 

            android.icu.util.Calendar cal = android.icu.util.Calendar.getInstance(); 

            PendingIntent broadcast = PendingIntent.getBroadcast(context, NotificationID.getID(), notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); 
            cal.set(android.icu.util.Calendar.YEAR, vYear); 
            cal.set(android.icu.util.Calendar.MONTH, vMonth-1); 
            cal.set(android.icu.util.Calendar.DAY_OF_MONTH, vDay); 
            cal.set(android.icu.util.Calendar.HOUR_OF_DAY, 6); 
            cal.set(android.icu.util.Calendar.MINUTE, 00); 
            cal.set(android.icu.util.Calendar.SECOND, 00); 

            alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast); 
           } 
           else { 
            //TextView desc = (TextView) findViewById(R.id.desc); 
            //desc.setText("<0"); 
           } 

          } catch (ParseException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Wenn ich dies auf normale Tätigkeit nennen, ist es mir eine Mitteilung geben. Aber wenn ich das nennen von BootService

public class BootService extends Service { 

@Override 
public void onCreate() { 
    try 
    { 
     AddBabyActivity addBabyActivity = new AddBabyActivity(); 
     addBabyActivity.startAlarm(this); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_NOT_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

Es gibt mir einen Fehler, wenn ich mein Handy neu starten

08-14 12:56:19.514 3977-3977/ga.crescere.mom W/System.err: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.google.firebase.database.DatabaseReference.child(Unknown Source) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at ga.crescere.mom.AddBabyActivity.startAlarm(AddBabyActivity.java:160) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at ga.crescere.mom.BootService.onCreate(BootService.java:19) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.handleCreateService(ActivityThread.java:3216) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.-wrap5(ActivityThread.java) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1586) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.os.Looper.loop(Looper.java:154) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6186) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
08-14 12:56:19.515 3977-3977/ga.crescere.mom W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 
08-14 12:56:19.527 3977-4034/ga.crescere.mom D/NetworkSecurityConfig: No Network Security Config specified, using platform default 
08-14 12:56:29.603 3977-3997/ga.crescere.mom W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 

AddBabyActivity Linie 160

 myRef.child("users").child(uId).addValueEventListener(new ValueEventListener() { 

BootService Linie 19

  addBabyActivity.startAlarm(this); 

Letzter Tag, mache ich startAlarm als statisch ohne Datenbank Firebase importieren und es mir eine erfolgreiche Anmeldung nach dem Neustart geben. Aber jetzt muss ich die statische entfernen, weil es eine viele Fehler an allen Linie in startAlarm Methode geben wird. Kann mir jemand mit diesem Fehler helfen?

Antwort

0

Es scheint, dass Ihre UID null ist, das ist, was Fehler sagt. Schau in diese Richtung. Wenn nötig, müssen Sie uId im lokalen App-Speicher speichern oder es vom Server abrufen, wenn möglich

+0

Nein, ich habe es bei onCreate Methode deklariert: 'protected void onCreate (Bundle savedInstanceState) { Super .onCreate (savedInstanceState); setContentView (R.layout.activity_add_baby); FirebaseUser user = FirebaseAuth.getInstance(). GetCurrentUser(); uId = Benutzer.getUid(); } ' –

+0

@EMFarih versuchen, System.out.println (UId) vor dem Aufruf und Sie werden wissen, ob es null ist.Error sagt, es gibt null Pfad String in Kind() –

+1

genial, Sie haben Recht ,. Ich muss nur die UID-Deklaration in startAlarm(); ... danke .. –

0

Calling Activity-Methode von Service die Art, wie Sie implementiert ist nicht empfohlen, Sie sollten Binder Service eher dies verwenden.

AddBabyActivity addBabyActivity = new AddBabyActivity(); 
addBabyActivity.startAlarm(this); 

Hoffnung unten Links helfen:

Calling activity class method from Service class

http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

+0

Entschuldigung, ich bin immer noch Anfänger :), kann ich nicht über den Link, den Sie geteilt haben, verstehen ... Könnten Sie mehr Details erklären? Danke.. –

Verwandte Themen