Java 为什么我的意图没有正确传达?

Java 为什么我的意图没有正确传达?,java,android,android-intent,android-service,Java,Android,Android Intent,Android Service,我在android应用程序中启动服务时遇到问题。下面的代码应该可以很好地工作。但是,startService命令的意图通常不会正确地传递给onStartCommand方法。这意味着服务类收到了意图,但额外的内容丢失了: D/TestService: onStartCommand() called with: intent = [Intent { cmp=***/.services.hostConnection.TestService launchParam=MultiScreenLaunchPa

我在android应用程序中启动服务时遇到问题。下面的代码应该可以很好地工作。但是,
startService
命令的意图通常不会正确地传递给
onStartCommand
方法。这意味着服务类收到了意图,但额外的内容丢失了:

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]
此外,我有时会遇到
运行时异常:无法创建服务***.services.hostConnection.TestService
(下面是完整的堆栈跟踪)

我搜索了好几天,但是找不到这个虫子

再现问题的极简服务类:

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;
    }
}
启动服务的方法:

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);

}
堆栈跟踪:

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) 
有时也会出现此异常:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                         Process: ***, PID: 5355
                                                         java.lang.RuntimeException: Unable to start service ***.services.hostConnection.TestService@9386a65 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 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>

您正在使用onStartComamnd方法接收服务意图。但是你从意图中错误地获取了数据。请在onStartCommand方法中使用下面的行

String value = intent.getStringExtra(your key); // if you are sending string 
而且,我无法理解,为什么要在intent对象后面附加字符串

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

我解决了这个问题!这与应用程序另一端使用的包裹有关。。。实际上,循环中使用的包裹被回收到早期,并被应用程序的其他部分重用。因此,这导致了应用程序的许多部分出现了各种问题


无论如何,谢谢你的帮助

当您启动服务时,在那里创建的Intent变量名为
Intent
,但您启动服务时使用的是
startService(Intent)
。这只是问题中的一个输入错误吗?哦,你说得对。这是问题中的一个输入错误。您是否也可以发布您的AndrdoiManifest.xml?是
void(long)
a
Activity
方法?另外,您可以共享您的
应用程序
类吗?不,
更新(long)
在单独的类中,但由
活动
方法调用。谢谢您的回答!我正在使用
get**Extra(key)
方法来获取额外的数据。但是在
TestService
类中,我只想得到一个最小的
Service
类。使用
intent.getExtra()。如果它仍然可用,
dataSize
大于0。。。所以我的代码在这一点上应该是正确的。
Log.d(TAG, "onStartCommand() called with: intent = [" + intent + "], flags = [" + flags + "], startId = [" + startId + "]");