【问题标题】:Android AlarmManager repeat only one timeAndroid AlarmManager 只重复一次
【发布时间】:2019-01-19 15:43:25
【问题描述】:

我正在尝试使用AlarmManager 和服务来向某个号码发送自动短信。我遵循了一些教程,并写了如下内容:

        SwitchPreference testPref = (SwitchPreference) findPreference("key_auto_sms");
        SharedPreferences sharedPrefs = getActivity().getSharedPreferences("XXXXXXXXX", MODE_PRIVATE);
        testPref.setChecked(sharedPrefs.getBoolean("AutoSMS", false));

        testPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                if (testPref.isChecked()) {

                    Calendar calendar = Calendar.getInstance();
                    calendar.setTimeInMillis(System.currentTimeMillis());
                    int curHr = calendar.get(Calendar.HOUR_OF_DAY);
                    // Checking whether current hour is over 14
                    if (curHr >= 15)
                    {
                        // Since current hour is over 15, setting the date to the next day
                        calendar.add(Calendar.DATE, 1);
                    }


                    calendar.set(Calendar.HOUR_OF_DAY, 15);
                    calendar.set(Calendar.MINUTE, 1);
                    calendar.set(Calendar.SECOND, 00);


                    AlarmManager am = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
                    Intent i = new Intent(getActivity(), AlarmReceiver.class);
                    final PendingIntent pi = PendingIntent.getBroadcast(getActivity(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
                    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);


                    SharedPreferences.Editor editor = getActivity().getSharedPreferences("XXXXXXXXX", MODE_PRIVATE).edit();
                    editor.putBoolean("AutoSMS", true);
                    editor.commit();
                    Toast.makeText(getActivity(), getResources().getString(R.string.Auto_SMS_Enable), Toast.LENGTH_SHORT).show();


                } else {

                    SharedPreferences.Editor editor = getActivity().getSharedPreferences("com.camel.work_list", MODE_PRIVATE).edit();
                    editor.putBoolean("AutoSMS", false);
                    editor.commit();
                    Toast.makeText(getActivity(), getResources().getString(R.string.Auto_SMS_Cancle), Toast.LENGTH_SHORT).show();

                    Intent intent1 = new Intent(getActivity(), AlarmReceiver.class);
                    final PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
                    AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
                    alarm.cancel(pendingIntent);
                    //getActivity().stopService(intent1);
                }
                return false;
            }
        });
    }

我的广播接收器:

    public class AlarmReceiver extends BroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {
       // MY auto sms method.....
      }
    }

所以问题是闹钟只会工作一次,然后第二天就会停止。

我错过了什么?

【问题讨论】:

    标签: android broadcastreceiver alarmmanager android-alarms android-broadcastreceiver


    【解决方案1】:

    您不应使用 setRepeating(),因为它在时间间隔上不准确。您可以一次使用 set() 函数,它会更准确地工作,当广播被调用时,您可以再次调用 set()(如递归),它会起作用。 这是我的闹钟设置代码,它不适用于像华为这样的设备,因为进程会被杀死。对于华为,我使用 JobScheduler。如果屏幕关闭时屏幕很亮,它可以正常工作。它不能正常工作。最近有一个 WorkManager 库,对所有设备都运行得更好,我没有时间研究它,所以我对 WorkManager 库没有任何建议。希望对你有帮助

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                assert alarmManager != null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(time, pendingIntent), pendingIntent);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
                } else {
                    alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
                }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2019-09-05
    • 2016-03-26
    相关资源
    最近更新 更多