2017-03-13 6 views
4

Ich habe Probleme beim Starten eines Dienstes in einer Android App. Der folgende Code sollte gut funktionieren. Aber oft, nicht immer, wird die Absicht des Befehls startService nicht korrekt an die onStartCommand-Methode übergeben. Dies bedeutet, dass die Absicht von der Serviceklasse empfangen, aber die Extras sind verloren:Warum werden meine Absichten nicht korrekt geliefert?

D/TestService: onStartCommand() called with: intent = [Intent { cmp=***/.services.hostConnection.TestService launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } (has extras) }], flags = [0], startId = [6] 
D/TestService: onStartCommand: Bundle[mParcelledData.dataSize=0] 

auch immer ich bin manchmal einen RuntimeException: Unable to create service ***.services.hostConnection.TestService (full-Stack-Trace)

ich für Tage bin seaching jetzt aber kann diesen Fehler finden ...

Ein minimalistischer Serviceklasse, die das Problem reproduziert:

public class TestService extends Service { 
    private static final String TAG = "TestService"; 
    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d(TAG, "onStartCommand() called with: intent = [" + intent + "], flags = [" + flags + "], startId = [" + startId + "]"); 
     if(intent != null && intent.getExtras() != null) Log.d(TAG, "onStartCommand: " + intent.getExtras().toString()); 
     return START_NOT_STICKY; 
    } 
} 

die Methode, die der Dienst gestartet wird:

public void startLongUpdates(long hostId){ 
    Log.d(TAG, "startLongUpdates() called"); 

    Intent intent = new Intent(Application.getInstance(), TestService.class).putExtra(Constants.SERVICE_ACTION_INTENT_EXTRA, HostConnectionService.LONG_UPDATE).putExtra(Constants.CONNECTED_HOST_ID_INTENT_EXTRA, hostId); 
    Log.d(TAG, "startLongUpdates: " + intent.getExtras().toString()); 
    Application.getInstance().startService(intent); 

} 

Stapelüberwachung:

E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: ***, PID: 24974 
                  java.lang.RuntimeException: Unable to create service ***.services.hostConnection.TestService: java.lang.SecurityException: Binder invocation to an incorrect interface 
                   at android.app.ActivityThread.handleCreateService(ActivityThread.java:3532) 
                   at android.app.ActivityThread.-wrap6(ActivityThread.java) 
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:154) 
                   at android.app.ActivityThread.main(ActivityThread.java:6688) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 
                  Caused by: java.lang.SecurityException: Binder invocation to an incorrect interface 
                   at android.os.Parcel.readException(Parcel.java:1693) 
                   at android.os.Parcel.readException(Parcel.java:1646) 
                   at android.hardware.display.IDisplayManager$Stub$Proxy.getDisplayInfo(IDisplayManager.java:718) 
                   at android.hardware.display.DisplayManagerGlobal.getDisplayInfo(DisplayManagerGlobal.java:143) 
                   at android.hardware.display.DisplayManagerGlobal.getCompatibleDisplay(DisplayManagerGlobal.java:200) 
                   at android.hardware.display.DisplayManagerGlobal.getRealDisplay(DisplayManagerGlobal.java:214) 
                   at android.app.ContextImpl.createAppContext(ContextImpl.java:2183) 
                   at android.app.ActivityThread.handleCreateService(ActivityThread.java:3499) 
                   at android.app.ActivityThread.-wrap6(ActivityThread.java)  
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740)  
                   at android.os.Handler.dispatchMessage(Handler.java:102)  
                   at android.os.Looper.loop(Looper.java:154)  
                   at android.app.ActivityThread.main(ActivityThread.java:6688)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  

auch manchmal diese Ausnahme angezeigt:

