Не удается запустить задачи в службе

Я знаю, что это основной вопрос, я новичок в службе Android. Я провел исследование в Google и StackOverflow. В stackoverflow есть много вопросов, связанных с моей темой или похожих на нее, но я не смог получить правильный ответ, и меня отвлекают на разные темы.

Это простой тестовый код, который я запускаю.

public class Service extends android.app.Service {

private Handler mHandler;

private void ping() {
    try {
        Log.e("Tag", "Success");
        Toast.makeText(getApplicationContext(), "Service Ping", Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        Log.e("Error", "In onStartCommand");
        e.printStackTrace();
    }
    scheduleNext();
}

private void scheduleNext() {
    mHandler.postDelayed(new Runnable() {
        public void run() { ping(); }
    }, 3000);
}

public int onStartCommand(Intent intent, int x, int y) {
    mHandler = new android.os.Handler();
    ping();
    return START_STICKY;
}

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

}

При этом всплывает всплывающее сообщение, а сообщение журнала печатается каждые 3 секунды. Оно работает, даже когда приложение свернуто. Но когда я полностью выхожу из приложения, тост или журнал не печатаются. В этом SO ANSWER ясно сказано, почему сообщение Toast не может быть вызвано без пользовательского интерфейса. И я не могу распечатать LOG, так как процесс убивается.

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


comment
Используйте AlarmManager (все версии Android) или JobScheduler (Android 5.0+).   -  person CommonsWare    schedule 29.03.2015
comment
@CommonsWare Alarm Manager работал   -  person Gaj    schedule 29.03.2015


Ответы (1)


Когда вы запускаете службу, по умолчанию она запускается в том же процессе, что и любой компонент, который ее запустил. Когда процесс, в котором запущен этот компонент, завершает работу, завершается и служба. Чтобы запустить Службу в собственном процессе, вам нужно сделать следующее в манифесте:

    <service
        android:name=".Service"
        android:enabled="true"
        android:exported="false"
        android:process=":separate_service_process"
        android:stopWithTask="false" >
    </service>

Помещение двоеточия перед меткой для атрибута android:process сообщает системе о необходимости запуска службы в отдельном процессе, а атрибут android:stopWithTask сообщает системе о необходимости поддерживать службу в рабочем состоянии, даже когда запустивший ее компонент останавливается. См. http://developer.android.com/guide/topics/manifest/service-element.html для получения дополнительной информации о настройках манифеста (атрибут stopWithTask является частью класса ServiceInfo).

Теперь запустите службу, используя startService(Intent), и все будет готово. Удачи!

PS. Я бы рекомендовал переименовать ваш класс службы во что-то уникальное, чтобы избежать путаницы с базовым классом службы.

person John Riehl    schedule 28.03.2015