Уведомление всегда создает новую активность, а не возобновляет предыдущую деятельность - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю музыкальное приложение, которое отображает уведомление во время воспроизведения звука.При нажатии это уведомление открывает основное действие (UI) через намерение.

Хотя это должен быть довольно простой процесс, по какой-то причине, независимо от того, что я делаю, основное действие всегда уничтожается при нажатии уведомления,Я пробовал singleTop, singleTask (как флаги намерений и значения манифеста), сохраняя пакеты состояний экземпляров, onNewIntent, практически все, что близко к решению, которое я могу найти.Но деятельность ВСЕГДА уничтожена.Я могу получить намерение только через getIntent.

Основная активность: https://pastebin.com/32uuK33E

Аудио-сервис: https://pastebin.com/ShiUfBMc

Манифест: https://pastebin.com/kPp7RSYK


, поскольку "ссылки на pastebin должны сопровождаться кодом"

вот намерение (я пробовал каждую комбинацию соответствующих флагов, поэтому я действительно сомневаюсь, что проблема)

// creates an intent which opens the application when the notification is pressed
        private PendingIntent getPendingIntent(Context context) {
            Intent intent = getIntent(this);
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
            stackBuilder.addNextIntent(intent);
            return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        }

        // returns an intent which resumes the Main Activity and passes various song information
        private Intent getIntent(Context context) {
            int duration = player != null ? player.getDuration() : 0;
            boolean playing = player != null && player.isPlaying();

            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_SONG_INFO, getSongInfo());
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_POS, currentQueuePos);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_DURATION, duration);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_IS_PLAYING, playing);
            return intent;
        }

и вот где я пытаюсь прочитать данные

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.e(LOG_TAG, "flag got intent");
    String[] info = intent.getStringArrayExtra(MediaPlayerContract.INTENT_EXTRA_SONG_INFO);
    int pos = intent.getIntExtra(MediaPlayerContract.INTENT_EXTRA_POS, 0);
    int duration = intent.getIntExtra(MediaPlayerContract.INTENT_EXTRA_DURATION, 0);
    unpackageSongInfo(info);
    currentQueuePos = pos;
    seekBar.setMax(duration);
    setIntent(intent);
}

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать режимы запуска для действия.

<activity android:name=".MainActivity"
          android:launchMode="singleTop"

singleTop: Если экземпляр действия уже существует в верхней части целевой задачи, система направляет намерениек этому экземпляру посредством вызова его метода onNewIntent () вместо создания нового экземпляра действия.

0 голосов
/ 11 сентября 2018

Я решил проблему. Мне нужно было вызвать метод setSessionActivity () для моего мультимедийного сеанса, например:

Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, MediaPlayerContract.REQUEST_CODE,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
mediaSessionCompat.setSessionActivity(pendingIntent);

EDIT:

Вы также можете создать намерение, просто позвонив

setContentIntent(controller.getSessionActivity())

после вызова setSessionActivity, где контроллером является ваш MediaSessionController.

0 голосов
/ 10 сентября 2018

Попробуйте убрать флаг: Intent.FLAG_ACTIVITY_CLEAR_TOP и добавьте вместо этого следующий: Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

...