У меня есть Сервис, который использует пользовательский класс Соединения (расширяет поток) к аппаратному контроллеру. Когда Пользователь предпочитает, я хочу поддерживать это соединение на постоянной основе. У меня уже есть код для обработки, когда устройство Android теряет подключение к Интернету, переключается между Wi-Fi и т. Д.
Для того, чтобы оставаться на связи, контроллер требует, чтобы вы говорили с ним в течение каждых 5 минут. В настоящее время в классе Connection запускается поток, который запускается с помощью while () и проверяет системное время и время последнего обращения, а когда> 4 минуты, он запрашивает состояние. Почему-то в разное время общение не происходит во времени. то есть происходит через 5 минут. Служба не умирает, насколько я могу судить, но "Пинг" к контроллеру запаздывает. Этого не происходит, когда телефон подключен к зарядному устройству (или отладчику). Кроме того, при переносе Службы на передний план происходит то же самое.
Замедляет ли телефон свой процессор при переходе в спящий режим?
Есть ли лучший способ?
Я думаю, что это AlarmManger, но мне трудно заставить его работать с внутренним классом, в Службе. Я попытался использовать демонстрации API в качестве отправной точки, но я не могу понять, как зарегистрировать приемник Broadcast. Я пытаюсь зарегистрировать получателя программно, без изменений в манифесте.
public class DeviceConnectionService extends Service {
@Override
public void onCreate() {
Intent intent = new Intent(this, PingConnection.class);
intent.setAction("KEEP_CONNECTION_ALIVE");
PendingIntent sender = PendingIntent.getBroadcast(this,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// We want the alarm to go off 30 seconds from now.
long firstTime = SystemClock.elapsedRealtime();
firstTime += 15*1000;
// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime, 15*1000, sender);
// register to listen to the Alarm Manager
if (mPingConnectionReceiver == null) {
mPingConnectionReceiver = new PingConnection();
getApplicationContext().registerReceiver(mPingConnectionReceiver,
new IntentFilter("KEEP_CONNECTION_ALIVE"));
}
}
// ...
public class PingConnection extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (dBug) Log.i("PingConnection", "Pinging Controller");
// do real work here
}
}
}