Скрыть уведомление об обслуживании переднего плана, пока активность видна

Является ли это способом запуска службы в качестве службы переднего плана и скрыть уведомление во время видимости активности?

Считайте музыкальный плеер, в то время как приложение открыто, вам не требуется уведомление (например, кнопки), но всякий раз, когда музыкальный проигрыватель находится в фоновом режиме, уведомление должно быть показано.

Я знаю, как это сделать, если я НЕ запускаю свою службу на переднем плане... Но при запуске на переднем плане сама служба нуждается в уведомлении и показывает ее, и я не могу самостоятельно управлять уведомлением...

Как я могу решить эту проблему?

Ответ 1

Вы можете сделать это так. Одним из предварительных условий этого метода является то, что ваша активность должна связывать службу.

Сначала вы начинаете работу переднего плана.

private Notification mNotification;

public void onCreate() {
   ...
   startForeground(1, mNotification);
}

Затем в вашей деятельности вы связываете и отвязываете услугу, как показано ниже. BIND_ADJUST_WITH_ACTIVITY важно для поддержания работоспособности в течение времени, когда оно связано с видимой деятельностью.

public void onStart() {
    ...
    Intent intent = new Intent(this, PlayerService.class);
    bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}

public void onStop() {
    ...
    unbindService(mConnection);
}

Теперь вот последнее прошлое. Вы останавливаетесь на переднем плане, когда по крайней мере один клиент подключается к службе, и вы запускаете передний план, когда последний клиент отключается.

@Override
public void onRebind(Intent intent) {
    stopForeground(true); // <- remove notification
}

@Override
public IBinder onBind(Intent intent) {
    stopForeground(true); // <- remove notification
    return mBinder;
}

@Override
public boolean onUnbind(Intent intent) {
    startForeground(1, mNotification); // <- show notification again
    return true; // <- important to trigger future onRebind()
}

При привязке услуги вы должны учитывать правила, применяемые Android. Если вы связываете не запущенную службу, служба не запускается автоматически, если вы не укажете флаг BIND_AUTO_CREATE в дополнение к значку BIND_ADJUST_WITH_ACTIVITY.

    Intent intent = new Intent(this, PlayerService.class);
    bindService(intent, mConnection, BIND_AUTO_CREATE 
            | BIND_ADJUST_WITH_ACTIVITY);

Если служба была запущена с включенным флагом автоматического создания, а последний клиент отключается, служба автоматически остановится. Если вы хотите сохранить работу, вы должны запустить ее с помощью метода startService(). В принципе, ваш код будет выглядеть так, как показано ниже.

    Intent intent = new Intent(this, PlayerService.class);
    startService(intent);
    bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);

Вызов startService() для уже запущенного сервиса не влияет на него, так как мы не переопределяем метод onCommand().

Ответ 2

Используйте следующие шаги:

1.Используйте ActivityManager для получения текущего имени пакета (т.е. действия, выполняющегося сверху).

2. отметьте, если его приложение затем не отображает уведомления

3.else Если это не ваше приложение, тогда покажите уведомления.

ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                            List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1);
                            String topActivityName = tasks.get(0).topActivity.getPackageName();
                            if(!(topActivityName.equalsIgnoreCase("your package name"))){
 //enter notification code here
}