0

我想在每天早上9點從我的應用程序中顯示通知。Android每日通知無法正常工作

所以我使用通知管理器,報警管理器,BroadcastReciever和服務來實現這一點。

但我有一個問題,因爲通知顯示隨機。當我第一次啓動應用程序並設置時間時,它可以正常工作,但隨後應用程序會隨機啓動並顯示通知。

我該如何解決這個問題?

這裏是我的代碼:

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

您應該添加日誌以查看實際註冊的日曆是什麼。這會給你一個明確的指示,說明什麼是實際登記的,什麼時候應該開火。 – JoxTraex

回答

2

你在爲AlarmManager.setRepeating()美國Android SDK的參考材料發現:

注:爲API 19日,所有重複報警是不準確的。如果您的應用程序需要精確的交付時間,那麼它必須使用一次性精確警報,如上所述每次重新安排時間。 targetSdkVersion早於API 19的傳統應用程序將繼續保留其所有警報,包括重複警報,並將其視爲確切對待。

您需要在APIv19 +上的pre-APIv19和AlarmManager.setExact()上使用AlarmManager.set()。當您的PendingIntent被解僱並且您在BroadcastReceiver.onReceive()中收到廣播時,您可以爲第二天設置另一個精確警報。

+0

我應該首先在其他地方設置警報嗎? – Zookey

+0

嘿,我最初需要在哪裏設置鬧鐘? – Zookey

+0

是的。當用戶啓動您的應用程序。所以是你的MainActivity。 – Simon

0

Alarm Manager Example

我想你應該按照上面的鏈接。從我的角度來看,您的設計模式(設置Activity類中的鬧鐘不是一個好方法)。相反(如上面的答案中所示),您應該從服務設置鬧鐘。此外,通知的代碼在BroadcastReceiver類中,方法OnReceive(在該例中它被評論爲「放在這裏代碼」)。

好運

相關問題