web-dev-qa-db-ja.com

GcmBroadcastReceiver IllegalStateException:サービスの意図を開始することはできません

私はこの例外を受け取っているAndroidでFCMプッシュ通知に取り組んでいます:

GcmBroadcastReceiver IllegalStateException:サービスの意図を開始することはできません

私はこのフォーラムで多くの質問を検索しましたが、それを解決する助けがまだありませんでした。ログとマニフェストのパッチも以下に示します。

マニフェスト:

<uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.WAKE_LOCK" />
    <uses-permission Android:name="Android.permission.VIBRATE" />
    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
    <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />

<receiver Android:name="com.parse.GcmBroadcastReceiver"
            Android:permission="com.google.Android.c2dm.permission.SEND">
            <intent-filter>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
                <action Android:name="com.google.Android.c2dm.intent.REGISTRATION" />
                <category Android:name="com.kolbeh" />
            </intent-filter>
        </receiver>
        <meta-data Android:name="com.parse.Push.gcm_sender_id"
            Android:value="id:85490######" />

        <service Android:name="com.parse.PushService" />

        <receiver
            Android:name="dinewhere.fcm.CustomPushReceiver"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.parse.Push.intent.RECEIVE" />
                <action Android:name="com.parse.Push.intent.OPEN" />
                <action Android:name="com.parse.Push.intent.DELETE" />
            </intent-filter>
        </receiver>

エラーログ:

10-16 16:52:19.621 25906-25906/com.kolbeh E/AndroidRuntime: FATAL EXCEPTION: main
                                                            Process: com.kolbeh, PID: 25906
                                                            Java.lang.RuntimeException: Unable to start receiver com.parse.GcmBroadcastReceiver: Java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.Android.c2dm.intent.RECEIVE flg=0x1000010 pkg=com.kolbeh cmp=com.kolbeh/com.parse.PushService (has extras) }: app is in background uid UidRecord{2ac0a5c u0a888 RCVR idle procs:1 seq(0,0,0)}
                                                                at Android.app.ActivityThread.handleReceiver(ActivityThread.Java:3259)
                                                                at Android.app.ActivityThread.-wrap17(Unknown Source:0)
                                                                at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1677)
                                                                at Android.os.Handler.dispatchMessage(Handler.Java:105)
                                                                at Android.os.Looper.loop(Looper.Java:164)
                                                                at Android.app.ActivityThread.main(ActivityThread.Java:6541)
                                                                at Java.lang.reflect.Method.invoke(Native Method)
                                                                at com.Android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.Java:240)
                                                                at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:767)
                                                             Caused by: Java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.Android.c2dm.intent.RECEIVE flg=0x1000010 pkg=com.kolbeh cmp=com.kolbeh/com.parse.PushService (has extras) }: app is in background uid UidRecord{2ac0a5c u0a888 RCVR idle procs:1 seq(0,0,0)}
                                                                at Android.app.ContextImpl.startServiceCommon(ContextImpl.Java:1505)
                                                                at Android.app.ContextImpl.startService(ContextImpl.Java:1461)
                                                                at Android.content.ContextWrapper.startService(ContextWrapper.Java:644)
                                                                at Android.content.ContextWrapper.startService(ContextWrapper.Java:644)
                                                                at com.parse.ServiceUtils.runIntentInService(ServiceUtils.Java:37)
                                                                at com.parse.ServiceUtils.runWakefulIntentInService(ServiceUtils.Java:68)
                                                                at com.parse.GcmBroadcastReceiver.onReceive(GcmBroadcastReceiver.Java:21)
                                                                at Android.app.ActivityThread.handleReceiver(ActivityThread.Java:3252)
                                                                at Android.app.ActivityThread.-wrap17(Unknown Source:0) 
                                                                at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1677) 
                                                                at Android.os.Handler.dispatchMessage(Handler.Java:105) 
                                                                at Android.os.Looper.loop(Looper.Java:164) 
                                                                at Android.app.ActivityThread.main(ActivityThread.Java:6541) 
                                                                at Java.lang.reflect.Method.invoke(Native Method) 
                                                                at com.Android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.Java:240) 
                                                                at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:767) 
11
U Khan

Android 8.0 +、26以上のtargetSdkVersionで実行しています。 バックグラウンドからstartService()を確実に呼び出すことはできません (GCMレシーバーなどから)代わりに、次のいずれかを行う必要があります。

  • startForegroundService()に切り替えてフォアグラウンドサービスを使用する、または

  • JobIntentServiceに切り替えます

特定のケースでは、startService()を呼び出しているコードはParseからのもののようです。 Android 8.0を考慮したParseクライアントの更新があるかどうかを確認する必要があります。

14
CommonsWare