Я хочу запустить метод 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, которая убивает неиспользуемые классы, потому что это фоновая служба, а не активность. Я понятия не имею.
Вы правы в том, что система убивает службу. У меня была такая же проблема с сервисом, связанным с виджетами. Я решил это, обновив его каждые 30 минут.
Итак, если вы планируете какое-то событие раз в то время, чтобы разбудить ваш сервис, он должен оставаться включенным.
Однако может быть лучшее решение.
Следующий код немедленно запустит диспетчер аварийных сообщений (запустит 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);
Также следующий код запустит диспетчер аварийных сигналов и запустит задачу каждые 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);
Кто-то знает разницу?
Посмотрите START_STICKY. Я не уверен, что это полностью выполнит трюк, но это может помочь сохранить ваше обслуживание.