Служба перезапущена после закрытия приложения - START_STICKY

У меня есть приложение, которое работает как веб-сервер. В приложении есть служба START_STICKY. Я хочу, чтобы эта служба постоянно запускала веб-сервер (пользователю предоставляется уведомление в уведомлении об остановке).

Проблема в том, что сервер перезагружается (теряет настройки и т. Д.), Когда мое приложение закрывается. Он остается там нормально, но logcat показывает, что он перезапускается.

Я могу снова открыть свое приложение и привязать к новому сервису, это работает отлично. Хотя повторное закрытие снова имеет тот же эффект.

Мне нужно это, чтобы НЕ перезагрузить.

Стандартный сервисный код

private WebServerService mService;
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder binder) {
        WebServerService.MyBinder b = (WebServerService.MyBinder) binder;
        mService = b.getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
    }
};

public serviceStart() {
    mIntent = new Intent(mContext.getApplicationContext(), WebServerService.class);
    mContext.startService(mIntent);
    mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
}

Сервис на старте

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, START_STICKY, startId);
    Log.d("SERVICE","Started");
    return START_STICKY;
}

4 ответа

Решение

Краткий ответ: вы не можете. Каждое приложение Android может быть убито системой или пользователем, когда система запрашивает память или пользователь удаляет приложение из списка недавних приложений. Это дизайн Android, и все приложения должны придерживаться его. Единственное (небольшое) улучшение, которое вы можете получить, - установить службу в качестве службы Foreground:

где система считает, что это что-то, о чем пользователь активно осведомлен, и, следовательно, не является кандидатом на убийство при нехватке памяти. (По-прежнему теоретически возможно, что служба будет убита из-за чрезмерного давления памяти со стороны текущего приложения переднего плана, но на практике это не должно вызывать беспокойства.)

Используйте startForeground()

Недостатком является то, что вам придется предоставить уведомление.

Как сказал Миммо: ты не можешь. Система действительно может убить приложения / сервисы, если мало памяти. Также пользователи могут сделать это. Либо с помощью кнопки принудительного закрытия в настройках приложения, либо смахивания приложения. Проведите, чтобы закрыть, как остановка силы. Приложение / служба НЕ ПЕРЕЗАПУСКАЕТСЯ при закрытии такого приложения. Так работает система. Попробуйте сами, скачайте заранее задачу убийцы и, например, убейте Facebook. Если вы через несколько секунд перезапустите средство предварительного запуска, вы увидите, что Facebook снова работает. Теперь откройте Facebook и используйте функцию смахивания, чтобы убить его. Теперь запустите убийцу задач снова. Вы увидите, что Facebook больше не работает. Опять же, так работает система. Настройка службы в качестве службы Foreground также не поможет.

Будет ли полезен тег android:process="anyname" в вашем манифесте? Это заставляет сервис работать в другом процессе вашего приложения.

http://developer.android.com/guide/topics/manifest/service-element.html

По назначению других он все еще может быть прерван системой, если не хватает памяти, но он не прекратит работу, закрыв ваше приложение. Надеюсь, поможет.

Другие вопросы по тегам