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

1

Я хочу запустить метод 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, которая убивает неиспользуемые классы, потому что это фоновая служба, а не активность. Я понятия не имею.

Теги:
service
ondestroy

4 ответа

0
Лучший ответ

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

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

Однако может быть лучшее решение.

1

Следующий код немедленно запустит диспетчер аварийных сообщений (запустит 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

Также следующий код запустит диспетчер аварийных сигналов и запустит задачу каждые 60 секунд, , но я не знаю разницы между этим и кодом Advantej:

    Intent myIntent = new Intent(context, GmailService.class);

    pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.MINUTE, 1);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

Кто-то знает разницу?

0

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

  • 0
    Я читал в Интернете, что это делает свое дело, теоретически ... Но на практике я читал, что кто-то, используя этот способ, после того, как Android убил его сервис, убил, чтобы освободить память, сервис перезагрузился ... НО ПОСЛЕ 6 ЧАСОВ! !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню