Привязка и запуск службы при запуске приложения

У меня есть служба в Android, которая инкапсулирует фреймворк с методом start. Служба сводится к чему-то вроде этого, многие вещи опущены:

public class MyService extends Service {

    private IBinder thisBinder;

    public MyService(){
        thisBinder = new LocalBinder();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return thisBinder;
    }

    public void start(Map<String, Object> options)
    {
        getDriverManager().start(options);
    }
}

У меня также есть класс моста, который звонит в службу:

public class MyServiceBridge implements ServiceConnection {

    private boolean started = false;
    private boolean bound = false;
    private MyService myService;

    public MyServiceBridge(Context context){
        this.context = context;
    }

    public void bindService(){
        Intent intent = new Intent(getContext(), MyService.class);

        getContext().bindService(intent, this, getContext().BIND_AUTO_CREATE);
        getContext().startService(intent);
    }

    // Here's a sample call, and the one that is relevant
    public void start(Map<String, Object> options){
        setOptions(options);
        if(bound == true){
            getMyService().start(options);
        }
        else{
            started = true;
        }
    }
}

Я вызываю метод моста start, чтобы запустить службу. Это отлично работает, за исключением этой конкретной ситуации (пока). Класс MyApplication вызывает метод start моста для onCreate:

public class MyApplication extends Application {

    @Override
    public void onCreate() {

        super.onCreate();

        getServiceBridge().start(null);
    }
}

Это согласно документам "Вызывается, когда приложение запускается до того, как будут созданы какие-либо действия, службы или объекты-приемники (за исключением поставщиков контента).". Действительно, похоже, что это так, потому что служба не запускается, а вместо этого запускается, когда я закрываю приложение (по крайней мере, странно). Это работает, если я передам вызов методу onCreate действия, но это не идеально, потому что я также могу остановить службу, и я хочу, чтобы служба работала в течение всего времени существования приложения. То есть служба должна запускаться при запуске приложения и останавливаться при его завершении. Имеет ли это смысл? Есть ли другой способ сделать это?


person André Fratelli    schedule 22.06.2016    source источник
comment
onCreate вызывается метод или нет класса Application?   -  person ρяσѕρєя K    schedule 22.06.2016
comment
Да, метод вызывается! Однако этот ответ и ответ @vanste25 заставили меня понять, что это может быть как-то связано с тем, что служба все еще работает в фоновом режиме. Я говорю это потому, что этот метод не вызывается при втором запуске приложения.   -  person André Fratelli    schedule 22.06.2016


Ответы (1)


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

Вы проверили, работает ли ваше приложение в фоновом режиме? Пожалуйста, убедитесь, что вы убили свое приложение перед тестированием. Используйте Task Killer или что-то в этом роде, чтобы приложение всегда запускалось заново.

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

person vanste25    schedule 22.06.2016
comment
Я так понимаю, сервисы делают работают, если запущены там. Это исключает то, что я думал, что это было. Однако я действительно мог бы использовать метод, когда приложение (или служба) завершается. Это приложение немного чувствительно к очистке (оно использует внешние устройства, такие как маршрутизаторы). Теперь, когда я знаю, что службы могут быть запущены там, я дам ему еще немного времени для отладки. Спасибо! - person André Fratelli; 22.06.2016
comment
Пожалуйста. Следите за последовательным вызовом startService и bindService getContext().bindService(intent, this, getContext().BIND_AUTO_CREATE); получитьконтекст (). startService (намерение); Может быть, это ваша проблема. - person vanste25; 22.06.2016
comment
Действительно? Почему это? - person André Fratelli; 22.06.2016