Урок 94. Service. Подробно про onStartCommand

Обсуждение уроков
Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение BiK-14 » 16 сен 2016, 05:29

У меня другая проблема, сервис хоть и убивается, но поток живет и продолжает работать и в методе stop() все таки срабатывает stopSelfResult()=false, поэтому видимо сервис не оживает. Я в onStartCommand возвращаю START_REDELIVER_INTENT.

Kamin
Сообщения: 2
Зарегистрирован: 26 сен 2016, 18:11

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Kamin » 26 сен 2016, 18:36

Dimon4ir писал(а):
rezak90 писал(а):у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?
таже проблема (Could not identify launch activity: Default Activity not found
Error while Launching activity) в AndroidStudio, класс находится в правильном пакете, какие еще есть решения?
и кто знает как посмотреть запущенные сервисы на genimotion из под AndroidStudio?
В Android Studio идём в настройки запуска Run/Debug Configuration -> Android Application -> General -> Launch -> выбираем "Nothing".

vkiper
Сообщения: 1
Зарегистрирован: 03 ноя 2016, 14:13

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение vkiper » 03 ноя 2016, 14:17

2Kamin:
В Android Studio идём в настройки запуска Run/Debug Configuration -> Android Application -> General -> Launch -> выбираем "Nothing".
Спасибо за подсказку, тоже не мог разобраться, как запустить серис без активити.

Сергей Ситько
Сообщения: 1
Зарегистрирован: 17 мар 2017, 15:38

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Сергей Ситько » 17 мар 2017, 18:29

Так как документация кривенькая, уроки весьма полезны.

Вопрос автору следующий. Зачем создавали два процесса? В одном всё и так бы отработало, или это заготовка для следующих уроков...
Как ведет себя сервис при rorate screen также ни слова.

masterprog1
Сообщения: 2
Зарегистрирован: 18 мар 2017, 18:45

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение masterprog1 » 25 мар 2017, 17:54

У меня вот такая проблема

Манифест

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action
                    android:name="com.example.win7.serv94_1.MyService">
                </action>
            </intent-filter>
        </service>
    </application>

</manifest>
Сервис

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

package com.example.win7.serv94_1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import java.util.concurrent.TimeUnit;

public class MyService extends Service {

    final String LOG_TAG = "myLogs";

    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "MyService onCreate");
    }

    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "MyService onDestroy");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "MyService onStartCommand");
        readFlags(flags);
        MyRun mr = new MyRun(startId);
        new Thread(mr).start();
        return START_NOT_STICKY;
    }

    public IBinder onBind(Intent arg0) {
        return null;
    }

    void readFlags(int flags) {
        if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
            Log.d(LOG_TAG, "START_FLAG_REDELIVERY");
        if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
            Log.d(LOG_TAG, "START_FLAG_RETRY");
    }

    class MyRun implements Runnable {

        int startId;

        public MyRun(int startId) {
            this.startId = startId;
            Log.d(LOG_TAG, "MyRun#" + startId + " create");
        }

        public void run() {
            Log.d(LOG_TAG, "MyRun#" + startId + " start");
            try {
                TimeUnit.SECONDS.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stop();
        }

        void stop() {
            Log.d(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
                    + startId + ") = " + stopSelfResult(startId));
        }
    }
}
И вот такая ошибка. Android 2.3. По моему запустить чисто сервис без активити не возможно. Как видно на фото Default Activity not found. Или автор что-то не договаривает)
Вложения
Error runnning.png
Error runnning.png (33.47 КБ) 2911 просмотров

ivipizerg
Сообщения: 1
Зарегистрирован: 20 май 2018, 23:58

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение ivipizerg » 21 май 2018, 00:01

Не надеюсь на ответ, но я уже отчаялся в своих поисках =)) у меня проблема такая, на телефоне Asus ZerPhone Android 6.0.1 служба не перезапускаеться не смотря на то что onStartCommand возвращает START_STICKY. И что я только не пробовал, и стартовал службу в отдельном потоке, и вместо Service делал HandleService, и в службе имитировал какое либо действие( тупо цикл какой нить), и пробовал запускать новый поток из самой службы, и в манифесте всякие параметры прописывать, и подобие StartSelf делать(и напрямую наглым образом и через аларм менеджер подождав некоторое время) не стартует и все, хоть убейте. Убиваем приложение служба убивается и все, тишина.

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

////////////////////////////////////////////////////// ACTIVITY///////////////////////////////////////////
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

startService(new Intent(this, MyService.class));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}
////////////////////////////////////////////////////// ACTIVITY///////////////////////////////////////////
////////////////////////////////////////////////////// SERVICE///////////////////////////////////////////
public class MyService extends Service {
public MyService() {
}

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

public void onCreate() {
super.onCreate();
Log.i("SERVICE1","onCreate");
}

public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("SERVICE1","onStartCommand");

super.onStartCommand(intent, flags, startId);
return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
Log.i("SERVICE1","onTaskRemoved");
}

@Override
public void onDestroy() {
Log.i("SERVICE1","onDestroy");
super.onDestroy();
}
}
////////////////////////////////////////////////////// SERVICE///////////////////////////////////////////
////////////////////////////////////////////////////// MANIFEST///////////////////////////////////////////
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
////////////////////////////////////////////////////// MANIFEST///////////////////////////////////////////

geka3
Сообщения: 1
Зарегистрирован: 25 июл 2019, 15:47

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение geka3 » 25 июл 2019, 16:17