E/AndroidRuntime: FATAL EXCEPTION: main 
                 Process: ***, PID: 5355 
                 java.lang.RuntimeException: Unable to start service ***[email protected] with Intent { cmp=***/.services.hostConnection.TestService (has extras) }: java.lang.RuntimeException: Unknown exception code: 2 msg ServiceActionIntentExtra 
                  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027) 
                  at android.app.ActivityThread.-wrap17(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:148) 
                  at android.app.ActivityThread.main(ActivityThread.java:5417) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                  Caused by: java.lang.RuntimeException: Unknown exception code: 2 msg ServiceActionIntentExtra 
                  at android.os.Parcel.readException(Parcel.java:1634) 
                  at android.os.Parcel.readException(Parcel.java:1573) 
                  at android.app.ActivityManagerProxy.serviceDoneExecuting(ActivityManagerNative.java:3814) 
                  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3019) 
                  at android.app.ActivityThread.-wrap17(ActivityThread.java)  
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442)  
                  at android.os.Handler.dispatchMessage(Handler.java:102)  
                  at android.os.Looper.loop(Looper.java:148)  
                  at android.app.ActivityThread.main(ActivityThread.java:5417)  
                  at java.lang.reflect.Method.invoke(Native Method)  
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

Manifest:

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:name="***.Application" 
    android:allowBackup="false" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 


    <activity 
     android:launchMode="singleTop" 
     android:name="***.gui.menu.MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
    </activity> 
    <activity 
     android:name=".gui.SplashActivity" 
     android:theme="@style/SplashTheme"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    <activity 
     android:name="***.gui.menu.KnownHostInfoActivity" 
     android:theme="@style/AppTheme.NoActionBar" /> 

    <service android:name="***.services.hostConnection.TestService" /> 

</application> 

Application.java:

public class Application extends android.app.Application{ 
    private static final String TAG = "Application"; 
    private static Application application; 
    public static Application getInstance(){ 
     return application; 
    } 
    public void onCreate() { 
     super.onCreate(); 
     application = this; 
    } 
} 
+0

Wenn Sie den Dienst starten, heißt die dort erstellte Intent-Variable "intent", aber Sie beginnen den Dienst mit "startService (intentionTe)". ist es nur ein Tippfehler in der Frage? – lelloman

+0

Oh, du hast Recht. Das ist ein Tippfehler in der Frage. – bartolja

+0

Könnten Sie bitte auch Ihre AndrdoiManifest.xml posten? – lelloman

Antwort

1

Ich löste das Problem! Es hatte mit Parzellen zu tun, die am anderen Ende der App verwendet wurden ... Tatsächlich wurden Parzellen, die in einer Schleife verwendet wurden, zu früh recycelt und von anderen Teilen der Anwendung wiederverwendet. Dies führte in vielen Teilen der Anwendung zu verschiedenen Problemen.

Danke für Ihre Hilfe trotzdem!

0

Sie haben die Absicht, in Service onStartComamnd Verfahren erhalten. Aber Sie bekommen fälschlicherweise die Daten aus der Absicht. Bitte verwenden Sie folgende Zeilen innerhalb der onStartCommand Methode,

String value = intent.getStringExtra(your key); // if you are sending string 

Und ich nicht verstehen, warum Sie Absicht Objekt mit Zeichenfolge anhängt werden.

Log.d(TAG, "onStartCommand() called with: intent = [" + intent + "], flags = [" + flags + "], startId = [" + startId + "]"); 
+0

Danke für Ihre Antwort! Ich benutze die Methoden 'get ** Extra (key)', um die zusätzlichen Daten zu erhalten. Aber in der 'TestService' Klasse wollte ich nur eine minimale' Service' Klasse bekommen. Und mit 'intent.getExtra(). ToString()' Ich bekomme etwas wie 'Bundle [mParcelledData.dataSize = 0]', wenn die zusätzlichen Daten irgendwie verloren gehen. Wenn es noch verfügbar ist, ist 'dataSize' größer als 0 ... Also sollte mein Code zu diesem Zeitpunkt korrekt sein. – bartolja

Verwandte Themen