服务不是应该唤醒设备

时间:2016-06-14 11:44:35

标签: android xamarin xamarin.android android-5.0-lollipop

我的应用程序每秒都会执行重复请求 - 向服务器请求新数据,如果有这样的话 - 它会唤醒设备并运行主应用程序。 (这是用户的要求,他们不关心电池的使用情况,每秒都要运行。这是非常关键的操作) (用户可以对设置进行任何更改)

我正在尝试使用AlarmManagerSystem.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;
        }

1 个答案:

答案 0 :(得分:1)

使用AlarmManager.ELAPSED_REALTIME_WAKEUPAlarmManager.RTC_WAKEUP会在闹钟触发时唤醒设备。

  

设备在睡眠时停止请求服务器   并且在一些看起来像随机的时间它恢复它的工作短。   为什么会这样,以及如何解决这个问题?

这可能是因为PendingIntent正在调用Service。这样,设备可以在执行onStartCommand()之前返回休眠状态。 您应该使用BroadcastReceiver代替(WakeLock期间onReceive()已“保证”),在WakeLock中获取onReceive(),开始Service从那里开始,并在适当的时候从WakeLock释放Service

虽然在很长一段时间内(甚至在设备处于睡眠状态时)每秒重复一次请求似乎是一种糟糕的设计。它会很快耗尽电池。

您应该重新考虑您的实现,可能会使用某种回调机制,或者至少增加请求之间的间隔(显着)。