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

Обсуждение уроков
Аватара пользователя
Danil
Сообщения: 4
Зарегистрирован: 01 авг 2013, 14:54

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

Сообщение Danil » 01 авг 2013, 14:59

START_STICKY_COMPATIBILITY
Исправило ситуацию, было бы здорово отметить это в уроке :)

evgenius_b
Сообщения: 10
Зарегистрирован: 23 авг 2013, 13:26

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

Сообщение evgenius_b » 30 авг 2013, 11:30

Всем доброго.
Опять акула глухая попалась.
Делаю уроки один в один, не стартует в devices сервис ru.startandroid.develop.p0942servicekillserver.MyService.

Тоже проблемы с файлом манифеста:
На строчке <service android:name="MyService"> показан желтый треугольник с воскл.знаком

Exported service does not require permission

Как поправить?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 30 авг 2013, 14:13

Если ты вначале хочешь сам разобраться с предупреждением или ошибкой, то нажми на этой строке ctrl+1, эклипс предложит тебе вероятные варианты решения этой проблемы. Может быть один из них подойдет.
Данное сообщение переводится как "экспортированный сервис не требует разрешений", я точно не знаю что это, но, возможно, эклипс предложит просто удалить эту строку из манифеста..
Если тебе все же необходимо прописать данное разрешение в манифесте, то попробуй добавить в наименования сервиса
<service android:name=".MyService"
android:exported="false">
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

evgenius_b
Сообщения: 10
Зарегистрирован: 23 авг 2013, 13:26

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

Сообщение evgenius_b » 02 сен 2013, 10:33

Foenix писал(а):Если ты вначале хочешь сам разобраться с предупреждением или ошибкой, то нажми на этой строке ctrl+1, эклипс предложит тебе вероятные варианты решения этой проблемы. Может быть один из них подойдет.
Данное сообщение переводится как "экспортированный сервис не требует разрешений", я точно не знаю что это, но, возможно, эклипс предложит просто удалить эту строку из манифеста..
Если тебе все же необходимо прописать данное разрешение в манифесте, то попробуй добавить в наименования сервиса
<service android:name=".MyService"
android:exported="false">
А два раза можно благодарить за одно и то же? Спасибо! Помогло!

Al.x
Сообщения: 14
Зарегистрирован: 20 ноя 2012, 23:36

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

Сообщение Al.x » 01 ноя 2013, 12:19

Во всех уроках в созданном внутри сервиса потоке используется пауза методом TimeUnit.SECONDS.sleep(15);
У меня при использовании такого метода поток "не оживает" после паузы (оживает только под дебагом).
Хочу спросить: у всех корректно работает этот метод в не основном потоке?
У себя заменил на Thread.sleep(long pause);

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

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

Сообщение Isaev » 06 ноя 2013, 14:56

В хелпе написано, что flags может принимать значения 0, START_FLAG_RETRY или START_FLAG_REDELIVERY.

На практике я ни разу не встречал значения 0. Постоянно приходит START_FLAG_RETRY. По этому поводу я видел в инете мнение, что это реальный баг системы.
Вот у меня там всегда 0, когда должно быть START_FLAG_RETRY по уроку :) О чём это говорит?
и это совсем не мешает программе исправно перезапускать убитый процесс
а вот START_FLAG_REDELIVERY отображается правильно

Emulator Android 2.2

Al.x
Сообщения: 14
Зарегистрирован: 20 ноя 2012, 23:36

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

Сообщение Al.x » 14 ноя 2013, 11:21

Вот еще вопрос, через сколько в среднем система "оживляет" сервис? У меня это время колеблется от 2 мин. до 20 часов. Есть способ как-то быстрее "оживлять", а то боюсь придется делать сервис "неубиваемым", что не хотелось бы.

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

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

Сообщение IgNa » 22 ноя 2013, 15:10

В описании урока написано:

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

У меня сразу эрекция пропала на Service)
Изображение

scyter
Сообщения: 2
Зарегистрирован: 10 окт 2013, 13:59

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

