【问题标题】:Scheduled Notifications Triggers Every Time I Open App每次打开应用程序时都会触发预定通知
【发布时间】:2015-12-04 11:44:19
【问题描述】:

我正在构建一个应用程序,它会在 IST 11:30 触发通知..我已经对其进行了测试,但在 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++;

}

}

【问题讨论】:

  • 在清单中注册时,您将哪个 提供给了 BroadcastReceiver。?
  • 你是怎么赶到 11:30 的?
  • 我刚刚把
  • RTC_WAKEUP ->ELAPSED_REALTIME_WAKEUP
  • 是什么意思? @tinysunlight

标签: android notifications broadcastreceiver


【解决方案1】:

在喝了这么多茶和咖啡之后,我自己编写了答案......

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 的帮助

【讨论】:

  • 如果用户在 11:31:00 第一次打开应用程序并在两天后重新打开应用程序会发生什么.. 在这种情况下,警报管理器将永远无法工作,并且通知将不会在 11:30:00 显示一天后...
  • @MahmoodAli 通知管理器正在后台运行..所以直到手动停止后台服务或由于某些崩溃..或其他原因..每次都会发出通知11:31:00(第一次开放时间)在下一次上午 11:30:00 发生.. 任何一天..:)
  • 我的意思是,当用户在 11:31 首次打开应用程序时,am.set(...) 应至少执行一次以注册系统广播的意图: 00 这行代码不会执行,因此 Intent 不会注册,并且 AlarmReceiver 中的 onReceive 不会在下次上午 11:30:00 发生时触发,因此永远不会发出通知。对不起我的英语不好,我希望你明白我的意思
【解决方案2】:
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>

【讨论】:

  • 在 MainActivity 或 AlarmReciever 中放置 onRecieve() 函数的位置 ??@tiny
  • 它就在您的 AlarmReciever 中。
  • 您只需要在创建 PendingIntent 的位置添加 Action 并在显示通知之前检查 Action。
  • 仍然面临同样的问题 :( 触发通知...:( @tiny
【解决方案3】:

日历日历 = 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);

【讨论】:

  • 我花了一周的时间来解决 schedule-notifications-triggers-every-time-i-open-app 的问题,如果有人有疑问,请告诉我
  • 请为您的回答提供更多信息。仅仅添加一个脚本是不够的。
  • 在上面的脚本中,我正在做数学计算,主要是在当前时间和我的首选时间之间产生差异,并且根据差异值我决定向应用程序添加小时数,以便它会在每早上 6:00(AM)-(7:00)
【解决方案4】:

为了防止每次启动App时(在闹钟时间过去后)不断触发警报,可以添加以下内容:

    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。对照闹钟时间检查现在时间,如果闹钟时间早于现在时间,则将另一天添加到闹钟中。 希望这会有所帮助:)。

【讨论】:

    【解决方案5】:

    我也遇到了这个问题并尝试了此页面上的所有建议,但我无法解决我的问题。这是针对此问题的建议解决方案,它对我有用。

    在 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

    @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");
     }
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多