Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Context.startForegroundService did not then call Service.startForeground

It's mine BroadcastReciever class. The class working on Boot phone status.

Code ;

public class BroadCastRecieverBoot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent ıntent) {
        if(Intent.ACTION_BOOT_COMPLETED.equals(ıntent.getAction()))
        {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(new Intent(context, MyService.class));
                context.startForegroundService(new Intent(context, GPSTracker.class));
            } else {
                context.startService(new Intent(context, MyService.class));
                context.startService(new Intent(context, GPSTracker.class));
            }
        }
    }
}

I get This Error ;

     android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()


    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1792)

at android.os.Handler.dispatchMessage(Handler.java:106)                                            

        at android.os.Looper.loop(Looper.java:164)                                                   

        at android.app.ActivityThread.main(ActivityThread.java:6523)                                        

        at java.lang.reflect.Method.invoke(Native Method)                                                   

        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)

It doesn't work on Android Oreo now. I don't know what is the mistake of that.

like image 338
Somomo1q Avatar asked Aug 01 '18 16:08

Somomo1q


People also ask

When to call startForeground?

After the system creates the service, the app has 5 seconds to call the service's startForeground() method to display the user-visible notification for the new service. If the app does not call startForeground() within this time limit, the system will stop the service and declare the application as ANR.

What is the difference between startService and startForegroundService?

startForegroundService(Intent) instead of the former startService(Intent) . The service must then call startForeground(int, Notification) within first 5 seconds after it has started, otherwise system will stop the service.

How do you stop a foreground service?

The service must stop itself by calling stopSelf(), or another component can stop it by calling stopService(). Once requested to stop with stopSelf() or stopService(), the system destroys the service as soon as possible.


1 Answers

According to official document of Android 8.0 Background Execution Limits

Android 8.0 introduces the new method startForegroundService() to start a new service in the foreground. After the system has created the service, the app has five seconds to call the service's startForeground() method to show the new service's user-visible notification. If the app does not call startForeground() within the time limit, the system stops the service and declares the app to be ANR.

So, make sure you have started ongoing notification by calling startForeground (int id, Notification notification) in the onCreate() method of your service.

Note: Apps targeting API Build.VERSION_CODES.P or later must request the permission Manifest.permission.FOREGROUND_SERVICE in order to use this API.

like image 110
Priyank Patel Avatar answered Sep 30 '22 11:09

Priyank Patel