空闲时的AlarmManager +服务(屏幕关闭)

时间:2016-09-14 19:05:51

标签: android service alarmmanager

我通过闹钟管理器致电我的服务

像这样:

 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时,这个停止工作。

2 个答案:

答案 0 :(得分:1)

现在使用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);

答案 1 :(得分:0)

我使用Vyacheslav的答案解决了我的问题,但是没有使用AlarmManager,因为setExact didint在空闲时工作,我的android是一个低于23的api(并且没有setExactAndAllowWhileIdle)我在我的启动应用中使用了一个timertask案件工作很好,我只是在我的申请运行时需要这个。