Android每日通知无法正常运行

时间:2015-08-21 15:43:13

标签: android android-service android-notifications android-broadcast android-alarms

我希望每天早上9点从我的应用中显示通知。

所以我使用Notification Manager,Alarm Manager,BroadcastReciever和Service来实现这一目标。

但我有问题,因为通知随机显示。当我第一次启动应用程序并设置时间时,它可以正常工作,但稍后该应用程序会在随机时间触发并显示通知。

我如何解决这个问题?

这是我的代码:

MainActivity

@Override
protected void onStart() {
    super.onStart();
    setAlarm();
}

public void setAlarm(){


    Calendar calendar = Calendar.getInstance();
    Calendar now = Calendar.getInstance();


    calendar.set(Calendar.HOUR_OF_DAY, 15);
    calendar.set(Calendar.MINUTE, 43);
    calendar.set(Calendar.SECOND, 0);

    if(calendar.getTime().after(now.getTime())) {
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmIntent = new Intent(MainActivity.this, HoroscopeNotification.class);
        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);


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

 }

HoroscopNotification(BroadcastReciever)

public class HoroscopeNotification extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent arg1) {
        showNotification(context);
    }

    private void showNotification(Context context) {
        Intent service1 = new Intent(context, AlarmService.class);
        context.startService(service1);
    }
}

AlarmService

public class AlarmService extends Service {
    private static final int NOTIFICATION_ID = 1;
    private NotificationManager notificationManager;
    private PendingIntent pendingIntent;

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

    @SuppressWarnings("static-access")
    @Override
    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        Context context = this.getApplicationContext();
        notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
        Intent mIntent = new Intent(this, MainActivity.class);
        pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle("Horoskop");
        builder.setContentText("Pročitajte današnji horoskop");
        builder.setSmallIcon(R.drawable.ic_bik);
        builder.setAutoCancel(true);
        builder.setContentIntent(pendingIntent);

        notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, builder.build());
    }
}

2 个答案:

答案 0 :(得分:2)

您会在适用于AlarmManager.setRepeating()州的Android SDK参考资料中注意到:

  

注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。 targetSdkVersion早于API 19的旧版应用程序将继续将所有警报(包括重复警报)视为完全警报。

您需要在APIv19之前使用AlarmManager.set(),在APIv19 +上使用AlarmManager.setExact()。当您的PendingIntent被解雇并且您在BroadcastReceiver.onReceive()收到广播时,您可以在第二天设置另一个确切的闹钟。

答案 1 :(得分:0)

Alarm Manager Example

我认为你应该按照上面的链接。从我的角度来看,你的设计模式(在Activity类中设置警报不是一个好方法)。相反(如上面的答案中所示),您应该从服务中设置警报。此外,通知代码位于BroadcastReceiver类,方法OnReceive(在示例中,它被评论为"在此处放置您的代码")。

祝你好运