Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Service stopForeground(false) remove notification when should not

Instead of

stopForeground(true)

calling,

stopForeground(false)

should retain the notification as it is (without ongoing state) unless it is dismissed by user/removed programmatically. This also should prevents notification flashing since I am not recreating the notification.

But it does not work. stopForeground(false) has the same behavior of stopForeground(true).

This is a sample project:

public class AudioTestService extends Service {
private static final String CHANNEL_ID = "TestChannel";
private static final int NOTIFICATION_ID = 14;
Notification mBuilder;

public AudioTestService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    // throw new UnsupportedOperationException("Not yet implemented");
    return null;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    stopForeground(true);
    super.onTaskRemoved(rootIntent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Intent intentA = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intentA, 0);

    Notification mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("Titolo")
            .setContentText("Descrizione")
            .setContentIntent(pendingIntent)
            .setOngoing(false)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .build();
    this.mBuilder = mBuilder;
    createNotificationChannel();
    startForeground(NOTIFICATION_ID, mBuilder);

    return START_STICKY;
}

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = CHANNEL_ID;
        String description = CHANNEL_ID + "Description ";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

@Override
public void onDestroy() {
    stopForeground(false);
    //NotificationManagerCompat.from(this).notify(NOTIFICATION_ID, mBuilder);
    super.onDestroy();
} }

The activity, easily handle the button click event:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button startService = findViewById(R.id.startService);
    Button stopService = findViewById(R.id.stopService);
    Button stopNotification = findViewById(R.id.stopWithNotification);

    startService.setOnClickListener(this);
    stopService.setOnClickListener(this);
    stopNotification.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.startService:
            ContextCompat.startForegroundService(this, new Intent(this, AudioTestService.class));
            break;
        case R.id.stopService:
            finish();
            break;
        case R.id.stopWithNotification:
            stopService(new Intent(this, AudioTestService.class));
            break;
    }
}}

If you look at the Service's onDestroy() method I set

stopForeground(false);

instead of the method onTaskRemoved() that should remove the notification when the app is cleaned from the task list.

What am I doing wrong?

Please do not mark this as duplicated, I am looking for a solution for days...

like image 778
Jonathan I Avatar asked Oct 17 '22 10:10

Jonathan I


1 Answers

Instead of calling stopForeground(false); from onDestroy(), send a broadcast from activity (with action) for stop service. Change your onStartCommand code to check action in intent and do startForeground or stopForeground(false);

like image 185
VichitraVij Avatar answered Oct 27 '22 23:10

VichitraVij