2016-04-06 22 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つです。このようにして、アラームが表示されるたびに自動的に次のアラームもスケジュールされます。注:最初のアラームを登録できるように、ユーザーはアプリを一度開く必要があります。しかしその後、放送受信機はアラームのスケジューリングと表示を処理できます。 –

答えて

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

これは、あなたが放送を受信した現在の時刻を確認することができます。 –

関連する問題