WakefulBroadcastReceiver onReceive调用了两次

时间:2017-03-17 15:56:36

标签: android android-intent android-service wear-os android-broadcastreceiver

我需要通过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会被调用两次?

0 个答案:

没有答案