Урок 92. Service. Простой пример

Обсуждение уроков
G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

Re: Урок 92. Service. Простой пример

Сообщение G_O_R » 30 ноя 2014, 21:15

и еще в настройках поставлена по всем источникам и в эмуляторе при входе в браузер работает, то есть интернет есть.

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

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 30 ноя 2014, 23:28

Вы учитесь читать то что пишется в логах
java.lang.IllegalArgumentException: provider doesn't exist: network
Тут говорится что Network провайдера не существует на том устройстве, на котором вы его запускаете. Т.е. нету скорее всего модуля для сим карты на устройстве. возможно вы используете планшет в эмуляторе.

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

Re: Урок 92. Service. Простой пример

Сообщение G_O_R » 01 дек 2014, 11:02

Mikhail_dev писал(а):Вы учитесь читать то что пишется в логах
java.lang.IllegalArgumentException: provider doesn't exist: network
Тут говорится что Network провайдера не существует на том устройстве, на котором вы его запускаете. Т.е. нету скорее всего модуля для сим карты на устройстве. возможно вы используете планшет в эмуляторе.
Но тогда значит и смс и звонок не должно идти? но идут. я поменял виртуальный девайс на другие, все равно так же. Спасибо большое за помощь ))))

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

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 01 дек 2014, 14:31

Ну значит так настроен эмулятор. Ошибка однозначная - нет модуля network.

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 92. Service. Простой пример

Сообщение GRAF_COLLIOSTRO » 03 фев 2015, 14:49

так и не понял про кнопку STOP. Юзаю финальный код урока после всех изменений.
А мы сервис походу не убиваем стопом???

пример:
Без длительных пауз жму START-STOP-START-STOP
и вот логи:
02-03 11:45:41.881: D/myLogs(1383): onCreate
02-03 11:45:41.881: D/myLogs(1383): onStartCommand
02-03 11:45:41.881: D/myLogs(1383): i = 1
02-03 11:45:42.413: D/myLogs(1383): onDestroy
02-03 11:45:42.881: D/myLogs(1383): i = 2
02-03 11:45:42.913: D/myLogs(1383): onCreate
02-03 11:45:42.913: D/myLogs(1383): onStartCommand
02-03 11:45:42.913: D/myLogs(1383): i = 1
02-03 11:45:43.349: D/myLogs(1383): onDestroy
02-03 11:45:43.885: D/myLogs(1383): i = 3
02-03 11:45:43.913: D/myLogs(1383): i = 2
02-03 11:45:44.885: D/myLogs(1383): i = 4
02-03 11:45:44.913: D/myLogs(1383): i = 3
02-03 11:45:45.885: D/myLogs(1383): i = 5
02-03 11:45:45.917: D/myLogs(1383): i = 4
02-03 11:45:46.917: D/myLogs(1383): i = 5

как это понимать??? оно дальше себе работает... причём в двух экземплярах 0_о

заметьте, в 11:45:43 было второе нажатие на кнопку стоп - destroy... а в 11:45:46 продолжают идти логи причём ещё с первого старта сервиса

