如何配置我的 AlarmReceiver 以在我想要的时间间隔实际触发?

How do I configure my AlarmReceiver to actually trigger at my desired interval?

我的应用程序这一部分的目标是 运行 始终在后台发出重复警报,每 15 分钟从服务器端机器学习算法获取新的预测,更新应用程序。

我目前已实现此所需行为的框架,以确保我的方法正确。这个骨架应该每 10 秒触发一次吐司,说明警报正在工作。但是,在我最初设置闹钟后,我再也看不到其他消息了。我还包含了对控制台的写入,但这也从未出现过,这让我相信我并不完全了解警报接收器的工作原理。

这是我的主要 activity class 实例化警报和接收器:

public class MainActivity extends AppCompatActivity implements
        TimePickerFragment.FragmentCallbacks {

    private PendingIntent pendingIntent;
    private AlarmManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Retrieve a PendingIntent that will perform a broadcast
        Intent alarmIntent = new Intent(this, PredictionUpdateReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
        startAlarm();

        //...
    }

    //...

    public void startAlarm() {
        manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        int interval = 10000;

        manager.setRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), interval, pendingIntent);
        Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
    }
}

这是我的闹钟接收器class:

public class PredictionUpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // For our recurring task, we'll just display a message
        Toast.makeText(arg0, "I'm running", Toast.LENGTH_SHORT).show();
        System.out.print("Alarm activated");

    }

}

并且我更新了清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.habitabilitystudy"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="22" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name=".PredictionUpdateReceiver"></receiver>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

嗯,你有几个问题。

首先,setRepeating() 在 Android 4.4 及更高版本上不准确,targetSdkVersion 为 19 或更高版本。他们没有说明 "inexact" 它实际上是怎样的,所以我不知道你的闹钟会在什么时候安排。

其次,a repeating alarm period of less than one minute is not allowed on Android 5.1+,由于未记录的回归。一分钟以下的时段将四舍五入为一分钟。所以,无论不准确,你都不会在10秒内得到控制。

最后,changes coming in the next version of Android 意味着当设备处于空闲状态(且未充电)或者如果用户没有 return 您的应用很长一段时间(设备未充电时)。这对你现在没有影响,但你可能想考虑一下你对你正在做的事情的态度是否会继续下去。

您可以使用 adb shell dumpsys alarm 查看您的闹钟是否已安排。不幸的是,除非他们修复了问题,否则由于不准确的问题,它不会告诉您警报何时真正 运行。

此外,我建议使用 Log.d(),或者最差的 System.out.println(),而不是 System.out.print()