2

В настоящее время я разрабатываю почтовую программу, которая опирается на фон 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.

ответ

3

я столкнулся с аналогичной проблемой некоторое время назад и использовал это в методе OnDestroy() моей службы:

public void onDestroy() { 
    Intent restartService = new Intent(getApplicationContext(),this.getClass()); 
    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(),1,restartService,PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.ELAPSED_REALTIME,5000,pendingIntent); 
    super.onDestroy(); 
} 

Когда услуга быть destoyed я установить сигнал на 5 секунд, который начнется мой сервис aagain. Таким образом, ваш сервис остановится, когда пользователь удалит его из последних, но он начнется снова.

+0

Исправить. '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

+0

Спасибо, nullvoid! Я буквально пробовал каждое решение, предоставляемое в Интернете, это решило мою проблему, когда приложение закрытого приложения не получает уведомлений. Почти 1 месяц борьбы! Спасибо, что поделились своим решением! – Lozy

+0

Счастлив, что это помогло. @Lozy Вы можете отметить это как ответ, если это сработало для вас. – nullvoid

 Смежные вопросы

  • Нет связанных вопросов^_^