Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AlarmManager仅重复一次_Android_Broadcastreceiver_Alarmmanager_Android Alarms_Android Broadcastreceiver - Fatal编程技术网

Android AlarmManager仅重复一次

Android AlarmManager仅重复一次,android,broadcastreceiver,alarmmanager,android-alarms,android-broadcastreceiver,Android,Broadcastreceiver,Alarmmanager,Android Alarms,Android Broadcastreceiver,我正在尝试使用AlarmManager和服务向某些号码发送自动短信。我学习了一些教程,并写了如下内容: SwitchPreference testPref = (SwitchPreference) findPreference("key_auto_sms"); SharedPreferences sharedPrefs = getActivity().getSharedPreferences("XXXXXXXXX", MODE_PRIVATE);

我正在尝试使用
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.....
      }
    }
所以问题是,警报只会工作一次,然后在第二天停止


我遗漏了什么?

您不应该使用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);
            }

我会尝试你的方法,但另一个问题,也许你建议使用Github的一些库?谷歌的链接文档:如果你想要lib Github,它在这里:注意,我没有使用或遵循,所以我不能保证它会很好地工作。嘿,兄弟,我真的需要你的帮助,它不起作用。我试着用“set()”进行递归,它可以工作,仅此而已,但如果我用set重复它的工作3天,然后什么都没有:(…怎么了?我不明白,你能把代码发布到github吗?我能帮上忙,因为我最近也与alarmmanager一起工作,我上传了部分代码: