Автозагрузка Service

Ответить
Vyazan
Сообщения: 1
Зарегистрирован: 24 окт 2015, 16:50

Автозагрузка Service

Сообщение Vyazan » 26 окт 2015, 23:42

Всем привет! Делаю примеры по сервисам. Уроки 92 - 100. Запускаю сервис, грохаю его не вызывая stopSelf, соответственно сервис должен перезапуститься, если мы передали в onStartCommand "START_REDELIVER_INTENT" или "START_STICKY".
Этого не происходит. Проблема в том, что всегда onStartCommad возвращает 0, вместо START_FLAG_RETRY или START_FLAG_REDELIVERY. Перепробовал все что можно, все равно нуль... Помогите, пожалуйста, сил моих больше нет...
Код сервиса по уроку 94http://startandroid.ru/ru/uroki/vse-uro ... mmand.html
MyService.java

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

[syntax=java]package p0942servicekillserver.develop.startandroid.ru.servicekillserver;

/**
 * Created by YJYJ on 18.10.2015.
 */
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, "Читаем флаги");
        switch (flags) {
            case START_FLAG_REDELIVERY:
                Log.d(LOG_TAG, "readFlags: START_FLAG_REDELIVERY");
                break;
            case START_FLAG_RETRY:
                Log.d(LOG_TAG, "readFlags: START_FLAG_RETRY");
                break;
            case 0:
                Log.d(LOG_TAG, "readFlags: 0");
                break;
            default:
                Log.d(LOG_TAG, "readFlags: ERROR. Unexpected flag returned: " + flags);
        }

    }

    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(600);
                Log.d(LOG_TAG, "Завершено...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stop();
        }

        void stop() {
            Log.d(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
                    + startId + ") = " + stopSelfResult(startId));
        }
    }
}[/syntax]
AndroidManifest.xml

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

[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="p0942servicekillserver.develop.startandroid.ru.servicekillserver" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <service android:name=".MyService" >
            <intent-filter>
                <action android:name="p0942servicekillserver.develop.startandroid.ru.servicekillserver.MyService" >
                </action>
            </intent-filter>
        </service>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true"
            android:process=":Servis"
            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>
        </receiver>
    </application>

</manifest>
[/syntax]

Аватара пользователя
Andrés
Сообщения: 11
Зарегистрирован: 17 мар 2015, 11:28

Re: Автозагрузка Service

Сообщение Andrés » 28 окт 2015, 00:07

Привет, я сам еще только учусь, поэтому это не столько ответ, сколько комментарии-мысли вслух и основаны только
на том как я все это понимаю (т.е. очень даже может быть что ошибочны), но возможно поможет:

1. (дело скорее всего не в этом, но вдруг...) я пишу return Service.START_STICKY;
2. Что там приходит с флагами - дело 110е, я их вообще не проверяю, пока нет необходимости, перезапуск сервиса
обеспечивается именно этим самым return...
3. Свои "важные" сервисы я делаю удаленными (:remote)
4. А сам сервис ты точно грохаешь вручную убивая процесс, а не ждешь 10 минут (600 секунд) пока он сам закроется?
5.

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

android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
имхо указывается только в секции application
Но это влияет только на запуск ресивера при перезагрузке устройства.
6. Для чего используется ресивер? Если только для запуска сервиса, то нужен ли ему отдельный процесс? Он в любом случае
кинет интент сервису и умрет, но и то запустится только после того как пропишешь ему фильтр:

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

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
[/i]

Больше пока ничего предположить не могу из того что увидел, но может что-то упускаю из виду...
В любом случае очень интересно что реально окажется причиной.

Ну и "до кучи" - вдруг кто из гуру дочитает до сюда (вопрос имхо связанный с вашим):
ситуация зеркально похожа: есть активити и "неубиваемый" "удаленный" сервис. Если убить активити - сервису естественно "по барабану" и он продолжает работать,
далее перезапускаем активити (хоть кликом иконки приложения, хоть через уведомление от сервиса) и потом "выходим" (у меня сделано "как делать нельзя" - при выборе в меню "Exit"
приложение тормозит сервис и потом finish(); активити). Так вот проблема в том что иногда сервис все равно сам перезапускается.
Причем получается это только на устройстве, а на эмуляторе ничего такого не происходит...
зы выход как рекомендуют для свежих андроидов

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

              Intent intent = new Intent(MyActivity.this, MyActivity.class);
               intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
 
тоже делал - перезапускается еще чаще.

Ответить