2015-05-07 4 views
5

Ich habe einen Dienst, den ich auf BOOT COMPLETEService nicht auf BOOT COMPLETE gestartet

starten mag, wenn es gestartet wird, ich habe einen Toast Meldung angezeigt.

Mein Problem ist, dass beim Hochfahren des Geräts der Toast angezeigt wird und auf dem Bildschirm hängen bleibt und der Dienst nicht korrekt gestartet wird.

aber wenn ich versuche, meinen Dienst durch eine Aktivität zu starten, startet der Dienst gut und der Toast verschwindet nach ein paar Sekunden richtig.

mein Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.tfl.extprotocolservice" 
    android:versionCode="7" 
    android:versionName="1.6" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="21" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <receiver android:name="com.tfl.extprotocolservice.ExtProtocolBroadcastReceiver" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <service android:name=".ExtProtocolService" > 
      <intent-filter> 
       <action android:name="com.tfl.extprotocolservice.ISetIpPort" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="com.tfl.extprotocolservice.IExtMessage" /> 
      </intent-filter> 
     </service> 
<!-- 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

meine Rundfunkempfänger:

public class ExtProtocolBroadcastReceiver extends BroadcastReceiver { 


    /* broadcast receiver to start on BOOT COMPLETE*/ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent StartServiceIntent=new Intent(context,ExtProtocolService.class); 
     context.startService(StartServiceIntent); 

    } 

} 

btw, wird die Aktivität im Manifest kommentiert, weil ich wirklich brauche es nicht, es war nur der Start zu testen Service von einer Aktivität.

+0

Was passiert, wenn Sie Ihre App zuerst starten, indem Sie sie aus dem Launcher starten und dann neu starten? Führt der Neustart Ihren Dienst aus? – HappyCactus

+0

@HappyCactus leider nicht. immer noch dasselbe – yanish

Antwort

3

Wenn Ihre Anwendung keine Aktivitäten hat, Ihre BroadcastReceiver wird nie aufgerufen.

Wenn Sie eine Anwendung installieren, wird sie im "gestoppten Zustand" installiert. Anwendungen im "gestoppten Zustand" werden nicht gesendet Intent s an sie geliefert.

Um Ihre Anwendung aus dem "gestoppten Zustand" zu bringen, muss der Benutzer Ihre Anwendung (mindestens einmal) manuell starten. Um dies zu tun, müssen Sie ihm eine Activity anbieten, die er verwenden kann, um Ihre Anwendung zu starten.

Sobald Ihre Anwendung nicht mehr im "gestoppten Zustand" ist, sendet Android Broadcast Intent s an. Das heißt, bis der Benutzer Ihre Anwendung "zwingt".

Wenn der Benutzer Ihre Anwendung "erzwingt", wird er wieder in den Status "Stopped" versetzt und empfängt die Übertragung nicht mehr Intent s. Bis der Benutzer die Anwendung erneut manuell startet.

+0

hinzu. Dieses Verhalten wurde in Android 3.1 hinzugefügt/geändert: http://developer.android.com/about/versions/android-3.1.html # launchcontrols –

0

Ich versuchte mit am broadcast -a android.intent.action.BOOT_COMPLETED dann es das Gerät neu starten.

können Sie <action android:name="android.intent.action.USER_PRESENT"/>

Nach mehr Forschung versuchen, ich denke, es ist die fastboot mode war die BOOT_COMPLETE nicht ausgestrahlt.

+0

Was meinst du mit Fastboot-Modus? – yanish

+0

Fastboot hat nichts mit diesem Problem zu tun, fasboot startet nicht einmal das Android OS. Sie werden es wahrscheinlich mit "Quick Boot" verwechseln. –

+1

Einige HTC-Geräte können eine "Fast Boot" -Funktion aktivieren, die eher einem tiefen Ruhezustand und nicht einem echten Neustart ähnelt und daher nicht die Absicht BOOT_COMPLETE haben sollte. Um dies wiederherzustellen, fügen Sie einfach diese Aktion im Empfänger-Intent-Filter "" –

-1

Ihr Dienst filtert Aktionen, aber Ihre Absicht liefert keine. Fix mit diesem:

StartServiceIntent.setAction("com.tfl.extprotocolservice.IExtMessage"); 
Verwandte Themen