我正在制作一个音乐应用程序,在播放音频时显示通知。单击时,此通知将通过intent打开主(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);
}
尝试删除flag:Intent.FLAG_ACTIVITY_CLEAR_TOP
并添加下一个:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
您可以使用launch modes进行活动。
<activity android:name=".MainActivity"
android:launchMode="singleTop"
singleTop:如果活动的实例已存在于目标任务的顶部,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。
我已经解决了这个问题。我需要在媒体会话上调用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之后,其中controller是您的MediaSessionController。