В настоящее время я разрабатываю почтовую программу, которая опирается на фон service
, чтобы иметь возможность автоматически получать новые электронные письма. Это отлично работает, когда приложение открыто (или в запущенном списке приложений), но как только я закрою приложение/удалю его из списка последних приложений, service
также остановлен. Это можно подтвердить, перейдя в «Настройки разработчика» на устройстве и увидев, что для моего приложения нет процессов или служб.Служба перезапуска Android правильно после закрытия приложения
Я прочитал бесчисленные потоки в StackOverflow, но ни один из них, похоже, не делает трюк. Иногда вызывается onTaskRemoved
(), и служба перезапускается, но иногда в других случаях она не вызывается вообще или она вызывается, журналы показывают, что ОС запланировала перезапуск service
, но затем service
получает forced closed
ОС, тогда как Мне всегда нужно, чтобы эта служба работала для получения новых писем.
Мой текущий код можно увидеть ниже:
Моя_служба:
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.i(TAG, "onStartCommand()");
...
Log.d(TAG, "SERVICE IS RUNNING");
if (host != null) {
Log.d(TAG, "STARTING PUSH SERVICE");
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d(TAG, "BR: " + ((BugReporting) getApplication()));
sharedRunnable = ((BugReporting) getApplication()).getSharedRunnable();
MailPush mailPush = new MailPush(getApplicationContext(), sharedRunnable);
Log.d(TAG, "sharedRunnable 1: " + sharedRunnable);
mailPush.checkInboxEmail(host, email, password);
//mailPush.checkSentEmail(host, email, password);
}
};
handler.postDelayed(runnable, 5000);//0.5 seconds
}
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate()");
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
Log.i(TAG, "onTaskRemoved()");
PendingIntent service = PendingIntent.getService(
getApplicationContext(),
1001,
new Intent(getApplicationContext(), MyService.class),
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy()");
startService(new Intent(this, MyService.class));
}
Reboot Приемник:
public class AutoStart extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, MyService.class));
}
}
Manifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver
android:name="uk.co.tundracorestudios.securemail.notification.AutoStart"
android:enabled="true"
android:exported="true"
android:process=":remote">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="uk.co.tundracorestudios.securemail.notification.MyService"
android:enabled="true"
android:exported="true"
android:label="@string/mail_service"
android:stopWithTask="false"/>
Я сделал попытку бежать MyService
как другой process
но затем ограничить меня от получения sharedRunnable
, что я сохраненный в классе приложения, которые в противном случае могут быть доступ через:
updateListRunnable = ((BugReporting) getApplication()).getSharedRunnable();
Поэтому я спрашивая, как я могу гарантировать, что мой service
постоянно работает/работает, даже когда приложение закрыто или когда устройство rebooted
, все еще имеющее доступ к компонентам, расположенным в getApplication()
?
Как когда я попытался запустить MyService
как отдельный process
, выше updateListRunnable
будет всегда возвращать нуль тогда, когда приложение и service
были запущены в том же process
, она возвращает правильное runnable
.
Исправить. 'onTaskRemoved' не является частью методов жизненного цикла служб: https://developer.android.com/guide/components/services.html#Lifecycle Описание' onTaskRemoved' здесь https://developer.android.com/reference /android/app/Service.html#onTaskRemoved(android.content.Intent) – Ryan
Спасибо, nullvoid! Я буквально пробовал каждое решение, предоставляемое в Интернете, это решило мою проблему, когда приложение закрытого приложения не получает уведомлений. Почти 1 месяц борьбы! Спасибо, что поделились своим решением! – Lozy
Счастлив, что это помогло. @Lozy Вы можете отметить это как ответ, если это сработало для вас. – nullvoid