我希望每天早上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());
}
}
答案 0 :(得分:2)
您会在适用于AlarmManager.setRepeating()
州的Android SDK参考资料中注意到:
注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。
targetSdkVersion
早于API 19的旧版应用程序将继续将所有警报(包括重复警报)视为完全警报。
您需要在APIv19之前使用AlarmManager.set()
,在APIv19 +上使用AlarmManager.setExact()
。当您的PendingIntent
被解雇并且您在BroadcastReceiver.onReceive()
收到广播时,您可以在第二天设置另一个确切的闹钟。
答案 1 :(得分:0)
我认为你应该按照上面的链接。从我的角度来看,你的设计模式(在Activity
类中设置警报不是一个好方法)。相反(如上面的答案中所示),您应该从服务中设置警报。此外,通知代码位于BroadcastReceiver
类,方法OnReceive
(在示例中,它被评论为"在此处放置您的代码")。