2016-04-06 59 views
1

我正在Android中建立一個水提醒應用程序,我想提醒用戶在白天多次喝水,而用戶不必打開應用程序(以便意圖廣播接收機將被髮送)。什麼是最好的方式來做到這一點?這裏是我的代碼:多個廣播與AlarmManager和BroadcastReceiver自我調用

AlertReceiver.java MainActivity.java

Long alertTime = nextAlarm.getTimeInMillis(); 
     Intent alertIntent = new Intent(this, AlertReceiver.class); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, 
       PendingIntent.getBroadcast(this, 1, alertIntent, 
         PendingIntent.FLAG_UPDATE_CURRENT)); 
提前

感謝

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v4.app.NotificationCompat; 

public class AlertReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     createNotification(context, "DRINK", "Time to hydrate", "Alert"); 
    } 

    public void createNotification(Context context, String msg, String msgText, String msgAlert) { 

     PendingIntent notificationIntent = PendingIntent.getActivity(context, 0, 
       new Intent(context, MainActivity.class), 0); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) 
       .setSmallIcon(R.drawable.ic_announcement) 
       .setContentTitle(msg) 
       .setContentText(msgText) 
       .setTicker(msgAlert); 

     notificationBuilder.setContentIntent(notificationIntent); 

     notificationBuilder.setDefaults(Notification.DEFAULT_ALL); 

     notificationBuilder.setAutoCancel(true); 

     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager.notify(1, notificationBuilder.build()); 

    } 

} 

部分!

+0

您可以安排在下一杯酒報警在你的'AlertReceiver'中顯示通知。應該能夠像你在活動中一樣完成。我還建議創建另一個接收器來查找BOOT_COMPLETED廣播,因爲當設備斷電時所有報警都將被刪除。 –

+0

所以你的意思是我應該完成確定下一次報警應該在'AlertReceiver'裏面的整個過程嗎? –

+0

這是一種方法,是的。這樣,任何時候顯示報警時,它都會自動安排下一個報警。注意:用戶仍然需要打開應用程序一次,以便可以註冊初始警報。但在此之後,您的廣播接收機可以處理調度和顯示報警。 –

回答

1

更正您不需要背景服務。 您需要將其放入後臺服務中。

根據發佈的教程中的信息。您可能沒有將報警服務連接到正確的位置。

https://guides.codepath.com/android/Starting-Background-Services#using-with-alarmmanager-for-periodic-tasks

在活動

Long alertTime = nextAlarm.getTimeInMillis(); 
    Intent alertIntent = new Intent(this, AlertReceiver.class); 

//ADD THIS 
final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, AlarmManager.INTERVAL_HALF_HOUR, pIntent); 

    // REMOVE THIS: 
    alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, 
      PendingIntent.getBroadcast(this, 1, alertIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT)); 

這應該完成你需要根據您所提供的信息,並在該教程的細節做什麼

+0

我不明白這是如何工作的,你可以舉一個例子說明在這種情況下我會如何做到這一點? (希望你明白我想做什麼)。 –

+0

對不起,有很多評論,但我仍然不知道如何停止當天的鬧鐘,並在第二天再次啓動,而無需用戶打開應用程序。 –

0

雅這是正確的方式來做到這一點。如果您想要調用重複警報調度,請檢查this鏈接。

+0

我已經閱讀過這篇文章,但它並沒有解釋在一天結束時,我將如何停止鬧鐘,並在第二天在特定時間再次啓動鬧鐘。這應該在用戶不必打開應用程序的情況下發生。 –

+0

爲此,您可以查看收到廣播時的當前時間。 –

相關問題