Урок 100. Service. IntentService. Foreground. Автозагрузка сервиса

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 100. Service. IntentService. Foreground. Автозагрузка сервиса

Сообщение damager82 » 29 июл 2012, 23:00

В этом уроке:
- изучаем IntentService
- включаем режим Foreground для сервиса
- помещаем сервис в автозагрузку


Click here to read this article!
Последний раз редактировалось damager82 22 май 2017, 23:49, всего редактировалось 7 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 08 сен 2012, 09:28

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

Аватара пользователя
Bersh
Сообщения: 20
Зарегистрирован: 30 сен 2012, 17:17

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Bersh » 30 сен 2012, 17:25

ИМХО немного спутаны понятия потока и процесса.
Написанно:
Принцип работы этого вида сервиса прост. Он создает новый поток для своей работы. Затем берет все Intent пришедшие ему в onStartCommand и отправляет их на обработку в этот поток.
Здесь необходим конструктор, в котором вызываем конструктор супер-класса и указываем какое-нить имя. Оно будет использовано для наименования потока
Хотя здесь написано правильно:
И далее они поочередно обрабатываются в отдельном процессе методом onHandleIntent
В первых двух случаях поток следует заменить на процесс

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение AndreyI » 30 сен 2012, 18:20

Речь во всех трех случаях идет о потоках.
Дополнительно о IntentService можно почитать в официальном руководстве
http://developer.android.com/guide/comp ... entService

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Mikhail_dev » 30 сен 2012, 18:25

ИМХО, в конце надо убрать на поток.
Сервис создается именно в отдельном потоке, если явно не указать ему что бы создавался в отдельном процессе.

Опоздал немного с ответом =)

Аватара пользователя
Bersh
Сообщения: 20
Зарегистрирован: 30 сен 2012, 17:17

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Bersh » 30 сен 2012, 21:32

Спасибо за исправление. Действительно в доках написано
launch a worker thread
значит везде должен быть поток

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение damager82 » 02 окт 2012, 10:32

Спасибо! Ща пофиксю
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 14:29

поясните, я не понял, где создавать бродкаст для автозагрузки? В теле кода сервиса или в отдельном файле где-то?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 03 окт 2012, 14:37

powercat
Необходимо создавать отдельный ресивер и в манифесте прописывать его запуск при загрузке устройства.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 14:59

Вот так?

Код: Выделить всё

public class broadcastReceiver extends BroadcastReceiver {

	public void onReceive(Context arg0, Intent arg1) {
		Log.d("myLogs","onReceive " + arg1.getAction());
		arg0.startService(new Intent(arg0,MyService.class));
	}

}
Сервис не запускается ((

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 15:10

и еще вопрос...сервис запуститься с теми данными, что были в момент перезагрузки телефона? Т.е. у меня там работал таймер, выполнялись операции...что с этим случится?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 03 окт 2012, 15:19

А в манифесте прописал событие при котором срабатывает ресивер?
Для старта при загрузке:

Код: Выделить всё

<intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
Перед пререзагрузкой устройства:

Код: Выделить всё

<intent-filter>
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
По поводу второго вопроса, если ты не сохранил данные сервиса перед выключением устройства, то ты потерял данные, так как при выключении устройства все процессы сервисов просто киляются без вызова у них onDestroy.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 15:25

Вот код ресивера (пробовал для сервиса и для активити)

Код: Выделить всё

public class broadcastReceiver extends BroadcastReceiver {

	public void onReceive(Context arg0, Intent arg1) {
		Log.d("myLogs","onReceive " + arg1.getAction());
//		arg0.startService(new Intent(arg0,MyService.class));
		
		Intent ativivtyIntent = new Intent(arg0, Activity_Main.class);  
        ativivtyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        arg0.startActivity(ativivtyIntent);
		
	}

}
В обоих случаях - форс клос
Вот манифест

Код: Выделить всё

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:enabled="true" android:name=".BootReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter >
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
            </intent-filter>
        </receiver>

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 15:32

косяк запуска нашел - не то имя в манифесте )

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 15:33

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

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 03 окт 2012, 15:46

Я лично сделал отдельный ресивер на событие отключения и в нем вызываю остановку сервиса. А вся процедура сохранения у меня в onDestroy сервиса. Загрузка данных в onCreate.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение powercat » 03 окт 2012, 16:16

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

Василь
Сообщения: 4
Зарегистрирован: 06 авг 2012, 23:29

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Василь » 02 ноя 2012, 13:52

Если надо создать напоминание
То что лучше использовать Service с потоком?
Я что-то читал об ManagerAlarm кто-то знает ?

BlkDem
Сообщения: 2
Зарегистрирован: 08 ноя 2012, 06:22

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение BlkDem » 08 ноя 2012, 06:26

Поясните, плз.
Где именно и как должен вызываться метод startForeground?
(тема не раскрыта полностью в уроке)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение damager82 » 09 ноя 2012, 11:42

BlkDem писал(а):Поясните, плз.
Где именно и как должен вызываться метод startForeground?
(тема не раскрыта полностью в уроке)
Вызываться должен в сервисе.
А вот насчет "как" - непонятно что вы имеете ввиду. Если речь о параметрах метода, то смотрите Урок 99 про уведомления.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить