首页 > 解决方案 > 如果应用程序关闭,警报管理器不会触发(从最近的应用程序中删除)

问题描述

我已经编写了即使应用程序关闭也会在特定时间发送通知的代码。这段代码对我来说很好,但只有一个我无法理解的问题。

失败场景:

当我安装应用程序并从界面设置警报并关闭应用程序(从最近的应用程序中删除应用程序)时,我的广播接收器没有被触发。

工作场景:

当我安装应用程序并首次打开时,我将其关闭并再次打开应用程序。之后,我设置了闹钟并再次关闭应用程序。这次我广播接收器被触发。

我不知道为什么在安装后第一次打开应用程序时它的工作方式不同。

设置警报的时间选择器对话框

private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() {

        public void onTimeSet(TimePicker view, int pickerHour,
                              int pickerMinute) {
            Calendar Cal = Calendar.getInstance();
            int hour = pickerHour;
            int minute = pickerMinute;

            Cal.setTimeInMillis(System.currentTimeMillis());
            Cal.set(Calendar.HOUR_OF_DAY, hour);
            Cal.set(Calendar.MINUTE, minute);
            Cal.set(Calendar.SECOND, 0);

            Editor e = sharedPrefs.edit();
            e.putLong("userTime", Cal.getTimeInMillis());
            e.commit();
            mytime.setSummary(DateFormat.getTimeFormat(getBaseContext())
                    .format(new Date(Cal.getTimeInMillis())));

            new AlarmTask(UserSettingActivity.this, Cal).run();
        }
    };

这是我的警报管理器类代码

 public class  AlarmTask implements Runnable{

    private final Calendar date;
    private final AlarmManager alarmManager;
    private final Context context;

    public AlarmTask(Context context, Calendar date) {
        this.context = context;
        this.alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        this.date = date;
    }

    @Override
    public void run() {


        Log.d("abc","alarm settled");

        Intent intent = new Intent(context, com.quotes.beinspiration.AlarmReceiver.class);
        intent.putExtra(NotifyService.INTENT_NOTIFY, true);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 5399, intent, PendingIntent.FLAG_UPDATE_CURRENT);
       

        if (Build.VERSION.SDK_INT >= 23) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                    date.getTimeInMillis(), pendingIntent);
        } else if (Build.VERSION.SDK_INT >= 19) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);
        }
    }
}

广播接收器代码

public class AlarmReceiver extends BroadcastReceiver {
  
    public void onReceive(Context context, Intent intent) {
        Log.d("abc","Broadcast Received");
        Intent i = new Intent(context, NotifyService.class);
        intent.putExtra(NotifyService.INTENT_NOTIFY, true);
        context.startService(i);
    }
}

在清单中注册的广播

<receiver android:name="com.quotes.beinspiration.AlarmReceiver"/>

任何形式的帮助将不胜感激。

标签: androidandroid-broadcast

解决方案


推荐阅读