2012-02-04 3 views
2

У меня есть служба, которая использует собственный класс 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 
     } 
    } 
} 

ответ

5

замедлит ли телефон вниз это процессор, когда он переходит в спящий режим?

Телефон выключает свой процессор, когда он идет спать. Это определение «сна».

Я думаю, что это AlarmManger, но у меня возникли проблемы с его работой с внутренним классом в Сервисе. Я попытался использовать демонстрации API в качестве отправной точки, но я не могу понять, как получить зарегистрированный ретранслятор. Я пытаюсь зарегистрировать приемник программно, без изменений в манифесте.

Это необычный подход для AlarmManager. Это, как говорится, так как вы отказались описывать «проблемы» в деталях, вам сложно помочь.

Избавьтесь от getApplicationContext() (вам это не нужно и в этом случае не нужно). Я зарегистрировал бы приемник до касания AlarmManager. Прежде чем перейти к производству, выберите имя действия, в котором есть имя вашего пакета (например, com.something.myapp.KEEP_CONNECTION_ALIVE).

Помимо этого, отметьте LogCat для получения предупреждений.


UPDATE

В вашем LogCat, вы должны иметь предупреждение от AlarmManager жалуется не в состоянии поговорить с BroadcastReceiver.

Заменить:

Intent intent = new Intent(this, PingConnection.class); 
intent.setAction("KEEP_CONNECTION_ALIVE"); 

с:

Intent intent = new Intent("KEEP_CONNECTION_ALIVE"); 

, и вы, возможно, повезет больше.

+0

Имея проблемы = не стрелять – tunneling

+0

@tunneling: см. Обновление для ответа. – CommonsWare

+0

вот и все. Вы можете объяснить? – tunneling

0

Вы не можете зарегистрировать AlarmManager в службе. Все, что вы можете сделать, это объявить его глобальным в Manifest.xml. Вы можете запустить будильник из службы таким образом, объявив его в Manifest.xml

Если у вас есть удаленный сервис, и вы закрываете активность запуска, AlarmManager все равно будет работать, но не забудьте его остановить on onDestroy() метод сервиса.

Я пытался зарегистрироваться только в Службе AlarmManager, поскольку я не использовал его для основной деятельности, но не имел успеха! Он не работает, как обычный BroadCastReceiver.

вот как вещи, вы должны объявить его в Manifest.xml как глобальное

0

Я знаю, что уже поздно, но, возможно, это полезно для кого-то другого.

Вы можете зарегистрировать его, проблема в том, что намерение пытается его называть.

Вместо того, чтобы называть его так:

Intent intent = new Intent(this, PingConnection.class); 

Создание пустого намерения и добавить действие, которое вы собираетесь слушать:

Intent intent = new Intent(); 
intent.setAction("value you want to register"); 

Затем создайте ожидающий намерение и отправить в эфир, как у тебя есть это.

Создать атрибут для приемника, так что вы можете получить доступ к нему во всем классе и разрегистрировать при необходимости (если pendingIntent также атрибут можно отменить в любое время):

private PingConnection pingConnection = new PingConnection(); 

Регистрация это следующим образом:

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction("the value you used before"); 
getApplicationContext().registerReceiver(pingConnection, filter); 

Теперь вы не получите никаких ошибок, и класс не является статичным, и это внутренний класс.

Смежные вопросы