通知始终会创建新活动,而不是恢复先前的活动

时间:2018-09-09 23:58:11

标签: java android android-activity service notifications

我正在制作一个音乐应用,该应用在播放音频时显示通知。单击该通知时,将通过意图打开主要(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 :(得分:0)

尝试删除标志:Intent.FLAG_ACTIVITY_CLEAR_TOP 并添加下一个:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

答案 1 :(得分:0)

您可以使用launch modes进行活动。

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

singleTop:如果活动的一个实例已存在于目标任务的顶部,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。 / p>

答案 2 :(得分:0)

我已经解决了问题。我需要在媒体会话上调用setSessionActivity()方法,如下所示:

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

编辑:

您还可以通过简单地调用

来创建意图
setContentIntent(controller.getSessionActivity())

在调用setSessionActivity之后,其中控制器是您的MediaSessionController。