FirebaseMessagingService crashes on Android O due to background restrictions

Our app crashes on Android O due to new background restrictions. We are on Firebase version 10.2.1, which added support for Android O.

Seems to be a problem with Firebase? Or are there some changes needed to support this on our side?

java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.firebase.INSTANCE_ID_EVENT pkg=my.package.name cmp=my.package.name/my.package.name.MyFcmIdService (has extras) }: app is in background uid UidRecord{30558fa u0a327 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.support.v4.content.WakefulBroadcastReceiver.startWakefulService(WakefulBroadcastReceiver.java:99)
at com.google.firebase.iid.zzg.b(zzg.java:9)
at com.google.firebase.iid.zzg.a(zzg.java:72)
at com.google.firebase.iid.zzg.a(zzg.java:2)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:23)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:34)
at com.google.firebase.iid.FirebaseInstanceId.<init>(FirebaseInstanceId.java:31)
at com.google.firebase.iid.FirebaseInstanceId.getInstance(FirebaseInstanceId.java:47)
at com.google.firebase.iid.FirebaseInstanceId.a(FirebaseInstanceId.java:4)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:19)
at com.google.firebase.iid.FirebaseInstanceIdService.b(FirebaseInstanceIdService.java:35)
at com.google.firebase.iid.zzb$zza$1.run(zzb.java:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

Updating Upgrading to version 11.4.2 fixes this problem.

+6
source share
2 answers

@KaMyLL is correct. I had the same problem with our application and I was able to solve it by replacing the IntentService (which we started at onTokenRefresh()) with JobIntentService.

, JobScheduler JobIntentService docs , - . , , .

?

Android 8 , :

, , . , , . . , Service.stopSelf() .

:

JobScheduler.

, Android 7.x startService(), ( ), . Android 8 . , JobScheduler. JobScheduler IntentService , IntentService . , , JobScheduler, . Android OS , , . , . , . , if-else. , , : JobIntentService, .

?

, " , ". , ( onTokenRefresh() Firebase), startService(). 5-10 . , IllegalStateException . , , .

IntenService JobIntentService?

FirebaseInstanceIdService.onTokenRefresh() :

a) BIND_JOB_SERVICE:

<service android:name=".fcm.FcmRegistrationJobIntentService"
   android:exported="false"
   android:permission="android.permission.BIND_JOB_SERVICE"/>

b) IntentService android.support.v4.app.JobIntentService, onHandleIntent(Intent) onHandleWork(Intent) enqueueWork (Context, Intent):

public class FcmRegistrationJobIntentService extends JobIntentService 
{
    // Unique job ID for this service.
    static final int JOB_ID = 42;

    // Convenience method for enqueuing work in to this service.
    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, FcmRegistrationJobIntentService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // the code from IntentService.onHandleIntent() ...
    }
}

c) enqueueWork():

public class ComfyFirebaseInstanceIdService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        Intent intent = new Intent(this, FcmRegistrationJobIntentService.class);
        // startService(intent);
        FcmRegistrationJobIntentService.enqueueWork(this, intent);
    }
}

, . Android 8, Android 7.

+3

, IntentService JobIntentService . IntentService pre-Oreo. Android 8 android system JobScheduler. 0, .

+1

All Articles