2017-03-13 10 views
4

アンドロイドアプリでサービスを開始する際に問題が発生しています。次のコードはうまくいくはずです。しかし、しばしば、必ずしもそうではなく、startServiceコマンドのインテントがonStartCommandメソッドに正しく渡されません。私は今日間seachingてる私の意図が正しく配信されないのはなぜですか?

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] 

また、私は時々RuntimeException: Unable to create service ***.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 ***[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 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:あなたはサービスonStartComamnd方法で意図を受けている

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

ここで作成したインテント変数は 'intent'という名前ですが、' startService(intentTe) 'でサービスを開始しています。それはちょうど質問のタイプミスですか? – lelloman

+0

ああ、そうです。それは質問のタイプミスです。 – bartolja

+0

AndrdoiManifest.xmlも投稿してください。 – lelloman

答えて

1

私はこの問題を解決しました。これは、アプリケーションの反対側で使用される小包と関係していた...実際には、ループで使用される小包は、早期にリサイクルされ、アプリケーションの他の部分で再利用されました。そして、これにより、アプリケーションの多くの部分でさまざまな問題が発生しました。

とにかくお世話になりました!

0

。しかし、あなたは間違って意図からデータを取得しています。あなたは、文字列と意図オブジェクトを追加している理由を、理解することが、私はできない、onStartCommandメソッド内の行の下に

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

を使用してください。

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

あなたの答えをありがとう!余分なデータを取得するために 'get ** Extra(key)'メソッドを使用しています。しかし、 'TestService'クラスでは、最小の' Service'クラスを取得したかっただけです。そして、 'intent.getExtra()。toString()'では、余分なデータがいくらか失われた場合、 'Bundle [mParcelledData.dataSize = 0]'のようなものが得られます。それでも利用可能な場合、 'dataSize'は0より大きいので...私のコードはその時点で正しいはずです。 – bartolja

関連する問題