увеличил цикл до 1000 - всё продолжает работать как ни в чём не бывало... причём логи все двойные(((

если дальше тыкать старт-стоп то количество логов соответсвенно увеличивается

Snow DEV
Сообщения: 1
Зарегистрирован: 22 апр 2015, 12:36

Re: Урок 92. Service. Простой пример

Сообщение Snow DEV » 22 апр 2015, 12:48

GRAF_COLLIOSTRO писал(а):так и не понял про кнопку STOP. Юзаю финальный код урока после всех изменений.
А мы сервис походу не убиваем стопом???

пример:
Без длительных пауз жму START-STOP-START-STOP
и вот логи:
02-03 11:45:41.881: D/myLogs(1383): onCreate
02-03 11:45:41.881: D/myLogs(1383): onStartCommand
02-03 11:45:41.881: D/myLogs(1383): i = 1
02-03 11:45:42.413: D/myLogs(1383): onDestroy
02-03 11:45:42.881: D/myLogs(1383): i = 2
02-03 11:45:42.913: D/myLogs(1383): onCreate
02-03 11:45:42.913: D/myLogs(1383): onStartCommand
02-03 11:45:42.913: D/myLogs(1383): i = 1
02-03 11:45:43.349: D/myLogs(1383): onDestroy
02-03 11:45:43.885: D/myLogs(1383): i = 3
02-03 11:45:43.913: D/myLogs(1383): i = 2
02-03 11:45:44.885: D/myLogs(1383): i = 4
02-03 11:45:44.913: D/myLogs(1383): i = 3
02-03 11:45:45.885: D/myLogs(1383): i = 5
02-03 11:45:45.917: D/myLogs(1383): i = 4
02-03 11:45:46.917: D/myLogs(1383): i = 5

как это понимать??? оно дальше себе работает... причём в двух экземплярах 0_о

заметьте, в 11:45:43 было второе нажатие на кнопку стоп - destroy... а в 11:45:46 продолжают идти логи причём ещё с первого старта сервиса

увеличил цикл до 1000 - всё продолжает работать как ни в чём не бывало... причём логи все двойные(((

если дальше тыкать старт-стоп то количество логов соответсвенно увеличивается
Вполне нормальное явление для ведроида, если вспомнить, что это unix-подобная система.
Суть в том, что цикл запускается каждый раз в отдельном от главного потока службы, и тихо себе там выполняется.
Когда срабатывает onDestroy - убивается поток сервиса, но не тот, в котором выполняется цикл.
Тот, что с циклом, попросту теряется своего родителя и становится так называемым "зомби".
То, что он запускается по нескольку раз - так же нормально: сервисные потоки создаются несколько раз, создают отдельные потоки, и честно выпиливаются, оставляя после себя армию зомби, которая упорно пишет в лог что им и было предписано.

Как из вариантов охоты на зомби - сразу же в начале цикла написать проверку на некий флаг, который будет принудительно вышибать работающий цикл на проверке. А флаг поднимать в методе onDestroy.

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

lenny1000
Сообщения: 3
Зарегистрирован: 16 окт 2015, 12:40

Re: Урок 92. Service. Простой пример

Сообщение lenny1000 » 14 ноя 2015, 18:36

Кто-нибудь может пожалуйста внятно объяснить, зачем у сервиса в манифесте атрибут <enabled>???
Согласно хелпу: Whether or not the service can be instantiated by the system — "true" if it can be, and "false" if not. The default value is "true".

То есть если true, то он может создаваться системой, а если false то нет?? Так а зачем вообще передавать false. Если его нельзя инстанциировать, значит им пользоваться как бы нельзя. Я не прав?
Просто у меня слово instantiated ассоциируется с java, где нельзя инстанциировать абстрактные классы, но в этом то есть смысл. А здесь это зачем??

postflow
Сообщения: 11
Зарегистрирован: 25 ноя 2015, 11:41

Re: Урок 92. Service. Простой пример

Сообщение postflow » 25 ноя 2015, 16:49

hotdog75rus писал(а):Печально, вопрос решить так и не получается.
Скажите, Вы смогли найти решение вашей задачи? Как?

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 92. Service. Простой пример

Сообщение Sky-VIN » 08 дек 2015, 01:39

Добрый день.
Объясните, пожалуйста, такой нюанс:

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

    @Override
    public void onDestroy() {
        Toast.makeText(getApplicationContext(), R.string.ServiceStopped, Toast.LENGTH_SHORT).show();
        Log.d("VKI", "Service STOPPED");
        super.onDestroy();
        System.exit(0);
    }
Если прописать "System.exit(0);" - сервис благополучно убирается из Android Device Monitor, но Toast не срабатывает (куда бы я его не воткнул)
Если писать без "System.exit(0);" - сервис остается висеть, но Toast показывается как положено.
В обеих случаях "Log.d" работает!
Завтра будет.
Лучше.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 01 мар 2016, 16:55

Привет. Уже не один день ломаю голову над работай сервиса и никак не сдвинусь с места. Решил спросить здесь. Хотя терзают меня сомнения что мне вообще здесь кто-нибудь ответит. Я уже задавал вопросы на форуме, но ответов тут нет, ну попробую спросить.
Есть сервис, который при запуске в лог в течении 10 мин. каждую минуту должен писать сообщение ну или пока я не остановлю его самостоятельно. Код привожу ниже:

MainActivity.java. Имеет две кнопки для запуска и остановки сервиса

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

package ua.ilexus.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickStart(View v) {
        startService(new Intent(this, MyService.class));
    }

    public void onClickStop(View v) {
        stopService(new Intent(this, MyService.class));
    }
}
MyService.java. Сервис, в файл Service.log на карту памяти пишут нам информацию про его работу. Основная задача сервиса писать каждую минуту в лог информацию.

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

package ua.ilexus.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        RecLog("onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        RecLog("onStartCommand");
        MyThread();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        RecLog("onDestroy");
    }

    private void MyThread() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    for (int i = 1; i<=10; i++) {
                        RecLog("i = " + i);
                        TimeUnit.MINUTES.sleep(1);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                stopSelf();
            }
        }).start();
    }

    private void RecLog(String message)
    {
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            return;
        }

        String fileDir = Environment.getExternalStorageDirectory().getAbsolutePath();

        File sdFile = new File(fileDir, "Service.log");
        try {
            BufferedWriter bw;
            bw = new BufferedWriter(new FileWriter(sdFile, true));
            bw.write(message);
            Calendar calendar = Calendar.getInstance(java.util.TimeZone.getDefault());
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
            bw.write(" (" + simpleDateFormat.format(calendar.getTime()) + ")");
            bw.write('\n');
            bw.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
AndroidManifest.xml

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ua.ilexus.myapplication">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="false">
        </service>
    </application>

</manifest>
Запускаю приложение, нажимаю кнопку запуска сервиса выхожу с приложения и жду 10 мин. Через 10 мин. захожу в приложения и нажимаю кнопку остановки сервиса.
Смотрим лог:

onCreate (15:36:13)
onStartCommand (15:36:13)
i = 1 (15:36:14)
i = 2 (15:37:14)
onCreate (15:37:20)
onStartCommand (15:37:20)
i = 1 (15:37:20)
i = 2 (15:42:01)
i = 3 (15:46:50)
onDestroy (15:47:38)

По логу видно что сервис стартанул два раза, почему не понятно. Можно предположить что после выхода с приложения кнопкой назад сервис перезапустился, но почему через минуту? Ведь я запустил сервис и затем нажал кнопку назад и тем самым вышел с приложения. Но этот вопрос мне менее интересен. А вот почему далее по прошествии 10 мин. сервис записал только три строчки да и с периодичностью какойто рандом?
Что с кодом не так? Почему лог не пишется каждую минуту? Подскажите плиз. Я уже весь инет перешурстил, ничего не могу понять, почему так происходит, ведь в коде прописанно что каждую минуту писать в лог инфу.

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 92. Service. Простой пример

Сообщение Sky-VIN » 01 мар 2016, 17:57

Попробуйте использовать Timer или AlarmManager, вместо Thread.
Завтра будет.
Лучше.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 01 мар 2016, 18:10

Классы Timer и TimerTask пробовал, тоже самое.
Пробовал вместо TimeUnit.MINUTES.sleep писать Thread.sleep() и метод join(). Не помогает. AlarmManager не пробовал.
Что-то мне подсказывает что где-то в другом собака зарыта. Получается что когда смарт в ждущем режиме тогда происходит какой-то неправильный отчет времени. Сейчас попробую держать постоянно смарт во включенном состоянии для эксперимента.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 01 мар 2016, 19:39

Провел эксперимент.
- Открыл приложение, запустил службу, не выходя из приложения не давал телефону перейти в ждущий режим. Вот лог:
  • onCreate (17:50:40)
    onStartCommand (17:50:40)
    i = 1 (17:50:40)
    i = 2 (17:51:40)
    i = 3 (17:52:40)
    i = 4 (17:53:40)
    i = 5 (17:54:40)
    i = 6 (17:55:40)
    i = 7 (17:56:40)
    i = 8 (17:57:40)
    i = 9 (17:58:40)
    i = 10 (17:59:40)
    onDestroy (18:00:40)
Все отработало как и надо.

- Открыл приложение, запустил службу, вышел из приложения и не давал телефону перейти в ждущий режим. Вот лог:
  • onCreate (18:12:08)
    onStartCommand (18:12:08)
    i = 1 (18:12:09)
    onCreate (18:12:27)
    onStartCommand (18:12:27)
    i = 1 (18:12:27)
    i = 2 (18:13:27)
    i = 3 (18:14:27)
    i = 4 (18:15:27)
    i = 5 (18:16:27)
    i = 6 (18:17:27)
    i = 7 (18:18:27)
    i = 8 (18:19:27)
    i = 9 (18:20:27)
    i = 10 (18:21:27)
    onDestroy (18:22:27)
Видно что после выхода с приложения система прибила сервис, но сервис запустился снова и отработал все как нужною.
Получается что когда телефон в ждущем режиме что-то происходит не так. Сервис как будто на какое-то время засыпает (это время почему-то разное) а когда просыпается пишет мне в лог инфу. Может это связанно с тем что я разблокирую телефон и сервис тоже просыпается. Когда блокируется и сервис приостанавливается. Но мне так не нужно, мне нужно что-бы сервис работал. Как это исправить? Может что-то нужно в манифесте прописать? Тестирую на Андроиде 5.1.1. Разные сервисы скачанные с плеймаркета на этом телефоне работают. А вот моя програмулина не хочет.

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 92. Service. Простой пример

Сообщение Sky-VIN » 01 мар 2016, 20:02

LexusAVG писал(а): Видно что после выхода с приложения система прибила сервис, но сервис запустился снова и отработал все как нужною.
Система может убить сервис, если ей будет не хватать памяти. Но в наших силах сделать так, чтобы наш сервис ожил, когда проблема с памятью будет устранена. И более того, не просто ожил, а еще и снова начал выполнять незавершенные вызовы startService.

Т.е. мы вызываем startService, срабатывает onStartCommand и возвращает одну из следующих констант:

START_NOT_STICKY – сервис не будет перезапущен после того, как был убит системой

START_STICKY – сервис будет перезапущен после того, как был убит системой

START_REDELIVER_INTENT – сервис будет перезапущен после того, как был убит системой. Кроме этого, сервис снова получит все вызовы startService, которые не были завершены методом stopSelf(startId).
Это написано в уроке 94.
Завтра будет.
Лучше.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 01 мар 2016, 20:19

Согласен что система может убить сервис. Но он не убивается а приостанавливается (замораживается). Ведь я его могу остановить, по логу первому видно что сервис был остановлен мной через 10мин. и за это время в лог записано только три строки цикла а должно 10 строк. Если бы система убила бы сервис, то строки "onDestroy (15:47:38)" я бы не увидел. Да и интервал ожидания, если и предположить что система убьет сервис, все равно должен быть минута, а в логе далеко не минута. Первое ожидание 4мин. 41сек., второе 4мин. 49сек., а третье так и не дождался, я остановил сервис.
  • onCreate (15:37:20)
    onStartCommand (15:37:20)
    i = 1 (15:37:20)
    i = 2 (15:42:01)
    i = 3 (15:46:50)
    onDestroy (15:47:38)

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 02 мар 2016, 09:06

Sky-VIN, спасибо за помощь. Я и правда не ожидал что тут на форуме кто-то есть, какой-то он не живой этот форум.
Теперь по делу, вчера копался в просторах инета и набрел на код программы в которой сервисы, он там не один, должны работать в фоне. Первым делом рассматривал манифест и набрел на разрешение <uses-permission android:name="android.permission.WAKE_LOCK"/>. Это разрешение позволяет управлять питанием. Подумал, зачем этой программе управлять питанием и решил разобраться. В общем погуглил, нашел нужную инфу и применил в своем примере. И вот чудо, теперь все работает.

В манифесте прописал разрешение
<uses-permission android:name="android.permission.WAKE_LOCK"/>

В модуле MyService.java в методе onStartCommand дописал

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

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK");
if (wakeLock != null)
    wakeLock.acquire();
В методе onDestroy дописал

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

if (wakeLock != null) {
    wakeLock.release();
    wakeLock = null;
}
Осталось еще одна непонятная для меня реализация. Почему сервис перезапускается при выходе из приложения?

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 92. Service. Простой пример

Сообщение Sky-VIN » 02 мар 2016, 17:04

LexusAVG писал(а):И вот чудо, теперь все работает.
Покажите лог сервиса.
LexusAVG писал(а):Осталось еще одна непонятная для меня реализация. Почему сервис перезапускается при выходе из приложения?
Вероятнее всего это нюансы Android 5.1.1. Тем более система не использует onDestroy. Сами проверьте. При запущеном сервисе, в Диспетчере приложений, убейте свой сервис и посмотрите в лог.

Я же на своем HTC One X+ под Android 4.1.2, такого не замечал. У меня сервис убивается только если система загружена.

Вот мой лог:

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

[02/03/2016, 13:39:02]: Service created
[02/03/2016, 13:39:02]: Service started
[02/03/2016, 13:39:02]: Online
[02/03/2016, 13:44:08]: Online
[02/03/2016, 13:49:02]: Online
[02/03/2016, 13:54:25]: Online
[02/03/2016, 13:59:25]: Online
[02/03/2016, 14:04:25]: Online
[02/03/2016, 14:09:25]: Online
[02/03/2016, 14:14:25]: Online
[02/03/2016, 14:19:25]: Online
[02/03/2016, 14:24:25]: Online
[02/03/2016, 14:29:21]: Online
[02/03/2016, 14:34:19]: Online
[02/03/2016, 14:39:16]: Online
[02/03/2016, 14:44:03]: No Internet connection!
[02/03/2016, 14:49:12]: No Internet connection!
[02/03/2016, 14:54:11]: No Internet connection!
[02/03/2016, 14:59:08]: No Internet connection!
[02/03/2016, 15:04:05]: No Internet connection!
[02/03/2016, 15:09:04]: Online
[02/03/2016, 15:11:51]: Service created
[02/03/2016, 15:11:51]: Service started
[02/03/2016, 15:12:16]: Online
[02/03/2016, 15:17:38]: Online
[02/03/2016, 15:22:19]: Online
...
и так далее...
Завтра будет.
Лучше.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 02 мар 2016, 17:31

Sky-VIN писал(а):
LexusAVG писал(а):И вот чудо, теперь все работает.
Покажите лог сервиса.
Сорри, я уже код чуть изменил, а лог удалил, так как описанными выше действиями таймер работает как нужно. Сейчас пробую понять почему сервис так рестартует, и это не связанно с тем что я выхожу с приложения. Хотя может так и должно быть, но меня терзают смутные сомнения.

По настройкам сервис должен в 20:00 что-то выполнить. С помощью TimeUnit.MILLISECONDS.sleep делаю ожидание. В общем запустил сервис в 15:16, вышел с приложения, и в диспечере приложений (так для понимания) тоже выгружаю приложение. В логах вижу вот что:
  • StartCommand startId=1 (15:16:33)
    StartCommand startId=2 (15:20:29)
    StartCommand startId=4 (15:20:56)
    StartCommand startId=5 (15:51:38)
Я сервис запустил командой startService один раз. В лог в методе StartCommand вывожу инфу о счетчике вызовов startService "startId".
Почему сервис уже за это время вызвался 4 раза? Да и где подевался startId=3? Хотя startId=3 мне не сильно интересен.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Урок 92. Service. Простой пример

Сообщение LexusAVG » 03 мар 2016, 10:10

В общем почитал уроки по сервисам еще раз. Если я сам несколько раз запускаю сервис в логах должно быть:
  • onCreate
    onStartCommand startId=1
    onStartCommand startId=2
    onStartCommand startId=3
    onStartCommand startId=4
Один раз создался сервис, а следующие разы, т.к. сервис уже создан, обрабатывается только onStartCommand с увеличением счетчиков вызовов startId на единицу.


В примере описанном выше я запускаю сервис один раз, а в логах вижу такое:
  • onCreate
    onStartCommand startId=1
    onCreate
    onStartCommand startId=2
    onCreate
    onStartCommand startId=4
    onCreate
    onStartCommand startId=5
По логам видно что каждый раз сервис создается снова. Хорошо, предположим что Андроид убивает сервис, ну сервис создается снова и снова. А почему тогда startId увеличивается на единицу? Ведь я его не запускаю самостоятельно, сервис сам восстанавливается. Таким образом работает сервис если в методе onStartCommand вернуть return super.onStartCommand(intent, flags, startId) или return START_STICKY. А вот если вернуть return START_REDELIVER_INTENT тогда startId всегда равен 1, но вот в "Настройки-Приложения-Работают" данный сервис часто висит с состоянием "Перезапуск".

Rolik
Сообщения: 14
Зарегистрирован: 05 апр 2021, 06:42

Re: Урок 92. Service. Простой пример

Сообщение Rolik » 11 сен 2021, 09:33

Для вывода результатов сортировки цикла в фоновом потоке, не в Log а в Toast, нужно использовать Handler:

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

void someTask() {
    handler.post(new Runnable() {
    public void run() {
    for (int i = 1; i < 10; i++) {
    Toast.makeText(getApplicationContext(), "i = " + i, Toast.LENGTH_SHORT).show();
    try {
    TimeUnit.SECONDS.sleep(1);
    } 
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    stopSelf();
    }
    });
    }
    

Ответить