У меня есть служба, которая использует собственный класс Connection (extends thread) для аппаратного контроллера. Когда пользователь предпочитает, я хочу поддерживать это соединение на постоянной основе. У меня уже есть код для обработки, когда устройство Android теряет подключение к Интернету, переключается между Wi-Fi и т. Д.Android долгое обслуживание с диспетчером аварийных сигналов и внутренним широковещательным приемником
Для того, чтобы оставаться на связи, контроллер требует, чтобы вы говорили с ним каждые 5 минут. В настоящее время я в классе Connection запускаю поток, который выполняется через некоторое время(), и проверяет системное время и последний раз, когда он обменивается данными, и когда> 4 минуты он запрашивает статус. По какой-то причине в разное время сообщение не происходит во времени. то есть через 5 минут. Служба не умирает, насколько я могу судить, но «Ping» к контроллеру опаздывает. Этого не происходит, когда у меня телефон подключен к зарядному устройству (или отладчику). Кроме того, поведение происходит одинаково, когда я перемещаю службу на передний план.
Замедляет ли телефон его процессор, когда он ложится спать?
Есть ли лучший способ?
Я думаю, что это AlarmManger, но у меня возникли проблемы с его работой с внутренним классом в Сервисе. Я попытался использовать демонстрации API в качестве отправной точки, но я не могу понять, как получить зарегистрированный ретранслятор. Я пытаюсь зарегистрировать приемник программно, без изменений в манифесте.
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
}
}
}
Имея проблемы = не стрелять – tunneling
@tunneling: см. Обновление для ответа. – CommonsWare
вот и все. Вы можете объяснить? – tunneling