Сообщение scyter » 27 ноя 2013, 14:47

У меня такая вот проблема: не запускается ни сервис, ни даже если пробую просто запустить другое приложение. Не находятся они.
Unable to start service...: no found.

И по умолчанию проект создавал и копировал из примера. То же самое.

И проблема есть при попытке открыть другое приложение:
intent.setComponent(new ComponentName("com.example.p0931_servicestop",
"MainActivity.java"));
startActivity(intent);

Тоже не находит ничего и вылетает. Хотя проект есть в таком пакете.

scyter
Сообщения: 2
Зарегистрирован: 10 окт 2013, 13:59

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

Сообщение scyter » 27 ноя 2013, 15:05

А еще есть вопрос не по этому уроку конкретно.
Часто есть предупреждения, например, на TabActivity или на методы некоторые вроде:
The type TabActivity is deprecated
Что означает это deprecated, что с ним можно сделать?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 27 ноя 2013, 15:16

да. Нужно использовать ActionBar и фрагменты.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Superoleg
Сообщения: 5
Зарегистрирован: 21 ноя 2013, 12:20

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

Сообщение Superoleg » 20 фев 2014, 07:44

такая беда, код как уроке, как решить не знаю.
манифест (
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="le.kh.p0942_servicekillserver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<service android:name=".MyService"
android:exported="false">
<intent-filter>
<action android:name="le.kh.p0942servicekillserver.MyService"></action>
</intent-filter>
</service>
</application>

</manifest>
>
)
Вложения
1.JPG
1.JPG (286.48 КБ) 18683 просмотра

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 20 фев 2014, 08:06

1. Код нужно оформлять и логи из логкат тоже копируются и оформляются (картинка на 2/3 моего экрана не есть гуд)
2. вероятно android:exported="false" - лишнее в данном случае

Superoleg
Сообщения: 5
Зарегистрирован: 21 ноя 2013, 12:20

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

Сообщение Superoleg » 26 фев 2014, 08:32

1- Хорошо, буду аккуратнее.
2. вероятно android:exported="false" - лишнее в данном случае - не меняет сути (

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 26 фев 2014, 12:07

Superoleg писал(а):1- Хорошо, буду аккуратнее.
2. вероятно android:exported="false" - лишнее в данном случае - не меняет сути (
попробуй android:exported="true"

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

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

Сообщение AlexVinn » 02 май 2014, 19:32

Не запускается сервер из клиента (не видно в процессах). Сервер устанавливается вроде нормально... done etc.... Клиент пишет в логе ошибку (см. лог).
Запуск сервиса - MainActivity - стр. 74. Запуск из фрагмента. Может из-за этого... Хотя, мало вероятно.

Помогите разобраться.
Манифест прописал - Service, Intend


Error.log
[syntax=xml]05-02 12:06:58.025: W/ContextImpl(1152): Implicit intents with startService are not safe: Intent { act=com.example.p0942_servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.p0941_servicekillclient.MainActivity$PlaceholderFragment.onClick:74 android.view.View.performClick:4438

05-02 12:06:58.195: W/ActivityManager(374): Unable to start service Intent { act=com.example.p0942_servicekillserver.MyService (has extras) } U=0: not found[/syntax]

MainActivity.java (Client)
[syntax=java5]package com.example.p0941_servicekillclient;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

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

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.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();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment implements
OnClickListener {
Button btnStart;

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
btnStart = (Button) rootView.findViewById(R.id.btnStart);
btnStart.setOnClickListener(this);
return rootView;
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStart:
Log.d("myLogs", "btnStart");
getActivity().startService(new Intent(
"com.example.p0942_servicekillserver.MyService")
.putExtra("name", "value"));

break;

default:
break;
}
}
}

}
[/syntax]
Manifest Server
[syntax=java5]<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.p0942_servicekillserver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="11" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service android:name="MyService">
<intent-filter android:label="com.example.p0942_servicekillserver.MyService">
</intent-filter>
</service>
</application>

