我的应用程序每秒都会执行重复请求 - 向服务器请求新数据,如果有这样的话 - 它会唤醒设备并运行主应用程序。 (这是用户的要求,他们不关心电池的使用情况,每秒都要运行。这是非常关键的操作) (用户可以对设置进行任何更改)
我正在尝试使用AlarmManager
或System.Threading.Timer
(尝试使用两者)来实现这一目标,但每次我最终都会遇到以下问题:
(操作系统:Android 5.x)
Java中服务变体的代码(使用AlarmManager)
Calendar cal = Calendar.getInstance();
cal.add( Calendar.SECOND, ConfigReader.serviceRepeatInterval );
Intent intent = new Intent( this, SaleService.class );
PendingIntent pintent = PendingIntent.getService( this, 0, intent, 0 );
AlarmManager alarm = ( AlarmManager )getSystemService( Context.ALARM_SERVICE );
alarm.setRepeating( AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), ConfigReader.serviceRepeatInterval, pintent );
服务变体的代码是使用Timer的C#(Xamarin)。
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
if( _powerManager == null )
{
_powerManager = (PowerManager)this.GetSystemService(PowerService);
_wakeLock = _powerManager.NewWakeLock( WakeLockFlags.Full | WakeLockFlags.AcquireCausesWakeup | WakeLockFlags.OnAfterRelease, mySaleServiceWakeLock );
vibrator = (Vibrator)this.GetSystemService( Context.VibratorService );
}
timer = new System.Threading.Timer( getCurrentPendingObjects, null, timerRepeatInterval, Timeout.Infinite );
return StartCommandResult.Sticky;
}
答案 0 :(得分:1)
使用AlarmManager.ELAPSED_REALTIME_WAKEUP
或AlarmManager.RTC_WAKEUP
会在闹钟触发时唤醒设备。
设备在睡眠时停止请求服务器 并且在一些看起来像随机的时间它恢复它的工作短。 为什么会这样,以及如何解决这个问题?
这可能是因为PendingIntent
正在调用Service
。这样,设备可以在执行onStartCommand()
之前返回休眠状态。
您应该使用BroadcastReceiver
代替(WakeLock
期间onReceive()
已“保证”),在WakeLock
中获取onReceive()
,开始Service
从那里开始,并在适当的时候从WakeLock
释放Service
。
虽然在很长一段时间内(甚至在设备处于睡眠状态时)每秒重复一次请求似乎是一种糟糕的设计。它会很快耗尽电池。
您应该重新考虑您的实现,可能会使用某种回调机制,或者至少增加请求之间的间隔(显着)。