Долгосрочный сервис Android с диспетчером тревог и внутренним приемником вещания - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть Сервис, который использует пользовательский класс Соединения (расширяет поток) к аппаратному контроллеру. Когда Пользователь предпочитает, я хочу поддерживать это соединение на постоянной основе. У меня уже есть код для обработки, когда устройство 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
        }
    }
}

Ответы [ 3 ]

5 голосов
/ 04 февраля 2012

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

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

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

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

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

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


ОБНОВЛЕНИЕ

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

Заменить:

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

с:

Intent intent = new Intent("KEEP_CONNECTION_ALIVE");

и вам повезет больше.

0 голосов
/ 23 марта 2015

Я знаю, что уже поздно, но, может быть, это будет полезно для кого-то еще.

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

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

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

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

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

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

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

private PingConnection pingConnection = new PingConnection();

Зарегистрируйте его какthis:

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

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

0 голосов
/ 22 августа 2014

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

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

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

Вот как это происходит, вы должны объявить его в Manifest.xml как глобальный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...