</manifest>[/syntax]
MyService.java
[syntax=java5]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.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));
}
}
}[/syntax]
Тут должна быть подпись.

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

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

Сообщение AlexVinn » 03 май 2014, 11:46

Сделал без фрагментов, сервис запускается через 15 сек. удаляется, но не находит и не выдает флаги в лог

[syntax=java5] 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");[/syntax]

(нет в логах значения флага)
Хелп, плз.
Log
05-03 04:39:17.074: D/myLogs(1757): MyService onCreate
05-03 04:39:17.074: D/myLogs(1757): MyService onStartCommand, name = value
05-03 04:39:17.084: D/myLogs(1757): MyRun#1 create
05-03 04:39:17.084: D/myLogs(1757): MyRun#1 start
05-03 04:39:32.134: D/myLogs(1757): MyService onDestroy
05-03 04:39:32.144: D/myLogs(1757): MyRun#1 end, stopSelfResult(1) = true

MyService.java
[syntax=java5]package com.example.p0942_servicekillservernofrag;

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.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, name = "
+ intent.getStringExtra("name"));
readFlags(flags);
MyRun mr = new MyRun(startId);
new Thread(mr).start();
return START_STICKY;
}

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

void readFlags(int flags) {
Log.d(LOG_TAG, "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));
}
}
}
[/syntax]
Тут должна быть подпись.

olademar
Сообщения: 1
Зарегистрирован: 07 июл 2014, 21:39

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

Сообщение olademar » 07 июл 2014, 21:48

Подскажите, пожалуйста, почему система не видит флаги: START_FLAG_RETRY или START_FLAG_REDELIVERY и константы: START_NOT_STICKY, START_STICKY, START_REDELIVER_INTENT, т.е. лог с выводом флагов в методе readFlag() отсутствует. Если процесс убить при любой возвращаемой константе в методе onStartCommand, процесс не оживает.

Анэрон
Сообщения: 3
Зарегистрирован: 25 июл 2014, 10:58

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

Сообщение Анэрон » 25 июл 2014, 11:09

Для начала большое спасибо автору за уроки очень много почерпнул. Фактически всему учился по этим урокам. Прошу совета есть сервис который переодически берёт кординаты и отправляет их на сервер. Также он передаёт данные в активность. Реализация задержки происходит обычным бесконечным циклом ну понятное дело с условием на его остановку. И задержкой slep.По факту всё работает. Но очевидно происходит утечка памяти. На реальном девайсе. И следовательно через определённое время втечении часа или получаса приложение убивается системой. Вопрос как мне отловить утечку памяти. Или как переделать сервис чтобы переодически повторял какое-либо действие. Буду очень признателен за совет.

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

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

Сообщение neoksi » 25 июл 2014, 13:10

Анэрон писал(а):Для начала большое спасибо автору за уроки очень много почерпнул. Фактически всему учился по этим урокам. Прошу совета есть сервис который переодически берёт кординаты и отправляет их на сервер. Также он передаёт данные в активность. Реализация задержки происходит обычным бесконечным циклом ну понятное дело с условием на его остановку. И задержкой slep.По факту всё работает. Но очевидно происходит утечка памяти. На реальном девайсе. И следовательно через определённое время втечении часа или получаса приложение убивается системой. Вопрос как мне отловить утечку памяти. Или как переделать сервис чтобы переодически повторял какое-либо действие. Буду очень признателен за совет.
Тебе нужно пересмотреть саму логику процесса. Держать постоянно работающий сервис в памяти, тебе не даст система.
Для выполнения время от времени какой-либо операции, нужно создавать связку из AlarmManager - > BroadcastReceiver - > Service.

Схема следующая:
1) Создаешь задачу в AlarmManager кидать броадкас через определенные промежутки времени;
2) Ловишь броадкаст и если нужно запускаешь сервис;
3) Выполняешь нужные операции в сервисе без каких-либо таймеров;
4) Освобождаешь ресурсы.

Ответить