Уважаемые форумчане.
Нужна Ваша помощь.
Проблем при установке сервиса не было.
При попытке запустить сервис с отдельного приложение ничего не происходит, при этом не выскакивает никакой ошибки.
Команду "command to start service has done well." в логах получаю (вывод в лог сразу после startService(intent)),
а "MyService onCreate" не получаю.

Чтоб установить сервис в Run/Debug Configuration -> General -> Launch установил Nothing
Также прописал: intent.setPackage("com.example.p0942_servicekillserver");
Тестирую на реальном устройстве, Android 5.1

Подскажите, пожалуйста, в чем может быть проблема?
Заранее спасибо.

MainActivity:

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

package com.example.p0941_servicekillclient;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onClickStart(View v) {

           Intent intent = new Intent("com.example.p0942_servicekillserver.MyService");
           intent.putExtra("name", "value");
           intent.setPackage("com.example.p0942_servicekillserver");
           startService(intent);

           Log.i("myLogs"," command to start service has done well. ");

       }
}
Манифест приложения

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.p0941_servicekillclient">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
    </application>

</manifest>
MyService

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

package com.example.p0942_servicekillserver;

import java.util.concurrent.TimeUnit;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    final String LOG_TAG = "myLogs";

    public void onCreate() {
        super.onCreate();
        Log.i(LOG_TAG, "MyService onCreate");
    }

    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "MyService onDestroy");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(LOG_TAG, "MyService onStartCommand");
        readFlags(flags);
        MyRun mr = new MyRun(startId);
        new Thread(mr).start();
        return START_NOT_STICKY;
    }

    public IBinder onBind(Intent arg0) {
        return null;
    }

    void readFlags(int flags) {
        if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
            Log.i(LOG_TAG, "START_FLAG_REDELIVERY");
        if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
            Log.i(LOG_TAG, "START_FLAG_RETRY");
    }

    class MyRun implements Runnable {

        int startId;

        public MyRun(int startId) {
            this.startId = startId;
            Log.i(LOG_TAG, "MyRun#" + startId + " create");
        }

        public void run() {
            Log.i(LOG_TAG, "MyRun#" + startId + " start");
            try {
                TimeUnit.SECONDS.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stop();
        }

        void stop() {
            Log.i(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
                    + startId + ") = " + stopSelfResult(startId));
        }
    }
}
Манифест сервиса

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.p0942_servicekillserver.MyService"/>
            </intent-filter>
        </service>
    </application>

</manifest>

Alex_AndroDev_95
Сообщения: 1
Зарегистрирован: 06 авг 2019, 10:38

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Alex_AndroDev_95 » 06 авг 2019, 11:04

geka3 писал(а):
25 июл 2019, 16:17
Уважаемые форумчане.
Нужна Ваша помощь.
Проблем при установке сервиса не было.
При попытке запустить сервис с отдельного приложение ничего не происходит, при этом не выскакивает никакой ошибки.
Команду "command to start service has done well." в логах получаю (вывод в лог сразу после startService(intent)),
а "MyService onCreate" не получаю.

Чтоб установить сервис в Run/Debug Configuration -> General -> Launch установил Nothing
Также прописал: intent.setPackage("com.example.p0942_servicekillserver");
Тестирую на реальном устройстве, Android 5.1

Подскажите, пожалуйста, в чем может быть проблема?
Заранее спасибо.

MainActivity:

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

package com.example.p0941_servicekillclient;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onClickStart(View v) {

           Intent intent = new Intent("com.example.p0942_servicekillserver.MyService");
           intent.putExtra("name", "value");
           intent.setPackage("com.example.p0942_servicekillserver");
           startService(intent);

           Log.i("myLogs"," command to start service has done well. ");

       }
}
Манифест приложения

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.p0941_servicekillclient">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
    </application>

</manifest>
MyService

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

package com.example.p0942_servicekillserver;

import java.util.concurrent.TimeUnit;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    final String LOG_TAG = "myLogs";

    public void onCreate() {
        super.onCreate();
        Log.i(LOG_TAG, "MyService onCreate");
    }

    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "MyService onDestroy");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(LOG_TAG, "MyService onStartCommand");
        readFlags(flags);
        MyRun mr = new MyRun(startId);
        new Thread(mr).start();
        return START_NOT_STICKY;
    }

    public IBinder onBind(Intent arg0) {
        return null;
    }

    void readFlags(int flags) {
        if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
            Log.i(LOG_TAG, "START_FLAG_REDELIVERY");
        if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
            Log.i(LOG_TAG, "START_FLAG_RETRY");
    }

    class MyRun implements Runnable {

        int startId;

        public MyRun(int startId) {
            this.startId = startId;
            Log.i(LOG_TAG, "MyRun#" + startId + " create");
        }

        public void run() {
            Log.i(LOG_TAG, "MyRun#" + startId + " start");
            try {
                TimeUnit.SECONDS.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stop();
        }

        void stop() {
            Log.i(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
                    + startId + ") = " + stopSelfResult(startId));
        }
    }
}
Манифест сервиса

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.p0942_servicekillserver.MyService"/>
            </intent-filter>
        </service>
    </application>

</manifest>
В официальной документации написано, что начиная с Android 5.0 и выше для старта сервиса или его биндинга нужно использовать явные интенты. Запуск сервиса в другом приложении через неявный интент запрещено самой ОС. Сам очень долго возился с этим вопросом. Сейчас пробую сделать все в одном приложении. Надеюсь, что заработает.

Lastandlost
Сообщения: 1
Зарегистрирован: 30 авг 2019, 18:03

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Lastandlost » 30 авг 2019, 18:08

Доброго времени суток

Подскажите пожалуйста где в Android studio можно найти функцию "Stop Process" (или его аналог) для остановки запущенного процесса (сервиса)?

Ответить