PendingIntent似乎在初始化时开始

时间:2017-08-22 14:58:27

标签: android android-intent notifications android-pendingintent alarm

该应用程序的计划是每天上午7点发出通知,该通知实际上已经有效。事情是,第一次启动应用程序时,它会询问登录数据,这通常也有效,但如果用户提交的速度不够快,应用程序就会崩溃。

这是MainActivity中的代码,如果用户尚未提交,则会运行该代码:

Calendar calendar = Calendar.getInstance();
                    calendar.set(Calendar.HOUR_OF_DAY, 7);
                    calendar.set(Calendar.MINUTE, 0);
                    calendar.set(Calendar.SECOND, 0);

                    Intent intent1 = new Intent(this, NotificationClass.class);
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 100, intent1, 0);
                    AlarmManager am = (AlarmManager) getSystemService(MainActivity.this.ALARM_SERVICE);
                    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

我猜NotificationClass正在启动,因为崩溃的“源”是由NotificationClass启动的loadText.java的代码。该计划实际上只是每天早上7点开始,如上所述。 有人知道这个问题还是有想法?我已经尝试了不同的旗帜。

提前致谢!

logcat错误:

08-22 14:54:02.217 2762-2762/de.kurt.vertretungsplan E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: de.kurt.vertretungsplan, PID: 2762
                                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Element.select(java.lang.String)' on a null object reference
                                                                           at de.kurt.vertretungsplan.loadText$loadTextAsyncTask.onPostExecute(loadText.java:112)
                                                                           at de.kurt.vertretungsplan.loadText$loadTextAsyncTask.onPostExecute(loadText.java:35)
                                                                           at android.os.AsyncTask.finish(AsyncTask.java:667)
                                                                           at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                           at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
08-22 14:54:02.232 1247-1293/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
08-22 14:54:02.295 1462-3018/system_process E/EGL_emulation: tid 3018: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)

1 个答案:

答案 0 :(得分:0)

您获得Calendar个实例并将时间设置为7:00:00。这会将Calendar时间设置为当天的7:00:00。

然后你这样做:

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

这将设置一个警报,该警报将在今天的7:00:00和之后的每天的7:00:00发生。假设您在7:00:00之后运行此代码,警报将立即触发,因为警报时间已过去。

为防止这种情况发生,您需要确保Calendar时间大于当前时间。如果不是,您应该在Calendar之前添加一天,然后再致电am.setRepeating()

作为@MikeM。建议,请参阅android prevent immediate trigger of alarm service if alarm time has passed for the day了解详情。