我通过闹钟管理器致电我的服务
像这样: 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时,这个停止工作。
答案 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案件工作很好,我只是在我的申请运行时需要这个。