【问题标题】:GcmBroadcastReceiver IllegalStateException: Not allowed to start service IntentGcmBroadcastReceiver IllegalStateException: 不允许启动服务 Intent
【发布时间】:2017-10-16 12:54:57
【问题描述】:

我正在处理 Android 中的 FCM 推送通知,但出现此异常:

GcmBroadcastReceiver IllegalStateException: Not allowed to start service Intent

我在这个论坛上搜索了很多问题,但仍然没有得到帮助来解决它。我的日志和清单补丁也在下面给出。

清单:

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

【问题讨论】:

  • @U Khan:问题解决了吗?

标签: android google-cloud-messaging broadcastreceiver illegalargumentexception


【解决方案1】:

您在 Android 8.0+ 上运行,targetSdkVersion 为 26+。 You cannot reliably call startService() from the background,例如来自 GCM 接收器。相反,您应该:

  • 切换到startForegroundService()并使用前台服务,或者

  • 切换到JobIntentService

在您的特定情况下,调用 startService() 的代码似乎来自 Parse。您应该查看是否有将 Android 8.0 考虑在内的 Parse 客户端更新。

【讨论】:

  • 将 targetSdkVersion 更改为 25 可以解决此问题吗?我在问,因为我无法更改调用方法,但我可以更改 SDK 目标。
  • @clee2005:“将 targetSdkVersion 更改为 25 可以解决这个问题吗?” -- AFAIK,是的。
  • 我有这个问题: startService() 是从 Parse 调用的。有谁知道 Parse 库的最新版本是否解决了这个问题?
  • @CommonsWare 当我使用 startForegroundService() 我的通知在服务完成后消失。但是,我想保留它,因为我用它来接收来自 Google 的通知。有什么建议吗?
  • @Oximer:“因为我用它来接收来自 Google 的通知”——Notification 与 FCM 无关,如果这就是您所说的“接收来自 Google 的通知”的话。
猜你喜欢
  • 2018-12-23
  • 2018-03-08
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多