如何配置我的 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()
。
我的应用程序这一部分的目标是 运行 始终在后台发出重复警报,每 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()
。