Сервис, который работает правильно в течение нескольких часов, чем не больше ответа - PullRequest
1 голос
/ 05 апреля 2011

Я хочу запустить метод CippaLippa () в классе GmailService при получении электронной почты в клиенте Gmail.

У меня есть приемник и сервис в AndroidManifest ...

    <receiver
        android:name="com.myapp.receiver.GmailReceiver">
        <intent-filter>
            <action
                android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

    <service
        android:name="com.myapp.service.GmailService"
        android:label="@string/app_name" />

и эти классы ...

public class GmailReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, final Intent intent) {


        final SharedPreferences preferences = context.getSharedPreferences("myapp.prefs", 0);

        context.startService(new Intent(context, GmailService.class));
    }
}


public class GmailService extends Service { .. etc...}

Мой вопрос: все работает правильно в течение нескольких часов, и когда я получаю уведомление от Gmail, метод CippaLippa () срабатывает ... затем, через несколько часов, когда я получаю уведомление Gmail, Метод CippaLippa () больше не срабатывает.

Может быть, есть способ заставить класс GmailService «остаться в живых» и продолжить мониторинг событий Gmail? Я думаю, что это не из-за ОС Android, которая убивает неиспользуемые классы, потому что это фоновый сервис, а не активность. Я понятия не имею.

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Следующий код немедленно запустит диспетчер сигналов тревоги (запустит PendingIntent) и будет запускать задачу каждые 60 секунд.

    Intent logReader = new Intent();
    logReader.setClassName("com.foo.Test", "com.foo.Test.MyServiceClass");
    logReaderPI = PendingIntent.getService(context, 0, logReader, 0);
    long firstTime = SystemClock.elapsedRealtime();
    AlarmManager aMgr =  (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    aMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 60 * 1000, logReaderPI);
0 голосов
/ 05 апреля 2011

Вы правы насчет системы, убивающей сервис. У меня была такая же проблема со службой, связанной с виджетом. Я решил это, обновляя каждые 30 минут или около того.

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

Хотя может быть и лучшее решение.

0 голосов
/ 05 апреля 2011

Посмотрите на START_STICKY . Я не уверен, что это полностью сработает, но это может помочь вам продолжить работу.

...