使用BootService重启后重启AlarmManager

时间:2017-08-14 06:15:55

标签: android firebase-realtime-database notifications broadcastreceiver alarmmanager

3天前,我问过这样的问题My Question 3 days Ago。现在我有了新的问题。请参阅下面的代码。

我有一个 startAlarm()方法

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) {

        }
    });
}

当我在普通活动中调用它时,它会给我一个通知。但是当我从 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;
}

重新启动手机时出现错误

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第160行

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

BootService第19行

            addBabyActivity.startAlarm(this);

最后一天,我将 startAlarm 设为静态而不导入数据库firebase,并在重启后给我一个成功的通知。但是现在,我必须删除静态,因为它会在 startAlarm方法的所有行中产生很多错误。有人可以帮我解决这个错误吗?

2 个答案:

答案 0 :(得分:0)

看来你的uId是空的,那是什么错误。看那个方向。如果需要,那么你必须将uId保存在本地app内存中,或者如果可能的话从服务器中检索它

答案 1 :(得分:0)

不推荐使用您实施的方式从服务中调用Activity方法,您应该使用Binder Service而不是此。

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

希望以下链接有助于:

Calling activity class method from Service class

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

相关问题