我需要通过Fitness API定期从Google健身中读取数据,以便进行表盘开发。
我每隔POLL_INTERVAL_MS间隔使用AlarmManager将一个Intent广播到一个WakefulBroadcastReceiver,它启动一个执行数据读取任务的IntentService。
这是我正在使用的代码。
在清单文件中
<receiver android:name=".FitDataAlarmReceiver"></receiver>
在表盘引擎onCreate
FitDataAlarmReceiver mFitDataAlarmReceiver = new FitDataAlarmReceiver();
mFitDataAlarmReceiver.setAlarm(MyApp.this);
在FitDataAlarmReceiver类
中public class FitDataAlarmReceiver extends WakefulBroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
private static final long FIT_DATA_POLL_INTERVAL_MS = TimeUnit.SECONDS.toMillis(60);
public void setAlarm(Context context) {
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, FitDataAlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 123456, intent, 0);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, POLL_INTERVAL_MS, POLL_INTERVAL_MS, alarmIntent);
}
public void cancelAlarm(Context context) {
if (alarmMgr!= null) {
alarmMgr.cancel(alarmIntent);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, FitDataManagerService.class);
startWakefulService(context, service);
}
}
在我的IntentService中,我获得一个新的唤醒锁,启动数据读取内容,然后将其与接收器一起释放(通过调用completeWakefulIntent方法)。
cancelAlarm方法当然是在表面onDestroy中调用的。
mFitDataAlarmReceiver.cancelAlarm(MyApp.this);
有效。但是,正在发生的是FitDataAlarmReceiver类中的onReceive非常快速地触发两次,甚至没有考虑setRepeating方法调用的第一个POLL_INTERVAL_MS参数。
在接收器开始接收正确的定时调用之前,需要几个 - 字面上 - 错误的警报。我不知道为什么。
SetAlarm仅在watch face引擎的onCreate方法中调用一次。 然而,表面引擎本身的onCreate方法也(莫名其妙地)被称为两次(!)。
我使用简单的信号量过滤掉了第二次onCreate调用,现在只调用一次。 尽管如此,onReceive仍然被调用两次。 只有当我使用调试器并在onReceive中放置一个断点时,它才被调用一次。
这是我的问题:
为什么watch表中的onCreate方法面向Engine类调用了两次?
而且,即使我设法过滤掉一个电话,为什么接收器onReceive会被调用两次?