当前位置: 首页 > 知识库问答 >
问题:

Android AlarmManager只重复一次

秋建义
2023-03-14

我正试图使用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.....
      }
    }

我错过了什么?

共有1个答案

孟韬
2023-03-14

您不应该使用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);
            }
 类似资料:
  • 我对java有点陌生,习惯于用Python编写代码。因此,当涉及到获取用户输入时,我总是对执行这样的任务需要多少行代码感到恼火。所以我尝试创建自己的类来简化这个过程。我想表演这样的节目: 控制台内部: 以下是迄今为止的代码: 当我使用该类一次时,一切正常,但当我再次尝试使用它时,我会遇到一个异常: 输出: 我真的不知道为什么总是这样。请帮帮我,谢谢。

  • 我有一个文本“你好单词”“单词你好”,我如何获得“你好单词”“单词你好”(例如) ''' let string1="Hello Word"让引用String1="Hello Word" let string2="Word Hello"让引用String2="word Hello" '''

  • 我正在php上研究多对多关系,我有3个表,包括电影名称和电影id的movie表genre表包括类型和类型id的movie_genre表包括电影id和类型id的movie_genre表 genre表有这些值 我使用下面的代码来获取数据 但结果将类似于 movie_id movie_name genre[1] movie_id movie_name genre[2] movie_id movie_na

  • 我试图理解右值引用。这是我迄今为止编写的代码: 输出只有< code >“hello”,这让我很困惑。 由于 是传递给第二个构造函数的临时对象,因此代码输出就好像只调用第一个构造函数一样。 我猜这要么是编译器优化,要么我错过了关于构造函数和右值的一些细节。

  • 假设我们有熊猫表: 我们如何删除只有“狗”一个条目的行?例如,这将是带有pom,雪橇犬的行。 谢谢!

  • 我正在制作一个程序shell(#!/bin/sh),问题是printf只显示字符串param的第一个字。 这是为您简化的代码摘录: 此代码仅输出。