不精确重复警报会触发系统事件

时间:2016-07-14 06:58:21

标签: android alarmmanager android-alarms

我正面临- (void)btnTap:(UIButton*) sender { if (!self.tableActivities.isEditing) { //Perform Action } } 的奇怪行为。

六个月前,我的公司向Google Play发布了一款应用。该应用程序的一项功能是同步来自服务器的数据,用户可以在其中执行手动同步或激活自动同步功能。

自动同步是一种不精确的重复闹钟,并按照Google在Scheduling Repeating Alarms教程中所描述的那样实现。

以下是启用/禁用警报的代码

AlarmManger

来自AlarmReceiver

public void startAlarm(Context context) {
    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(context, SyncAlarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    alarmManager.setInexactRepeating(
            AlarmManager.ELAPSED_REALTIME_WAKEUP,
            AlarmManager.INTERVAL_HOUR,
            AlarmManager.INTERVAL_HOUR,
            alarmIntent
    );

    ComponentName receiver = new ComponentName(context, BootAlarmReceiver.class);
    PackageManager packageManager = context.getPackageManager();

    packageManager.setComponentEnabledSetting(receiver,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);

    Log.i("Sync", "Sync alarm started");
}

public void stopAlarm(Context context) {
    alarmManager.cancel(alarmIntent);

    ComponentName receiver = new ComponentName(context, BootAlarmReceiver.class);
    PackageManager packageManager = context.getPackageManager();

    packageManager.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);

    Log.i("Sync", "Sync alarm stopped");
}

该功能已在多个设备中进行了测试,并且按预期工作。此外,直到现在,没有用户抱怨该功能无效。

到目前为止一切顺利。但是,2周前,一位新开发人员加入了我们的团队,并在她Meizu M2 Note中安装了该应用。现在这就是事情变得复杂的地方。

她注意到(在2GB免费数据计划用得太快的某些日子之后)应用程序每5或6秒同步一次。

我们首先想到的是我们没有正确设置闹钟。但是,在多次查看代码而没有找到可能已经错误设置的任何线索之后,我们决定下载在web上找到的一些项目样本,看看是否会发生相同的行为。好吧,public class SyncAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i("Sync", "Auto sync started"); context.startService(AndroidSyncService.AUTO_SYNC_INTENT(context)); } } 具有完全相同的行为。警报随机发射并经常发射。

经过一番进一步调查后,我们发现这种行为并非随意。似乎某些特定操作正在触发警报,例如打开/关闭屏幕,锁定/解锁设备,打开/关闭互联网连接。

关于可能导致这种情况的任何想法?

0 个答案:

没有答案