查询有关AlarmManager和WakeLocks(Inquiry related to Alar

2019-10-21 19:57发布

我正在开发运行备份操作,每30分钟一个原生的Android应用程序。

我使用AlarmManager为了这个目的,它工作正常。 下面是我使用启动报警的代码:

public static void startSync(Context context) {
        alarmIntent = new Intent(context, AlarmReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
        manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
       // int interval = 3600000;
        int interval =30000 ;
        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

        ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
        Toast.makeText(context, "Sync Started", Toast.LENGTH_SHORT).show();
    }

这里是上获得方法:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        PowerManager pm = (PowerManager) context.getSystemService(context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
        wl.acquire();
        Intent eventService = new Intent(context, SyncInBackground.class);
        context.startService(eventService);
        wl.release();
    }
}

我注意到,当我的设备不处于待机状态,操作花了5秒(我计算出它在程序上),但是当移动处于待机模式下,它用了11秒。 这就是为什么我用wake_lock在后台运行的服务备份操作之前,为了让应用程序只需要5秒钟。

但我仍然得到同样的结果,如果在待机模式下移动...它仍然需要11秒以上,5数秒如果不是处于待机模式。

我能做些什么让我的后台服务运行的重复报警5秒而不是11秒?

Answer 1:

通常的错误:获取的的onReceive唤醒锁什么都不做。 该AlarmManager已持有的onReceive唤醒锁。 你的工作方式了纯粹的运气,当/如果它工作的。 你必须要么使用一个WakefulBroadcastReceiver或使用WakefulIntentService 。 的WIS将获得的静态唤醒锁,其将返回的onReceive和服务开始之间活性。

看到这里我的答案: 唤醒锁工作不正常的链接。



Answer 2:

问题是, context.startService(eventService)是一个异步操作,这是非常有可能在短短几毫秒的时间返回。 这意味着,当你获得一个WakeLock在你onReceive方法,你把它只是为几毫秒,你发布服务开始之前。

要解决这种情况的方法是分享你的广播接收器,并且你要推出的服务之间的一个唤醒锁定。 这是怎么WakefulIntentService工作,但你也可以自己做,例如,通过创建一个单独WakelockManager有两种方法,一种用于获取和一个用于释放激活锁定,然后让你的BroadcastReceiver称前者与您的服务请求后者。

此外,请记住泄漏wakelocks(通过收购之一,但忘记释放),可以在电池使用方面的严重后果。



文章来源: Inquiry related to AlarmManager and WakeLocks