Is notification mandatory while app is running(visible) for the foreground service in API>25

后端 未结 2 669
星月不相逢
星月不相逢 2021-01-28 16:00

From the stackoverflow and many blogs, i surely understand that foreground service never run without notification in API>25. But still i confuse that Is notification mandory whi

相关标签:
2条回答
  • 2021-01-28 16:35

    No, it is mandatory even your app is running in foreground your foreground service need a notification.

    You won't able to hide it.

    Why : You can use any other background task handler like intent service, job sclr but things is designed defferent for foreground service your user understand that event i will close this one of it's progress is going to keep running but things is defferent with background service your know it will do something in background but when system decide it's best time to do it not when your app want (as like in foreground service).

    One more case ex : Suppose your app in foreground battery level is lower than expected by user or system your foreground service will execute instantly no matter what so it's important for your user to know this it's running and take my resources (battery, data, etc)

    Hopefully you got my mean

    0 讨论(0)
  • 2021-01-28 16:53

    It's not possible to remove the notification while the foreground service is running, but it is possible to change your foreground service back into a "regular" service. This removes the need for a notification. In fact, the function to use,

    stopForeground(boolean removeNotification)

    ...includes a removeNotification parameter just for that purpose. You service can switch from being "foreground" to "regular" on demand, by alternating calls to startForeground() and stopForeground().

    In case it's not clear, you'd probably want to call stopForeground() whenever you have at least one Activity in a "started" state. This is something you'd have to track manually. Then, when the number of "started" activities reaches 0, you'd call startForeground().

    EDIT

    One approach is to use a bound service. Then, it's easy to call stopForeground() on it when you want.

    Assume you have a single Activity. You can bind it to the service (see this doc or use one of these examples). Then your onServiceConnected() function could look like this (adapted from the Google example):

    //MyActivity.java:
    
    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mService.stopForeground(true);      //This makes the notification go away
        bound = true;
    }
    
    ...
    
    @Override
    protected void onStart() {
        super.onStart();
        // Bind to the service
        bindService(new Intent(this, MyService.class), this, Context.BIND_AUTO_CREATE);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        // Unbind from the service
        if (bound) {
            Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(text)
                .setAutoCancel(true);
    
            Notification notification = builder.build();
            mService.startForeground(1, notification);    //This brings the notification back! Service is already running, and continues to run.        
    
            unbindService(this);
            bound = false;
        }
    }
    
    0 讨论(0)
提交回复
热议问题