【问题标题】:Unable to set repeat alarm on boot time无法在启动时设置重复警报
【发布时间】:2016-03-17 06:18:28
【问题描述】:

我在晚上 10:30 收到通知。但是当我的设备在晚上 10:30 关闭时,然后在我在晚上 11:00 打开设备后,我没有收到待处理的通知。所以我不明白问题是什么。任何帮助将不胜感激。

这是我在创建活动中的代码。

    Intent alarmIntent = new Intent(CH_Dashboard.this,  TimeAlarmEvening.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(CH_Dashboard.this, 0, alarmIntent, 0);

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

    Calendar firingCal = Calendar.getInstance();
    Calendar currentCal = Calendar.getInstance();

    firingCal.set(Calendar.HOUR, 10);
    firingCal.set(Calendar.MINUTE, 30);
    firingCal.set(Calendar.SECOND, 0);
    firingCal.set(Calendar.AM_PM,Calendar.PM);

    long intendedTime = firingCal.getTimeInMillis();
    long currentTime = currentCal.getTimeInMillis();

    if(intendedTime >= currentTime)
    {
        manager.setRepeating(AlarmManager.RTC,
                intendedTime, AlarmManager.INTERVAL_DAY,
                pendingIntent);
    }
    else
    {
        firingCal.add(Calendar.DAY_OF_MONTH, 1);
        intendedTime = firingCal.getTimeInMillis();

        manager.setRepeating(AlarmManager.RTC,
                intendedTime, AlarmManager.INTERVAL_DAY,
                pendingIntent);
    }

我的接收器代码在这里,并在设备开启时成功收到通知。

        Intent notificationIntent = new Intent(context, CH_Dashboard.class);
        notificationIntent.putExtra("fromNotification","notify");
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(CH_Dashboard.class);
        stackBuilder.addNextIntent(notificationIntent);

        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

        builder.setAutoCancel(true);

        Notification notification = builder.setContentTitle("Demo App Notification")
                .setContentText("New Notification From Demo App..")
                .setTicker("New Message Alert!")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent).build();

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notification);

这是我的启动接收器代码。

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
    {
     Intent alarmIntent = new Intent(context, TimeAlarmEvening.class);
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Calendar firingCal = Calendar.getInstance();
    Calendar currentCal = Calendar.getInstance();

    firingCal.set(Calendar.HOUR, 10);
    firingCal.set(Calendar.MINUTE, 30);
    firingCal.set(Calendar.SECOND, 0);
    firingCal.set(Calendar.AM_PM,Calendar.PM);

    long intendedTime = firingCal.getTimeInMillis();
    long currentTime = currentCal.getTimeInMillis();

    if(intendedTime >= currentTime)
    {
        manager.setInexactRepeating(AlarmManager.RTC,
                intendedTime, AlarmManager.INTERVAL_DAY,
                pendingIntent);
    }
    else
    {
        firingCal.add(Calendar.DAY_OF_MONTH, 1);
        intendedTime = firingCal.getTimeInMillis();

        manager.setInexactRepeating(AlarmManager.RTC,
                intendedTime, AlarmManager.INTERVAL_DAY,
                pendingIntent);
    }

  }

最后在清单中我声明了接收者。

     <receiver
        android:name=".model.AutoStart"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

    <receiver android:name=".TimeAlarmEvening">
        <intent-filter>
            <action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

【问题讨论】:

    标签: android alarmmanager android-pendingintent


    【解决方案1】:

    我那天解决了,但忘了在这里回答。我对清单文件进行了一些更改。只需删除意图过滤器和作品中的行类别默认值即可。

     <receiver
        android:name=".model.AutoStart"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    
    <receiver android:name=".TimeAlarmEvening">
        <intent-filter>
            <action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
        </intent-filter>
    </receiver>
    

    【讨论】:

      【解决方案2】:

      我不会为你写下整个代码。但我可以告诉你在哪里可以应用你的逻辑。

      -> 首先,找到一种方法来跟踪自己,错过了什么,例如通过跟踪数据库中的事件状态。

      -> 然后,设置一个BOOT_COMPLETED BroadcastReceiver 来查找手机何时重启。在那里,安排任何仍在未来的警报,并决定如何处理过去发生但错过的警报(例如,发出通知指出错过的事件)。

      -- 一种方法是监听手机关机事件:

      <action android:name="android.intent.action.ACTION_SHUTDOWN" />
      

      在设备关机前,保存关机时间。

      然后监听设备启动:

      <action android:name="android.intent.action.BOOT_COMPLETED" />
      

      并编写您自己的逻辑来确定在停机期间会触发哪些警报,并使用 AlarmManager 立即触发这些警报。

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        相关资源
        最近更新 更多