每次我打开应用程序时都会触发预定通知
Scheduled Notifications Triggers Every Time I Open App
我正在构建一个在 11:30 IST 触发通知的应用程序..我已经测试了它的工作但是在 11:30 每当我打开我的应用程序时它都会发出通知...
我不知道为什么我认为它应该是在时间检查中出现了一些错误...
我希望每天只按时触发一次通知...然后在第二天...:)
请解决这个问题
提前致谢
**MainActivity.java**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (ProgressBar)findViewById(R.id.progressBar);
spinner.setVisibility(View.GONE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
**AlarmReciever.java**
package com.alivestats.alivestats;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
public class AlarmReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int MID = 1;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
context).setSmallIcon(R.drawable.background)
.setContentTitle("title")
.setContentText("description").setSound(alarmSound)
.setAutoCancel(true).setWhen(when)
.setContentIntent(pendingIntent)
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
notificationManager.notify(MID, mNotifyBuilder.build());
MID++;
}
}
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
intent1 .setAction("ilove");
public void onReceive(Context context, Intent intent) {
if(!"ilove" .equalsIgnoreCase(getAction()))log.e("test",intent.getAction());
}
<receiver android:name="com.android.app.AlaramReceiver" android:exported="false">
<intent-filter>
<action android:name="ilove" />
</intent-filter>
</receiver>
喝了这么多茶和咖啡后,我自己编写了答案...
long t = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
if (t <= calendar.getTimeInMillis()) {
//calendar.add(Calendar.DATE, 6); //add 6 days.
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
intent1.setAction("NOTE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
//am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
else{
}
我刚刚将系统时间与通知时间进行了比较。如果通知时间小于等于系统时间,则它为真,接收者将工作。但如果不是,则什么都不会发生...
顺便说一句,感谢您帮助@tiny 和@Mahesh
calendar 日历 = Calendar.getInstance();
calendar.set(Calendar.HOUR, 6);
int myPreferedTime=calendar.get(Calendar.HOUR);
Calendar rightNow = Calendar.getInstance();
int currentHour = rightNow.get(Calendar.HOUR_OF_DAY);
Log.i("current time","is"+currentHour);
int difference=myPreferedTime-currentHour;
Log.i("Differencevalue","is"+difference);
switch(difference)
{
case 1:
rightNow.add(Calendar.HOUR_OF_DAY, 1);
break;
case 2:
rightNow.add(Calendar.HOUR_OF_DAY, 2);
break;
case 3:
rightNow.add(Calendar.HOUR_OF_DAY, 3);
break;
case 4:
rightNow.add(Calendar.HOUR_OF_DAY, 4);
break;
case 5:
rightNow.add(Calendar.HOUR_OF_DAY, 5);
break;
case 6:
rightNow.add(Calendar.HOUR_OF_DAY, 0);
break;
case -1:
rightNow.add(Calendar.HOUR_OF_DAY,23);
break;
case -2:
rightNow.add(Calendar.HOUR_OF_DAY,22);
break;
case -3:
rightNow.add(Calendar.HOUR_OF_DAY,21);
break;
case -4:
rightNow.add(Calendar.HOUR_OF_DAY,20);
break;
case -5:
rightNow.add(Calendar.HOUR_OF_DAY,19);
break;
case -6:
rightNow.add(Calendar.HOUR_OF_DAY,18);
break;
case -7:
rightNow.add(Calendar.HOUR_OF_DAY,17);
break;
case -8:
rightNow.add(Calendar.HOUR_OF_DAY,16);
break;
case -9:
rightNow.add(Calendar.HOUR_OF_DAY,15);
break;
case -10:
rightNow.add(Calendar.HOUR_OF_DAY,14);
break;
case -11:
rightNow.add(Calendar.HOUR_OF_DAY,13);
break;
case -12:
rightNow.add(Calendar.HOUR_OF_DAY,12);
break;
case -13:
rightNow.add(Calendar.HOUR_OF_DAY,11);
break;
case -14:
rightNow.add(Calendar.HOUR_OF_DAY,10);
break;
case -15:
rightNow.add(Calendar.HOUR_OF_DAY,9);
break;
case -16:
Log.i("am here","bcoz time is 11 clock");
rightNow.add(Calendar.HOUR_OF_DAY, 8);
break;
case -17:
rightNow.add(Calendar.HOUR_OF_DAY,7);
break;
case -18:
rightNow.add(Calendar.HOUR_OF_DAY,6);
break;
default:
break;
}
Intent intent1 = new Intent(MainActivity.this, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, 0);
Log.i("am sending", "yes");
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Log.i("time holding with me", "calendar stores time like" + rightNow.getTimeInMillis());
am.setRepeating(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
为防止每次启动App时(超过闹钟时间后)Alarm不断触发,可以添加:
Calendar timeNow = Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
if(calendar.before(timeNow)){
calendar.add(Calendar.DATE, 1);
}
mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, mAlarmPendingIntent);
我找到了上面的例子here。现在的时间根据闹钟时间进行检查,如果闹钟时间早于现在的时间,则将另一天添加到闹钟中。
希望这会有所帮助 :)。
我也遇到了这个问题,虽然尝试了此页面上的所有建议,但我无法解决我的问题。这是针对此问题的建议解决方案,它适用于我。
在manifest.xml
中注册接收者
<receiver android:name=".receivers.DayAlarmReceiver"/>
设置闹钟管理器
public void setDayAlarm(Context context) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 4);
AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, DayAlarmReceiver.class);
alarmIntent.putExtra("HOUR_OF_DAY", 4);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 5555, alarmIntent, 0);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
Log.d("Set the day alarm");
}
在接收方的 onReceive() 方法中检查 intent extras class
@Override
public void onReceive(Context context, Intent intent) {
int setHour = intent.getIntExtra("HOUR_OF_DAY", -1);
Calendar rightNow = Calendar.getInstance();
int currentHour = rightNow.get(Calendar.HOUR_OF_DAY);
if(currentHour == setHour){
Log.d("This is perfect, Trigger the alarm");
showNotification(context, msg);
}else{
Log.d("This is perfect, Trigger the alarm");
}
我正在构建一个在 11:30 IST 触发通知的应用程序..我已经测试了它的工作但是在 11:30 每当我打开我的应用程序时它都会发出通知...
我不知道为什么我认为它应该是在时间检查中出现了一些错误...
我希望每天只按时触发一次通知...然后在第二天...:)
请解决这个问题 提前致谢
**MainActivity.java**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (ProgressBar)findViewById(R.id.progressBar);
spinner.setVisibility(View.GONE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
**AlarmReciever.java**
package com.alivestats.alivestats;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
public class AlarmReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int MID = 1;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
context).setSmallIcon(R.drawable.background)
.setContentTitle("title")
.setContentText("description").setSound(alarmSound)
.setAutoCancel(true).setWhen(when)
.setContentIntent(pendingIntent)
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
notificationManager.notify(MID, mNotifyBuilder.build());
MID++;
}
}
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
intent1 .setAction("ilove");
public void onReceive(Context context, Intent intent) {
if(!"ilove" .equalsIgnoreCase(getAction()))log.e("test",intent.getAction());
}
<receiver android:name="com.android.app.AlaramReceiver" android:exported="false">
<intent-filter>
<action android:name="ilove" />
</intent-filter>
</receiver>
喝了这么多茶和咖啡后,我自己编写了答案...
long t = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
if (t <= calendar.getTimeInMillis()) {
//calendar.add(Calendar.DATE, 6); //add 6 days.
Intent intent1 = new Intent(MainActivity.this, AlarmReciever.class);
intent1.setAction("NOTE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
//am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
else{
}
我刚刚将系统时间与通知时间进行了比较。如果通知时间小于等于系统时间,则它为真,接收者将工作。但如果不是,则什么都不会发生...
顺便说一句,感谢您帮助@tiny 和@Mahesh
calendar 日历 = Calendar.getInstance();
calendar.set(Calendar.HOUR, 6);
int myPreferedTime=calendar.get(Calendar.HOUR);
Calendar rightNow = Calendar.getInstance();
int currentHour = rightNow.get(Calendar.HOUR_OF_DAY);
Log.i("current time","is"+currentHour);
int difference=myPreferedTime-currentHour;
Log.i("Differencevalue","is"+difference);
switch(difference)
{
case 1:
rightNow.add(Calendar.HOUR_OF_DAY, 1);
break;
case 2:
rightNow.add(Calendar.HOUR_OF_DAY, 2);
break;
case 3:
rightNow.add(Calendar.HOUR_OF_DAY, 3);
break;
case 4:
rightNow.add(Calendar.HOUR_OF_DAY, 4);
break;
case 5:
rightNow.add(Calendar.HOUR_OF_DAY, 5);
break;
case 6:
rightNow.add(Calendar.HOUR_OF_DAY, 0);
break;
case -1:
rightNow.add(Calendar.HOUR_OF_DAY,23);
break;
case -2:
rightNow.add(Calendar.HOUR_OF_DAY,22);
break;
case -3:
rightNow.add(Calendar.HOUR_OF_DAY,21);
break;
case -4:
rightNow.add(Calendar.HOUR_OF_DAY,20);
break;
case -5:
rightNow.add(Calendar.HOUR_OF_DAY,19);
break;
case -6:
rightNow.add(Calendar.HOUR_OF_DAY,18);
break;
case -7:
rightNow.add(Calendar.HOUR_OF_DAY,17);
break;
case -8:
rightNow.add(Calendar.HOUR_OF_DAY,16);
break;
case -9:
rightNow.add(Calendar.HOUR_OF_DAY,15);
break;
case -10:
rightNow.add(Calendar.HOUR_OF_DAY,14);
break;
case -11:
rightNow.add(Calendar.HOUR_OF_DAY,13);
break;
case -12:
rightNow.add(Calendar.HOUR_OF_DAY,12);
break;
case -13:
rightNow.add(Calendar.HOUR_OF_DAY,11);
break;
case -14:
rightNow.add(Calendar.HOUR_OF_DAY,10);
break;
case -15:
rightNow.add(Calendar.HOUR_OF_DAY,9);
break;
case -16:
Log.i("am here","bcoz time is 11 clock");
rightNow.add(Calendar.HOUR_OF_DAY, 8);
break;
case -17:
rightNow.add(Calendar.HOUR_OF_DAY,7);
break;
case -18:
rightNow.add(Calendar.HOUR_OF_DAY,6);
break;
default:
break;
}
Intent intent1 = new Intent(MainActivity.this, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, 0);
Log.i("am sending", "yes");
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Log.i("time holding with me", "calendar stores time like" + rightNow.getTimeInMillis());
am.setRepeating(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
为防止每次启动App时(超过闹钟时间后)Alarm不断触发,可以添加:
Calendar timeNow = Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 30);
if(calendar.before(timeNow)){
calendar.add(Calendar.DATE, 1);
}
mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, mAlarmPendingIntent);
我找到了上面的例子here。现在的时间根据闹钟时间进行检查,如果闹钟时间早于现在的时间,则将另一天添加到闹钟中。 希望这会有所帮助 :)。
我也遇到了这个问题,虽然尝试了此页面上的所有建议,但我无法解决我的问题。这是针对此问题的建议解决方案,它适用于我。
在manifest.xml
中注册接收者<receiver android:name=".receivers.DayAlarmReceiver"/>
设置闹钟管理器
public void setDayAlarm(Context context) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 4);
AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, DayAlarmReceiver.class);
alarmIntent.putExtra("HOUR_OF_DAY", 4);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 5555, alarmIntent, 0);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
Log.d("Set the day alarm");
}
在接收方的 onReceive() 方法中检查 intent extras class
@Override
public void onReceive(Context context, Intent intent) {
int setHour = intent.getIntExtra("HOUR_OF_DAY", -1);
Calendar rightNow = Calendar.getInstance();
int currentHour = rightNow.get(Calendar.HOUR_OF_DAY);
if(currentHour == setHour){
Log.d("This is perfect, Trigger the alarm");
showNotification(context, msg);
}else{
Log.d("This is perfect, Trigger the alarm");
}