AlarmManager + Service on Idle(屏幕关闭)

AlarmManager + Service on Idle (screen off)

我用警报管理器调用我的服务

像这样:

 alarmManage.setExact(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + getPoolingInterval(), pendingIntentPolling);

在我的 ServicePooling 上,我以同样的方式重新安排它,这个 ServicePooling 调用另一个服务来发送我服务上的数据。

Intent serviceSocket = new Intent(this.context, SenderService.class);
    this.context.startService(serviceSocket);

我每分钟都在我的服务器上收到轮询通信,一切都很好,但是当我的设备屏幕关闭并且没有插入 USB 时,这将停止工作。

如今将 Service 用于 AlarmManager 是个坏主意。请改用 WakefulBroadcastReceiver。你的设备睡着了然后拔掉了。

public class BRMine extends WakefulBroadcastReceiver {
    public static final String INTENT_FILTER = "com.example.BRMine";
    @Override
    public void onReceive(Context ctx, Intent intent) {
        // TODO Auto-generated method stub
        OWakeLocker.acquire(ctx, _.indexNOTS);
        ComponentName comp = new ComponentName(ctx.getPackageName(),
                SMine.class.getName());
        startWakefulService(ctx, intent.setComponent(comp));
    }

}

其中:

public class OWakeLocker { private static PowerManager.WakeLock[] wakeLocks = new PowerManager.WakeLock[_.indexNOTS_MAX];//服务计数

@SuppressWarnings("deprecation")
public static void acquire(Context ctx, int index) {
    WakeLock wakeLock = wakeLocks[index];
    if (wakeLock != null) wakeLock.release();

    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, _.APPNAME + Integer.toString(index));
    if (wakeLock != null && wakeLock.isHeld()){
        wakeLock.acquire();
    }
}

public static void release(int index) {
    WakeLock wakeLock = wakeLocks[index];
    if (wakeLock != null) 
        wakeLock.release();
        wakeLock = null;
}}

开始:

  Intent intent = new Intent(BRMine.INTENT_FILTER);
PendingIntent pi = PendingIntent.getBroadcast(ctx, myintentalarm, intent, PendingIntent.FLAG_CANCEL_CURRENT):
am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi);

我使用 Vyacheslav 的答案解决了我的问题,但没有使用 AlarmManager,因为 setExact 在空闲时对我有用,而我的 android 是 api 低于 23(并且没有 setExactAndAllowWhileIdle)在我的案例中,我在 startapplication 上使用了一个定时器任务,效果很好,我只在我的应用程序运行时需要它。