Android IntentService никога не се е обаждал

Имам IntentService, който искам да стартирам при onCreate. Това е пожар и забравете, че прави повикване до уебсайт и след това (евентуално) започва изтегляне чрез downloadmanager. Не вярвам, че моята услуга се стартира, защото не виждам никакви отчети за журнал от нея. Имам услугата в моя манифест, същия пакет като основния. Също така не се показва в моя logcat (друга тема каза, че трябва).

onCreate:

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    Intent heartbeat = new Intent(this, Heartbeat.class);
    startService(heartbeat);
}

*Опитах и ​​това.startService(heartbeat); и също не проработи.

манифест:

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

    <service android:name=".Heartbeat" android:enabled="true"/>

    <activity
        android:name=".MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:label="@string/title_activity_main" >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

*със или без android:enabled флаг няма значение

начало на IntentService:

public class Heartbeat extends IntentService
{
    public Heartbeat()
    {
        super("Heartbeat");
        Log.v("SUPER", "SUPER");
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        Log.v("HERE", "HERE");
        //do other stuff

Нито един от тези отчети за журнал не се показва в конзолата/logcat и моята услуга никога не удря уеб сървъра (този код преди това беше в асинхронна задача и функционираше). Някакви идеи какво правя грешно?

Редактиране – Виждам предупреждение от маркера ActivityManager във всичките си съобщения, в което се посочва „Не може да се стартира услуга Intent { act=com.example.vs_1.Heartbeat }: не е намерено“. Въпреки това, почти всяко предложение, което видях в това съобщение, беше да се постави манифест в маркера на приложението, което вече направих.


person s.field212    schedule 01.11.2012    source източник
comment
Също така се опитах да превърна Heartbeat.class и .Heartbeat в Main/manifest съответно в техните дълги имена com.whatever, без резултат.   -  person s.field212    schedule 01.11.2012
comment
Вашият код е наред. Предполагам, че имате sth грешно в регистрационната конзола;) (сигурни ли сте, че филтрирате за подробен (извиквате Log.v()) и приложението ви е зададено в настройките на конзолата? използвате ли eclipse или самостоятелен ddms?)   -  person Tomasz Gawel    schedule 02.11.2012
comment
Много сигурен, мога да добавя Log.v(AFTER, AFTER); на реда след startService и виждам това в logcat. Използвам eclipse. И така, ако кодът изглежда правилен, какви са възможностите ми? Искам да използвам IntentService, защото изглежда като идеалното прилягане, но предполагам, че мога да го върна като асинхронна задача, която работеше по-рано днес.   -  person s.field212    schedule 02.11.2012
comment
Ако вашият клас Heartbeat всъщност е com.example.vs_1.Heartbeat (предполагам от предупреждението: act=com.example.vs_1.Heartbeat, not found), тогава трябва да го декларирате в манифеста като <service android:name=".vs_1.Heartbeat" android:enabled="true"/>, ако пакетът на приложението е com.example   -  person Tomasz Gawel    schedule 02.11.2012
comment
Опитах и ​​това, не работи, но леко променя предупреждението. С name=.vs_1.Heartbeat в манифеста, предупреждението става Unable to start service Intent { cmp=com.example.vs_1/.MainActivity.Heartbeat}: not found. / е нов. Това дава ли някакви улики? Също така се опитах да направя приложение с минимален случай, без успех, редактирах основната публикация, за да включа това.   -  person s.field212    schedule 02.11.2012
comment
Чакай, защо твоята услуга е вътрешен клас дейност??? не можете да посочите нестатичен вътрешен клас в манифеста   -  person Tomasz Gawel    schedule 02.11.2012
comment
преместете класа на услугата в отделен файл: com.example.test_intent.Heartbeat и променете манифеста на: <service android:name=".Heartbeat" android:enabled="true"/>   -  person Tomasz Gawel    schedule 02.11.2012


Отговори (2)


Ах, сюжетът се задълбочава!

„Не може да се стартира услуга“ е грешка, въпреки че е маркирано като предупреждение.

Това се случва, защото системата не може да намери клас, който има името, което е в списъка. В този случай това е com.example.vs_1.Heartbeat.

За да сте сигурни, че имате този клас, имате нужда от файл Hearbeat.java, който съдържа

пакет com.example.vs_1;

публичен клас Heartbeat разширява IntentService...

Във вашия манифест, ако вашият елемент съдържа атрибута package="com.example.vs_1", тогава можете да кажете

Обърнете внимание на точката (".") преди "Heartbeat".

Ако използвате друга стойност за "пакет", тогава трябва да кажете

/com.example.vs_1.Heartbeat", където е стойността на "package".

От това трябва да стане ясно, че трябва да изберете едно основно име на пакет за вашите класове и да използвате същото име за стойността на "пакета".

person Joe Malin    schedule 01.11.2012
comment
Това беше, след като го сложих в друг файл Heartbeat.java, проработи. Струва ми се странно, че няма да го намери във файла MainActivity.java. Нямам достатъчно представители, за да гласувам за вас, но когато имам, със сигурност ще го направя. - person s.field212; 02.11.2012

Сигурни ли сте, че основното действие се стартира правилно? LogCat ще ви покаже съобщения за грешка, ако системата не може да стартира вашата IntentService. Също така, това са "подробни" съобщения, така че се уверете, че LogCat е настроен да ги показва. Ако сте настроили LogCat на „грешка“, той няма да показва подробни съобщения.

person Joe Malin    schedule 01.11.2012
comment
Доколкото знам се стартира правилно. Приложението ми стартира и ми показва моята празна страница. Мога също да направя Log.v(AFTER, AFTER); веднага след стартовата услуга и виждам този резултат. Също така разбрах, че във всичките си съобщения от маркера ActivityManger виждам това предупреждение (все пак не е грешка...) Не може да се стартира услуга Intent { act=com.example.vs_1.Heartbeat }: не е намерен. Търсенето в Google обаче не даде други предложения освен тези, които видях. Така че предполагам, че поне потвърдих, че не стартира правилно. - person s.field212; 02.11.2012